何雪楓, 賈俊國(guó), 李旭玲
(1. 國(guó)網(wǎng)電力科學(xué)研究院有限公司, 江蘇 南京 211106; 2. 國(guó)網(wǎng)電動(dòng)汽車(chē)服務(wù)有限公司, 北京 100053)
隨著國(guó)家節(jié)能環(huán)保的號(hào)召,電動(dòng)汽車(chē)產(chǎn)業(yè)正在快速發(fā)展.而對(duì)于電動(dòng)汽車(chē)來(lái)說(shuō),能否正常有效的充電無(wú)疑是需要著重考慮的問(wèn)題.因此,針對(duì)電動(dòng)汽車(chē)充電過(guò)程的通信協(xié)議一致性測(cè)試便成為整個(gè)生產(chǎn)過(guò)程中的一個(gè)重要環(huán)節(jié)[1].一般情況下,通信協(xié)議規(guī)范是由文本語(yǔ)言記錄的,不同操作者對(duì)協(xié)議可能會(huì)有不一樣的認(rèn)識(shí),由此導(dǎo)致協(xié)議的實(shí)際完成會(huì)有多個(gè)版本.更有甚者,由于對(duì)協(xié)議的理解有誤,可能出現(xiàn)錯(cuò)誤實(shí)現(xiàn).本文研究的目的就是為了保持通信協(xié)議的實(shí)現(xiàn)與相應(yīng)的標(biāo)準(zhǔn)保持一致性,確保對(duì)標(biāo)準(zhǔn)協(xié)議的不同實(shí)現(xiàn)之間能夠保持一致并能正確通信.
本文針對(duì)現(xiàn)有經(jīng)驗(yàn)導(dǎo)向的一致性測(cè)試方法缺乏理論支撐,測(cè)試覆蓋性弱,可復(fù)用性較差的問(wèn)題,對(duì)面向充電機(jī)通信協(xié)議一致性測(cè)試的用例自動(dòng)生成方法展開(kāi)研究.
關(guān)于協(xié)議一致性測(cè)試的研究[2-3]一直是一個(gè)熱門(mén)的方向.現(xiàn)有的研究已經(jīng)涌現(xiàn)出一批典型的一致性測(cè)試用例生成方法[4].羅軍舟等[5]闡述了Petri網(wǎng)技術(shù)在協(xié)議描述中的優(yōu)勢(shì).宋金晶等[6]使用一種基于通信順序進(jìn)程的算法對(duì)網(wǎng)絡(luò)協(xié)議進(jìn)行仿真.公彥杰等[7]提出OPC-UA一致性自動(dòng)測(cè)試方法,包括構(gòu)建OPC-UA協(xié)議一致性測(cè)試用例的基本方法、測(cè)試用例運(yùn)行以及測(cè)試結(jié)果反饋等一系列方法,使用戶可以高效快速地構(gòu)建測(cè)試用例并實(shí)現(xiàn)協(xié)議一致性測(cè)試的自動(dòng)化.
有限狀態(tài)機(jī)(finite state machine,FSM)非常適用于對(duì)協(xié)議進(jìn)行建模,也是應(yīng)用最為廣泛的一種數(shù)學(xué)模型.因此,FSM模型常被用于測(cè)試序列生成算法.FSM由有限穩(wěn)定的狀態(tài)構(gòu)成,并能在已經(jīng)確定的狀態(tài)之間實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換,同時(shí)在轉(zhuǎn)換的過(guò)程中會(huì)產(chǎn)生一定的輸入輸出[8].有限狀態(tài)機(jī)作為用例測(cè)試集與協(xié)議之間關(guān)系的一種描述子,實(shí)現(xiàn)簡(jiǎn)單,同時(shí)方便同別的形式化描述子組合使用.因此,FSM十分適合對(duì)協(xié)議的狀態(tài)轉(zhuǎn)換關(guān)系進(jìn)行建模[9].
對(duì)于充電機(jī)與電池管理系統(tǒng)(battery management system,BMS)的通信協(xié)議一致性測(cè)試,劉武等[10]利用硬件板卡和LabVIEW軟件構(gòu)建了一種CAN通信平臺(tái),并在此平臺(tái)上模擬充電機(jī),通過(guò)監(jiān)測(cè)充電機(jī)與電池管理系統(tǒng)通信中的報(bào)文發(fā)送與接收情況來(lái)測(cè)試通信過(guò)程的出錯(cuò)狀況.李旭玲等[11]針對(duì)充電機(jī)監(jiān)控單元設(shè)計(jì)一套協(xié)議一致性測(cè)試系統(tǒng).黃炘等[12]針對(duì)電動(dòng)汽車(chē)無(wú)線充電通信協(xié)議設(shè)計(jì)了一種一致性測(cè)試框架.但是,上述方法中充電機(jī)和BMS之間的通信協(xié)議一致性測(cè)試主要是根據(jù)專家經(jīng)驗(yàn)來(lái)設(shè)計(jì)測(cè)試用例,沒(méi)有理論支撐,從而導(dǎo)致測(cè)試覆蓋性弱,測(cè)試結(jié)果缺乏說(shuō)服力,難以形成行業(yè)標(biāo)準(zhǔn).
因此,依據(jù)有限狀態(tài)機(jī)的優(yōu)勢(shì),本文面向充電機(jī)與BMS的通信過(guò)程設(shè)計(jì)一種基于有限狀態(tài)機(jī)的協(xié)議一致性測(cè)試方法用于解決上述問(wèn)題.首先,通過(guò)對(duì)GB/T 27930—2015協(xié)議的詳細(xì)解讀,分析充電機(jī)和BMS之間的消息交流過(guò)程.其次,使用FSM形式化語(yǔ)言描述充電機(jī)和BMS之間的充電過(guò)程,用以保證協(xié)議的不同實(shí)體之間的通信一致性.最后,在FSM的基礎(chǔ)上完成充電機(jī)活動(dòng)過(guò)程中測(cè)試序列以及測(cè)試用例的獲取.
使用FSM進(jìn)行測(cè)試序列生成的算法有很多種,在這么多種算法中基于唯一輸入/輸出序列(unique input/output,UIO)的U方法是最常用的[13],此方法實(shí)現(xiàn)起來(lái)較為容易,同時(shí)能夠得到簡(jiǎn)練的測(cè)試序列.因此,本文在FSM的基礎(chǔ)上使用UIO方法計(jì)算測(cè)試序列,并采用遞歸算法考慮前置用例,讓每一個(gè)測(cè)試用例都有完整的輸入輸出,從而得到最終的測(cè)試用例集合.
有限狀態(tài)機(jī)是一種典型的形式化模型方法.在眾多的形式化描述方法中,FSM方法憑借其簡(jiǎn)單靈活的特性被研究者們廣泛使用,出現(xiàn)了很多諸如擴(kuò)展有限狀態(tài)機(jī)等的FSM衍生方法.例如,Mauricio等[14]使用了擴(kuò)展有限狀態(tài)機(jī)結(jié)合UML模型來(lái)完成測(cè)試用例的自動(dòng)生成.
而關(guān)于使用有限狀態(tài)機(jī)進(jìn)行測(cè)試用例生成最早可以追溯到65年前Moore關(guān)于自動(dòng)機(jī)的研究,之后開(kāi)展的一些研究只在理論層面進(jìn)行分析.到了最近幾年,使用FSM進(jìn)行測(cè)試用例計(jì)算的研究開(kāi)始被轉(zhuǎn)向應(yīng)用到真實(shí)的工作場(chǎng)景中.由于有限自動(dòng)機(jī)中的Mealy機(jī)定義和通信協(xié)議的內(nèi)容比較吻合,因此Mealy機(jī)十分適合對(duì)通信協(xié)議進(jìn)行建模,并執(zhí)行一致性測(cè)試.下面給出Mealy機(jī)的定義:
使用一個(gè)五元組來(lái)表示M=(S,I,O,δ,λ),其中:M代表Mealy有限自動(dòng)機(jī)的符號(hào);S代表FSM中所有狀態(tài)的集合{s0,s1,s2,…,sn},s0代表初始狀態(tài);I代表FSM中所有輸入的集合{i1,i2,…,in},允許輸入為空,記作“—”;O代表FSM中所有輸出的集合{o1,o2,…,on},允許輸出為空,記作“—”;δ為狀態(tài)轉(zhuǎn)移函數(shù),如S×I→S’,表示狀態(tài)S在輸入I的情況下轉(zhuǎn)移到狀態(tài)S’;λ為輸出函數(shù),如S×I→O,表示狀態(tài)S在輸入I的情況下輸出結(jié)果O.
當(dāng)有限狀態(tài)機(jī)處于狀態(tài)s時(shí),若此時(shí)狀態(tài)s的輸入為i∈I,那么由狀態(tài)s進(jìn)入的下一個(gè)狀態(tài)由δ(s,i)得到,同時(shí)得到輸出λ(s,i).圖1是一個(gè)FSM的狀態(tài)轉(zhuǎn)移圖,該FSM具有4個(gè)狀態(tài){s0,s1,s2,s3},兩種輸入{i1,i2},三種輸出{o1,o2,o3}.同時(shí)此圖也是一個(gè)有向圖,有向圖中的頂點(diǎn)和邊分別對(duì)應(yīng)表示FSM中的各個(gè)狀態(tài)以及狀態(tài)間的轉(zhuǎn)移.
圖1 有限狀態(tài)機(jī)示意圖Fig.1 Schematic diagram of finite state machine
基于FSM模型的測(cè)試用例生成包括3個(gè)步驟:
1) 根據(jù)整個(gè)待測(cè)試的系統(tǒng)行為建立相關(guān)的FSM模型;
2) 根據(jù)某個(gè)測(cè)試意圖或者測(cè)試覆蓋準(zhǔn)則遍歷FSM模型,獲得一組測(cè)試路徑;
3) 將路徑集合轉(zhuǎn)成有效的測(cè)試輸入和預(yù)期的輸出效果.
在充電機(jī)與BMS間通信一致性測(cè)試的場(chǎng)景中,待測(cè)試的對(duì)象為充電機(jī)與BMS間的通信系統(tǒng),系統(tǒng)行為在充電的時(shí)序流程中具體體現(xiàn).因此,在構(gòu)建表達(dá)充電機(jī)狀態(tài)的FSM之前,需要先根據(jù)充電的時(shí)序流程梳理出整個(gè)充電過(guò)程中BMS和充電機(jī)通信中的各種狀態(tài).
依據(jù)GB/T 27930中的充電時(shí)序流程,整個(gè)充電時(shí)序可以劃分為5個(gè)階段.這5個(gè)階段依次為握手啟動(dòng)、握手辨識(shí)、充電參數(shù)配置、充電階段和充電結(jié)束階段.
此外,將錯(cuò)誤報(bào)文歸為報(bào)錯(cuò)階段.如要構(gòu)建充電機(jī)的FSM模型,必將充電機(jī)在每個(gè)階段中的狀態(tài)提取出來(lái),根據(jù)協(xié)議的內(nèi)容表示出不同狀態(tài)之間轉(zhuǎn)換的輸入輸出.在圖2中,本文分別針對(duì)充電時(shí)序中的5個(gè)階段和報(bào)錯(cuò)階段提取充電機(jī)狀態(tài)以及狀態(tài)間的轉(zhuǎn)化信息.最后,逐步構(gòu)造完整的FSM圖,如圖3所示,圖中狀態(tài)之間轉(zhuǎn)換的邊用L表示.其中各個(gè)狀態(tài)(s0~s10)和各個(gè)狀態(tài)之間轉(zhuǎn)換的邊(L1~L42)的物理意義在表1和表2中進(jìn)行了說(shuō)明.
表1 FSM有向圖中的轉(zhuǎn)換邊說(shuō)明
表2 FSM有向圖中的狀態(tài)說(shuō)明
圖2 充電機(jī)與BMS交互狀態(tài)圖
圖3 完整充電機(jī)狀態(tài)FSM圖
在生成完整的充電機(jī)FSM圖的基礎(chǔ)上,利用UIO方法生成測(cè)試子序列.使用UIO方法可以實(shí)現(xiàn)對(duì)每個(gè)狀態(tài)的唯一標(biāo)識(shí).根據(jù)UIO序列可以判斷是否達(dá)到了某種狀態(tài),或者說(shuō)UIO序列可以幫助判斷是否從一種狀態(tài)成功轉(zhuǎn)換到了另一種狀態(tài).
對(duì)于任何一個(gè)狀態(tài)si,構(gòu)建其UIO序列的方法是:
1) 對(duì)所有的狀態(tài)以及狀態(tài)之間的輸入輸出建立映射關(guān)系;
2) 找出針對(duì)某一狀態(tài)所有長(zhǎng)度為1的輸入輸出序列;
3) 若這些長(zhǎng)度為1的序列是唯一的,則選擇一個(gè)唯一序列作為當(dāng)前狀態(tài)的UIO序列;
4) 若這些長(zhǎng)度為1的序列中沒(méi)有唯一的情況,則考慮序列長(zhǎng)度加一的情況,執(zhí)行下一步;
5) 在長(zhǎng)度為K的輸入輸出序列的基礎(chǔ)上求出長(zhǎng)度為K+1的序列,判斷求出的序列是否唯一,直到找出一個(gè)唯一序列作為該狀態(tài)的UIO序列.
在得到每個(gè)狀態(tài)的UIO序列之后,則可以為每個(gè)狀態(tài)轉(zhuǎn)換(si,sj;L)求出它們所相關(guān)的測(cè)試子序列.(si,sj;L)的測(cè)試子序列可以表示為
e(si,sj,sl;L)={L,UIO(sj)}
其中:si代表開(kāi)始狀態(tài);sj代表si經(jīng)過(guò)L轉(zhuǎn)移后的狀態(tài);sl代表經(jīng)歷過(guò)序列UIO(sj)之后的終止?fàn)顟B(tài),同時(shí)也是測(cè)試子序列的終止?fàn)顟B(tài).
在計(jì)算不同狀態(tài)之間的測(cè)試子序列時(shí),需要考慮不同的路徑.即在求狀態(tài)si到狀態(tài)sj的測(cè)試子序列時(shí),如果從si到狀態(tài)sj的路徑有n條,最后求出的測(cè)試子序列就會(huì)有n條.但是,得到的這些測(cè)試子序列在功能上會(huì)存在一些冗余.如果一個(gè)正常狀態(tài)轉(zhuǎn)移到自身的條件是在不超時(shí)的情況下,沒(méi)有輸入或輸入不正確,那么對(duì)這種狀態(tài)轉(zhuǎn)移的測(cè)試就會(huì)暗含在該狀態(tài)轉(zhuǎn)移到超時(shí)狀態(tài)當(dāng)中.因此,可以利用這一特點(diǎn)消除測(cè)試子序列的冗余得到最終的測(cè)試子序列.
在生成全部測(cè)試子序列之后,便可以根據(jù)這些序列來(lái)生成測(cè)試用例集.但是需要考慮的問(wèn)題是,測(cè)試子序列測(cè)試的是其起始狀態(tài)向其他狀態(tài)轉(zhuǎn)移的情況,而不關(guān)心如何到達(dá)起始的狀態(tài),因此,還需要為每一個(gè)狀態(tài)設(shè)置一個(gè)引導(dǎo)序列.測(cè)試子序列包括了所有的狀態(tài)轉(zhuǎn)換情況,要求引導(dǎo)序列能夠到達(dá)FSM中的每一個(gè)狀態(tài).和深度優(yōu)先相比,廣度優(yōu)先遍歷FSM更容易覆蓋到每一個(gè)狀態(tài),因此采用廣度優(yōu)先的方式生成引導(dǎo)序列.具體算法如下:
算法1:引導(dǎo)序列生成算法
輸入:有限狀態(tài)機(jī)Ms
輸出:任意狀態(tài)si對(duì)應(yīng)的引導(dǎo)序列Gi
(1) 確定狀態(tài)機(jī)Ms的初始狀態(tài)s0;
(2) 從s0開(kāi)始,對(duì)Ms進(jìn)行廣度優(yōu)先遍歷;
(3) if(某個(gè)狀態(tài)si已經(jīng)被訪問(wèn)) {
跳過(guò)狀態(tài)si;
繼續(xù)遍歷狀態(tài)si+1;
}
(4) 構(gòu)造一棵無(wú)重復(fù)狀態(tài)的廣度優(yōu)先生成樹(shù);
(5) 輸出從樹(shù)中根節(jié)點(diǎn)s0出發(fā)到達(dá)任意節(jié)點(diǎn)si的路徑作為引導(dǎo)序列Gi.
根據(jù)前面的內(nèi)容,可以得到全部的測(cè)試子序列和引導(dǎo)序列,將引導(dǎo)序列和測(cè)試子序列結(jié)合即得到完整的測(cè)試序列.具體的做法是,對(duì)于每一個(gè)測(cè)試子序列,在其前面加上起始狀態(tài)對(duì)應(yīng)的引導(dǎo)序列即可.在得到完整的測(cè)試序列之前,可以發(fā)現(xiàn)邊與邊之間存在暗含關(guān)系,比如接收?qǐng)?bào)文超時(shí)的邊其實(shí)暗含了不接受任何報(bào)文自旋的過(guò)程,因此可進(jìn)一步消除冗余測(cè)試序列.根據(jù)每個(gè)測(cè)試序列生成測(cè)試用例時(shí),需要對(duì)每一條邊的內(nèi)容進(jìn)行考慮,設(shè)計(jì)相應(yīng)的測(cè)試用例,若其他測(cè)試用例已經(jīng)完成了針對(duì)這些邊的測(cè)試,就可以將這些邊作為前置條件.
對(duì)于測(cè)試序列的覆蓋率,本文主要考慮了狀態(tài)覆蓋和遷移覆蓋.狀態(tài)覆蓋指的是最終生成的測(cè)試序列集合至少需要完全覆蓋一次有限狀態(tài)機(jī)中的所有狀態(tài).遷移覆蓋指的是最終生成的測(cè)試序列集合至少完全覆蓋一次有限狀態(tài)機(jī)中所有的輸入集合,也即是至少覆蓋一次狀態(tài)機(jī)中所有的邊.
由于通過(guò)UIO法生成測(cè)試子序列時(shí)生成的是每個(gè)狀態(tài)和其他狀態(tài)進(jìn)行轉(zhuǎn)換時(shí)的測(cè)試子序列,所以最終包含所有測(cè)試子序列的測(cè)試序列一定滿足狀態(tài)覆蓋,即最終的測(cè)試序列一定包含了所有狀態(tài).
同時(shí),將最終測(cè)試序列中所有的邊與FSM中的邊進(jìn)行對(duì)比,可以發(fā)現(xiàn)測(cè)試序列覆蓋了FSM中的所有邊,因此最終生成的測(cè)試序列一定滿足遷移覆蓋.
和傳統(tǒng)的根據(jù)狀態(tài)覆蓋和遷移覆蓋生成測(cè)試序列的方法相比,通過(guò)UIO法生成的測(cè)試序列還可以檢測(cè)狀態(tài)與狀態(tài)之間轉(zhuǎn)換時(shí)可能出現(xiàn)的錯(cuò)誤,且同時(shí)滿足狀態(tài)覆蓋和遷移覆蓋,是一種準(zhǔn)確性較高的方法.
基于FSM和測(cè)試序列生成的測(cè)試用例,本質(zhì)上是一組輸入輸出集合,但是由于充電通信協(xié)議中報(bào)文內(nèi)容較長(zhǎng),在每一個(gè)測(cè)試用例中難以將所有的輸入輸出進(jìn)行表達(dá),因此本文選擇的方式是只對(duì)最后一組輸入輸出做具體的說(shuō)明,最后一組之前的輸入輸出可以作為前置條件,但是前置條件必須要包含在已有的測(cè)試用例中.針對(duì)每個(gè)測(cè)試序列產(chǎn)生測(cè)試用例,設(shè)計(jì)如下算法:
1) 對(duì)任意測(cè)試序列Ti,如果其長(zhǎng)度為1,則產(chǎn)生一條測(cè)試用例;
2) 如果其長(zhǎng)度為n(n>1),則需判斷已有測(cè)試用例中是否有前面長(zhǎng)度為n-1測(cè)試子序列的測(cè)試用例,如果有,則將該測(cè)試用例作為測(cè)試前置條件,針對(duì)最后一組邊設(shè)計(jì)測(cè)試用例.如果沒(méi)有,則針對(duì)前n-1條邊組成的序列生成測(cè)試用例.
該種算法是一種采用遞歸思想的算法,通過(guò)該算法生成測(cè)試用例的具體方法如下:
針對(duì)T1=G1,e3={L1,L4,L5}這個(gè)測(cè)試序列,首先判斷是否存在測(cè)試路徑為L(zhǎng)1、L4的測(cè)試序列,可以發(fā)現(xiàn)沒(méi)有,因此,需要提前計(jì)算L1、L4的測(cè)試用例.要計(jì)算L1、L4的測(cè)試用例,首先判斷有沒(méi)有測(cè)試路徑為L(zhǎng)1的測(cè)試用例,可以發(fā)現(xiàn)也沒(méi)有,因此,要首先計(jì)算路徑為L(zhǎng)1的測(cè)試用例.在生成測(cè)試用例時(shí),用例的編號(hào)是由測(cè)試序列T1-T23決定的,測(cè)試具體操作和預(yù)期結(jié)果分別指的是FSM圖中邊上代表的輸入輸出.
有了測(cè)試用例T1-1之后,便可以生成測(cè)試子路徑L1、L4的測(cè)試用例,具體測(cè)試用例如表3所列.
表3 測(cè)試用例
有了L1、L4這個(gè)測(cè)試子序列的測(cè)試用例之后,便可以生成針對(duì)測(cè)試序列T1={L1,L4,L5}的測(cè)試用例了,具體的測(cè)試用例內(nèi)容見(jiàn)表3.
上面得到的測(cè)試用例便是根據(jù)測(cè)試序列T1=G1,e3={L1,L4,L5}得到的測(cè)試用例.
現(xiàn)有的測(cè)試充電機(jī)和BMS之間通信一致性的方法大多數(shù)是根據(jù)專家經(jīng)驗(yàn)產(chǎn)生測(cè)試用例集,這種方法過(guò)于依賴經(jīng)驗(yàn),沒(méi)有理論支撐,導(dǎo)致測(cè)試覆蓋性弱,測(cè)試結(jié)果沒(méi)有說(shuō)服力,而且通信協(xié)議的內(nèi)容迭代更新較快,傳統(tǒng)方法的復(fù)用能力也較弱.
本文根據(jù)GB/T 27930—2015協(xié)議,詳細(xì)分析充電機(jī)和BMS之間的通信過(guò)程,提出了一種基于FSM的充電機(jī)和BMS之間的通信一致性測(cè)試方法.該方法主要的創(chuàng)新和貢獻(xiàn)有以下幾點(diǎn):
1) 使用FSM形式化描述充電機(jī)和BMS之間的充電過(guò)程,讓不同的讀者在理解27930協(xié)議時(shí)不會(huì)產(chǎn)生分歧,保證協(xié)議的不同實(shí)體之間的通信一致性.
2) 在FSM的基礎(chǔ)之上使用UIO方法來(lái)生成測(cè)試序列并得到最終的測(cè)試用例集,這種測(cè)試方法不僅有理論支撐而且復(fù)用能力強(qiáng).
3) 根據(jù)測(cè)試序列生成測(cè)試用例時(shí),采用相應(yīng)算法可以讓每一個(gè)測(cè)試用例都有完整的輸入輸出,前置用例也被考慮在內(nèi).因此,本文所提的基于FSM的充電機(jī)和BMS通信一致性測(cè)試用例生成方法有著廣泛的應(yīng)用前景.