陳 建,沈亞峰,張 誼
(中國(guó)工程物理研究院 計(jì)算機(jī)應(yīng)用研究所,四川 綿陽(yáng) 621900)
隨著電子技術(shù)的發(fā)展,嵌入式軟件規(guī)模越來(lái)越大,復(fù)雜度也越來(lái)越高,軟件質(zhì)量要求也不斷提高,嵌入式軟件的自動(dòng)化測(cè)試[1,2]以其提高測(cè)試效率、保障測(cè)試質(zhì)量等優(yōu)點(diǎn)越來(lái)越受到關(guān)注。但隨著嵌入式軟件處理能力的增加,其接口類(lèi)型更多、結(jié)構(gòu)更復(fù)雜,主要體現(xiàn)在業(yè)務(wù)邏輯與接口數(shù)據(jù)方面,且不同類(lèi)型的嵌入式軟件接口存在較大差異性,造成測(cè)試數(shù)據(jù)難以統(tǒng)一,為確保測(cè)試充分性需構(gòu)造大量、復(fù)雜的測(cè)試數(shù)據(jù)進(jìn)行測(cè)試,為此針對(duì)嵌入式軟件測(cè)試能夠?qū)崿F(xiàn)測(cè)試數(shù)據(jù)快速生成與輸入的自動(dòng)化測(cè)試框架顯得更為重要。
嵌入式軟件的輸入數(shù)據(jù)類(lèi)型眾多,包括數(shù)字信號(hào)、模擬信號(hào)以及CAN、UART、LAN等總線數(shù)據(jù),測(cè)試時(shí)需對(duì)多種激勵(lì)信號(hào)進(jìn)行輸入,另外在強(qiáng)流程嵌入式軟件中,其輸入信號(hào)之間具有嚴(yán)格的時(shí)序要求,通常為毫秒級(jí),測(cè)試數(shù)據(jù)的輸入時(shí)序控制也成為嵌入式軟件測(cè)試過(guò)程中的重點(diǎn)與難點(diǎn)。目前成熟的嵌入式軟件的自動(dòng)化測(cè)試框架如CRESTS、AUTOTEST、GESTE[3]等在使用過(guò)程中均需編寫(xiě)復(fù)雜的測(cè)試腳本以實(shí)現(xiàn)測(cè)試數(shù)據(jù)的輸入,使用門(mén)檻較高,測(cè)試環(huán)境搭建周期較長(zhǎng),不利于快速測(cè)試,為此本文主要對(duì)嵌入式軟件測(cè)試框架進(jìn)行研究,設(shè)計(jì)一款輕量級(jí)嵌入式軟件自動(dòng)化測(cè)試框架以實(shí)現(xiàn)測(cè)試數(shù)據(jù)的快速生成與輸入,提高測(cè)試效率。
目前,針對(duì)嵌入式軟件的測(cè)試框架可分為手工測(cè)試框架和腳本驅(qū)動(dòng)測(cè)試框架。
手工測(cè)試框架:手工測(cè)試框架主要采用手動(dòng)輸入的方式將測(cè)試數(shù)據(jù)填寫(xiě)到測(cè)試工具中,再利用工具輸入到被測(cè)軟件(如:NetAssist、UartAssist等),測(cè)試數(shù)據(jù)的輸入具有單一性與無(wú)序性,需要輸入不同數(shù)據(jù)時(shí)則需要重新填寫(xiě)數(shù)據(jù),在數(shù)據(jù)量比較大時(shí),需要花費(fèi)大量時(shí)間,另外輸入的時(shí)序無(wú)法保證,無(wú)法用于具有時(shí)序要求的嵌入式軟件測(cè)試。
腳本驅(qū)動(dòng)測(cè)試框架:腳本驅(qū)動(dòng)測(cè)試框架可分為線性腳本、結(jié)構(gòu)化腳本、共享腳本、數(shù)據(jù)驅(qū)動(dòng)腳本、關(guān)鍵字驅(qū)動(dòng)腳本以及混合驅(qū)動(dòng)腳本[4,5]。
(1)線性腳本:線性腳本是通過(guò)測(cè)試工具錄制測(cè)試人員操作被測(cè)對(duì)象的測(cè)試動(dòng)作、輸入數(shù)據(jù),并記錄在腳本文件中。該腳本一般采用特定的語(yǔ)言記錄測(cè)試動(dòng)作序列,腳本可進(jìn)行回放,線性腳本的優(yōu)點(diǎn)是簡(jiǎn)單,通過(guò)錄制即可實(shí)現(xiàn),無(wú)須編寫(xiě)代碼,缺點(diǎn)是僅適用于當(dāng)前被測(cè)軟件,不能共享與重用,可維護(hù)性差,僅適用于部分功能。
(2)結(jié)構(gòu)化腳本:結(jié)構(gòu)化腳本是對(duì)線性腳本的優(yōu)化,支持通過(guò)編程指令控制腳本執(zhí)行,腳本具有邏輯判斷能力,根據(jù)指令判斷腳本執(zhí)行順序,相對(duì)線性腳本在一定程度上靈活性、健壯性得到改善,并可用于重復(fù)性的自動(dòng)化測(cè)試,如Python[6]、ATLAS[7]、TTCN[8]、RASL[9]等腳本語(yǔ)言,但結(jié)構(gòu)化腳本將邏輯指令與測(cè)試數(shù)據(jù)融合,當(dāng)測(cè)試數(shù)據(jù)需要更新時(shí)需重新編寫(xiě)測(cè)試腳本,測(cè)試腳本的開(kāi)發(fā)工作量大幅度增加,另外測(cè)試場(chǎng)景越復(fù)雜,腳本編寫(xiě)難點(diǎn)越高,維護(hù)代價(jià)越大,不利用測(cè)試工具的普及與應(yīng)用。
(3)共享腳本:共享腳本在結(jié)構(gòu)化腳本的基礎(chǔ)上對(duì)腳本進(jìn)行完善,使腳本可復(fù)用,節(jié)省了軟件測(cè)試的時(shí)間,但測(cè)試數(shù)據(jù)仍未從腳本中進(jìn)行分離,當(dāng)多個(gè)測(cè)試用例需要復(fù)用同一測(cè)試腳本時(shí),腳本開(kāi)發(fā)、維護(hù)工作增加。
(4)數(shù)據(jù)驅(qū)動(dòng)腳本:數(shù)據(jù)驅(qū)動(dòng)測(cè)試將測(cè)試輸入存儲(chǔ)在獨(dú)立的數(shù)據(jù)文件而不是與測(cè)試腳本緊耦合。腳本中只存放控制信息,執(zhí)行測(cè)試時(shí)從外部數(shù)據(jù)文件中讀取測(cè)試數(shù)據(jù),一個(gè)測(cè)試腳本可以運(yùn)行不同的測(cè)試,避免腳本驅(qū)動(dòng)測(cè)試頻繁修改測(cè)試腳本的不足。數(shù)據(jù)文件單獨(dú)存儲(chǔ)且可讀性、可維護(hù)性高,數(shù)據(jù)與腳本的分離減少測(cè)試腳本的維護(hù)成本,提升測(cè)試效率[5],但數(shù)據(jù)驅(qū)動(dòng)腳本測(cè)試框架最大限制是數(shù)據(jù)格式單一、固定,無(wú)法適應(yīng)數(shù)據(jù)動(dòng)態(tài)變化的情況。
(5)關(guān)鍵字驅(qū)動(dòng)腳本:關(guān)鍵字驅(qū)動(dòng)腳本在采用數(shù)據(jù)文件描述測(cè)試用例的同時(shí),通過(guò)一系列關(guān)鍵字描述測(cè)試任務(wù),同樣實(shí)現(xiàn)了測(cè)試腳本與測(cè)試數(shù)據(jù)的分離,但僅通過(guò)關(guān)鍵字驅(qū)動(dòng)會(huì)隨著軟件復(fù)雜度增加而增加大量關(guān)鍵字,構(gòu)建成本較大。
(6)混合驅(qū)動(dòng)腳本:采用多種腳本技術(shù)協(xié)同使用,可以有效避免單一腳本帶來(lái)的局限性,彌補(bǔ)單一腳本的不足。
根據(jù)以上分析,數(shù)據(jù)驅(qū)動(dòng)與關(guān)鍵字驅(qū)動(dòng)腳本測(cè)試框架均實(shí)現(xiàn)了數(shù)據(jù)與腳本的分離,僅通過(guò)構(gòu)建測(cè)試數(shù)據(jù)即可實(shí)現(xiàn)不同測(cè)試數(shù)據(jù)的輸入,無(wú)需重復(fù)編寫(xiě)測(cè)試腳本,提升了腳本的復(fù)用性、維護(hù)性,國(guó)內(nèi)外基于該技術(shù)也做了很多研究[10-15]。
文獻(xiàn)[11]采用基于模型思想,提出一種字符型驅(qū)動(dòng)形式化描述通用方法,建立基于時(shí)間的PWM驅(qū)動(dòng)模型實(shí)現(xiàn)嵌入式軟件接口驅(qū)動(dòng)的分析與驗(yàn)證,但該方法僅能用于單一的接口驗(yàn)證,無(wú)法用于軟件的業(yè)務(wù)流程的測(cè)試。文獻(xiàn)[12]將BDD的思想應(yīng)用于數(shù)據(jù)驅(qū)動(dòng)的測(cè)試中,使用通用的自然語(yǔ)言描述測(cè)試用例,該思想注重從用戶的角度進(jìn)行測(cè)試,針對(duì)復(fù)雜的測(cè)試場(chǎng)景,其測(cè)試場(chǎng)景與步驟的描述顯得比較繁瑣,需花費(fèi)大量時(shí)間。文獻(xiàn)[13]采用數(shù)據(jù)驅(qū)動(dòng)方式實(shí)現(xiàn)網(wǎng)口的自動(dòng)化測(cè)試,通過(guò)數(shù)據(jù)文件實(shí)現(xiàn)測(cè)試數(shù)據(jù)的注入,但當(dāng)被測(cè)對(duì)象輸入數(shù)據(jù)動(dòng)態(tài)變化時(shí)無(wú)法自適應(yīng)輸入且不支持其它接口。文獻(xiàn)[14]與文獻(xiàn)[15]采用數(shù)據(jù)驅(qū)動(dòng)思想實(shí)現(xiàn)了自動(dòng)化測(cè)試框架,可通過(guò)文件快速構(gòu)建測(cè)試數(shù)據(jù),實(shí)現(xiàn)測(cè)試數(shù)據(jù)的自動(dòng)化注入,提高測(cè)試效率,但該框架僅對(duì)Web軟件數(shù)據(jù)進(jìn)行分析,構(gòu)建數(shù)據(jù)模型實(shí)現(xiàn)Web軟件自動(dòng)化測(cè)試,無(wú)法用于嵌入式軟件的強(qiáng)時(shí)序復(fù)雜接口數(shù)據(jù)的注入。
綜上分析,本文介紹了一種將數(shù)據(jù)驅(qū)動(dòng)與關(guān)鍵字驅(qū)動(dòng)相結(jié)合的混合腳本測(cè)試框架,在該框架下即可實(shí)現(xiàn)嵌入式軟件測(cè)試數(shù)據(jù)按照前置條件、時(shí)序快速主動(dòng)與被動(dòng)輸入,也可利用關(guān)鍵字實(shí)現(xiàn)測(cè)試數(shù)據(jù)的動(dòng)態(tài)自動(dòng)生成??蚣茉O(shè)計(jì)主要存在以下難點(diǎn):①測(cè)試數(shù)據(jù)復(fù)雜多樣性;②測(cè)試數(shù)據(jù)動(dòng)態(tài)自適應(yīng)。
搭建嵌入式軟件自動(dòng)化測(cè)試框架的重點(diǎn)是要快速構(gòu)建該嵌入式軟件的數(shù)據(jù)流程以及行為參數(shù)[16]。隨著嵌入式處理器復(fù)雜與多樣化,嵌入式軟件需要的測(cè)試數(shù)據(jù)也越來(lái)越復(fù)雜,為滿足不同嵌入式軟件的測(cè)試,采用數(shù)據(jù)驅(qū)動(dòng)的思想構(gòu)建統(tǒng)一的數(shù)據(jù)模型表達(dá)測(cè)試數(shù)據(jù),以實(shí)現(xiàn)數(shù)據(jù)的快速輸入。
另外,根據(jù)被測(cè)軟件業(yè)務(wù)要求存在動(dòng)態(tài)變化的測(cè)試數(shù)據(jù),如握手?jǐn)?shù)據(jù)、連續(xù)數(shù)據(jù)、離散數(shù)據(jù)等,為確保對(duì)測(cè)試數(shù)據(jù)的自適應(yīng),采用關(guān)鍵字驅(qū)動(dòng)的思想構(gòu)建關(guān)鍵字模型以表征動(dòng)態(tài)數(shù)據(jù),用于實(shí)現(xiàn)測(cè)試數(shù)據(jù)自動(dòng)生成。
最后對(duì)測(cè)試框架進(jìn)行設(shè)計(jì)與實(shí)現(xiàn),并通過(guò)實(shí)例對(duì)框架的功能、性能進(jìn)行驗(yàn)證與分析。
基于數(shù)據(jù)與關(guān)鍵字驅(qū)動(dòng)的測(cè)試框架是通過(guò)數(shù)據(jù)文件讀取輸入的測(cè)試數(shù)據(jù)與關(guān)鍵字,然后傳入測(cè)試腳本中,由測(cè)試平臺(tái)調(diào)用測(cè)試腳本解析測(cè)試數(shù)據(jù)并按照時(shí)序向被測(cè)對(duì)象輸入測(cè)試數(shù)據(jù)。為確保測(cè)試輸入的高效與統(tǒng)一需建立通用的數(shù)據(jù)模型對(duì)測(cè)試數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述。測(cè)試數(shù)據(jù)模型是抽象出來(lái)獨(dú)立于測(cè)試平臺(tái)的測(cè)試數(shù)據(jù),存儲(chǔ)于結(jié)構(gòu)化的文件中,通過(guò)標(biāo)簽屬性,獲取這些文件中符合條件的指令和配置數(shù)據(jù)。本文介紹的數(shù)據(jù)與關(guān)鍵字驅(qū)動(dòng)測(cè)試框架的數(shù)據(jù)模型包含數(shù)據(jù)驅(qū)動(dòng)模型與關(guān)鍵字驅(qū)動(dòng)模型。
通過(guò)對(duì)嵌入式軟件輸入數(shù)據(jù)的規(guī)則與要素進(jìn)行分析,構(gòu)建通用輸入數(shù)據(jù)模型。
定義1 輸入數(shù)據(jù)模型 (SD):SD=
Port:表示數(shù)據(jù)輸入的端口類(lèi)型,包括:LAN、CAN、UART、1553B等;
Ts:表示數(shù)據(jù)輸入的延時(shí)時(shí)間,用于控制數(shù)據(jù)輸入時(shí)序;
R:表示數(shù)據(jù)輸入的次數(shù),用于表示單次數(shù)據(jù)、周期數(shù)據(jù);
Tc:表示數(shù)據(jù)輸入間隔時(shí)間;
Prot:表示數(shù)據(jù)協(xié)議要求,根據(jù)數(shù)據(jù)源的不同分別按照對(duì)應(yīng)的數(shù)據(jù)協(xié)議要求進(jìn)行設(shè)置,如LAN則表示數(shù)據(jù)輸入的IP地址與端口號(hào),CAN則表示數(shù)據(jù)類(lèi)型、幀ID等;
Data:表示待輸入的數(shù)據(jù)信息,包含固定數(shù)據(jù)(FD)與關(guān)鍵字?jǐn)?shù)據(jù)(KD)。
根據(jù)輸入數(shù)據(jù)是否存在前置條件可分為主動(dòng)輸入數(shù)據(jù)與被動(dòng)輸入數(shù)據(jù)。
主動(dòng)輸入數(shù)據(jù):主動(dòng)輸入數(shù)據(jù)即測(cè)試平臺(tái)通過(guò)測(cè)試腳本解析數(shù)據(jù)文件后,可在任意時(shí)刻按照設(shè)定的時(shí)序要求向被測(cè)對(duì)象直接輸入的數(shù)據(jù),不考慮其前置條件。主動(dòng)輸入數(shù)據(jù)(ADChain)是由一系列SD按照時(shí)序關(guān)系組成的有序集合 {SD1,SD2,…,SDn},針對(duì)任意i(1≤i≤n),SDi與SDi+1之間均具有相繼發(fā)送的時(shí)序關(guān)系,通過(guò)若干個(gè)SD的有序發(fā)送即可表達(dá)被測(cè)對(duì)象的主動(dòng)輸入行為。
被動(dòng)輸入數(shù)據(jù):被動(dòng)輸入數(shù)據(jù)即在滿足特定的前置條件后才向被測(cè)對(duì)象輸入的測(cè)試數(shù)據(jù),針對(duì)嵌入式軟件其前置條件一般為輸出條件。
定義2 前置條件(PC):PC=
定義3 響應(yīng)數(shù)據(jù)(RD):RD={SD1,SD2,…,SDn},一個(gè)響應(yīng)數(shù)據(jù)是由多個(gè)輸入數(shù)據(jù)構(gòu)成的集合,根據(jù)前置條件觸發(fā)的次數(shù)依次進(jìn)行輸入。
單條被動(dòng)數(shù)據(jù)由一個(gè)前置條件與若干個(gè)響應(yīng)數(shù)據(jù)組成,若干條被動(dòng)數(shù)據(jù)的集合則構(gòu)成整個(gè)被動(dòng)輸入數(shù)據(jù)(PDChain),即PDChain={{PC1,RD11,RD12,…,RD1m},…,{PCn,RDn1,RDn2,…,RDnm}},其中n為被動(dòng)數(shù)據(jù)條數(shù),m為響應(yīng)個(gè)數(shù)。當(dāng)獲取到被測(cè)對(duì)象輸出數(shù)據(jù)后,對(duì)PC1~PCn進(jìn)行遍歷,若判斷結(jié)果PCResi=1(其中1≤i≤n)則將響應(yīng)數(shù)據(jù)RDi1~RDim按照設(shè)定的時(shí)序注入到指定的目標(biāo)端口即完成被動(dòng)數(shù)據(jù)的輸入。
在數(shù)據(jù)輸入過(guò)程中存在變化的動(dòng)態(tài)字段,針對(duì)動(dòng)態(tài)字段若僅依靠數(shù)據(jù)驅(qū)動(dòng)則需要構(gòu)建大量的數(shù)據(jù),花費(fèi)大量時(shí)間,另外在被動(dòng)輸入數(shù)據(jù)中存在隨目標(biāo)數(shù)據(jù)變化的字段(如握手信息、校驗(yàn)碼等),數(shù)據(jù)驅(qū)動(dòng)無(wú)法預(yù)知其具體值,無(wú)法注入滿足要求的數(shù)據(jù),為此在數(shù)據(jù)驅(qū)動(dòng)模型中加入關(guān)鍵字,通過(guò)數(shù)據(jù)與關(guān)鍵字驅(qū)動(dòng)相結(jié)合的方式實(shí)現(xiàn)測(cè)試數(shù)據(jù)的自動(dòng)生成與輸入。
根據(jù)嵌入式軟件輸入數(shù)據(jù)的特點(diǎn)從數(shù)據(jù)位置、長(zhǎng)度、類(lèi)型、排列方式等角度進(jìn)行分析,構(gòu)建關(guān)鍵字模型。
定義4 關(guān)鍵字模型(KD):KD=
Key:表示數(shù)據(jù)生成方式,包括握手?jǐn)?shù)據(jù)、時(shí)間數(shù)據(jù)、連續(xù)數(shù)據(jù)、離散數(shù)據(jù)、校驗(yàn)數(shù)據(jù)、特殊功能數(shù)據(jù)(如長(zhǎng)度)等;
Type:表示數(shù)據(jù)類(lèi)型,包括有符號(hào)整形、無(wú)符號(hào)整形、浮點(diǎn)型等;
BW:表示數(shù)據(jù)位寬,BW∈{8,16,24,32,…};
Mode:表示數(shù)據(jù)排列方式,包括小端排列與大端排列;
Pos:表示數(shù)據(jù)的范圍或數(shù)據(jù)的起始與終點(diǎn)位置;
Exp:表示數(shù)據(jù)計(jì)算表達(dá)式f。
測(cè)試數(shù)據(jù)生成規(guī)則如下:根據(jù)Key獲取生成數(shù)據(jù)的類(lèi)別,選擇相應(yīng)的生成方式;根據(jù)Pos表示的范圍或區(qū)間位置獲取初值,根據(jù)選擇的生成方式與f計(jì)算當(dāng)前數(shù)據(jù)值;根據(jù)Type、BW以及Mode將計(jì)算值填充至指定的字段域。
以數(shù)據(jù)模型為基礎(chǔ)對(duì)該測(cè)試框架整體架構(gòu)進(jìn)行設(shè)計(jì),采用模塊化的思想對(duì)各個(gè)模塊進(jìn)行設(shè)計(jì),保證模塊的獨(dú)立性與可擴(kuò)展性??蚣苷w結(jié)構(gòu)主要包括數(shù)據(jù)解析模塊、被動(dòng)輸入模塊、主動(dòng)輸入模塊、接收數(shù)據(jù)模塊、發(fā)送數(shù)據(jù)模塊以及顯存模塊,具體組成如圖1所示。
圖1 自動(dòng)化測(cè)試框架整體架構(gòu)
基于上述設(shè)計(jì)方案,采用VC6.0研制了該測(cè)試框架,采用多線程與環(huán)形緩存原理保證各個(gè)模塊之間既能協(xié)同工作,又能實(shí)時(shí)數(shù)據(jù)傳遞,框架運(yùn)行界面如圖2所示。
圖2 自動(dòng)化測(cè)試框架運(yùn)行界面
其中數(shù)據(jù)解析模塊與數(shù)據(jù)輸入模塊是該框架的關(guān)鍵模塊,是數(shù)據(jù)與關(guān)鍵字驅(qū)動(dòng)的測(cè)試數(shù)據(jù)輸入思想的具體實(shí)現(xiàn)。
3.2.1 數(shù)據(jù)解析模塊
該框架以文本文件作為測(cè)試數(shù)據(jù)的輸入,在文本文件中存儲(chǔ)待輸入的主動(dòng)數(shù)據(jù)與被動(dòng)數(shù)據(jù),軟件按照設(shè)定的規(guī)則對(duì)文件進(jìn)行解析,形成主動(dòng)輸入數(shù)據(jù)鏈(ADChain)與被動(dòng)輸入數(shù)據(jù)鏈(PDChain),其中ADChain解析實(shí)現(xiàn)過(guò)程如下。
Algorithm:LoadADChain
Input:(strPath) /*Active Test file Path*/
Output:(count) /*The count ofADChain*/
(1)p_file = OpenFile(strPath,"r");/*open file*/
(2)whileget a line from p_file and line is not nulldo/*read a line*/
(3) SplitStringToArray(strArray,line," ");/*split the line by space*/
(4)ifstrArray.GetSize() <4then/*check the line*/
(5)exitwhile;
(6)end
(7) pSD = ADChain.AddSDList();/*createSD*/
(8) …/*read thePort、St、Rn、Pre…*/
(9) AnalysisProtocol(strArray[4],pSD); /*analysis and update the protocol*/
(10) SplitStringToArray(strArray,line.right(strArray[5])," ");/*split the data*/
(11)fori ← 0 to strArray.GetSize()-1do/*analysis the keyword data and fix data*/
(12)ifis theKDthen/*isKD*/
(13) pKD = pSD.AddKDList();/*createKD*/
(14) pKD.AnalysisKD(strArray[i]);/*analysis theKD*/
(15) …/*update theKD*/
(16) pSD.Data = 0;/*fill the 0*/
(17)else/*is FData*/
(18) pSD.Data = strArray[i];/*fill the fix data*/
(19)end
(20)end
(21)end
(22)returnADChain.count;
PDChain解析實(shí)現(xiàn)過(guò)程如下。
Algorithm:LoadPDChain
Input:(strPath) /*Passive Test file Path */
Output:(count) /*The count ofPDChain*/
(1)p_file = OpenFile(strPath,"r");/*open file*/
(2)PDNum = GetPDCount();/*get thePDCount from file*/
(3)fori ← 0 to PDNum-1do
(4) pPD = PDChain.AddPDList();/*createPD*/
(5) pPD.PC = GetPC(p_file);/*read thePC*/
(6)forj ← 0 to RDNum-1do/*read theRD*/
(7) pRD = pPD.AddRDList();/*createRD*/
(8)fork ← 0 to SDNum-1do
(9) pSD = pRD.AddSDList();/*createSD*/
(10) …/*read thePort、St、Rn、Pre…*/
(11) AnalysisProtocol(p_file,pSD);/*analysis and update the protocol*/
(12) …/*analysis the keyword data and fix data*/
(13)end
(14)end
(15)end
(16)returnPDChain.count;
數(shù)據(jù)解析與顯示界面實(shí)現(xiàn)結(jié)果如圖3所示。
圖3 數(shù)據(jù)解析與顯示界面
3.2.2 數(shù)據(jù)輸入模塊
數(shù)據(jù)輸入模塊按時(shí)間序列對(duì)各輸入數(shù)據(jù)獨(dú)立進(jìn)行管理,當(dāng)數(shù)據(jù)輸入時(shí)刻到達(dá)后根據(jù)關(guān)鍵字自動(dòng)生成測(cè)試數(shù)據(jù)并注入到指定的端口,包括數(shù)據(jù)輸入時(shí)刻計(jì)算與數(shù)據(jù)自動(dòng)生成。
數(shù)據(jù)輸入時(shí)刻計(jì)算:針對(duì)任意輸入數(shù)據(jù),其數(shù)據(jù)輸入時(shí)刻Ti的計(jì)算如下
Ti=T0i+Tsi+j×Tci
(1)
式中:i∈[1,n],j∈[0,Ri],n表示輸入數(shù)據(jù)的個(gè)數(shù),Ri表示第i個(gè)數(shù)據(jù)輸入次序,T0i表示相對(duì)零點(diǎn)時(shí)刻的間隔時(shí)間,Tsi表示數(shù)據(jù)輸入的延時(shí)時(shí)間,Tci表示數(shù)據(jù)輸入的間隔時(shí)間。針對(duì)T0i的計(jì)算,主動(dòng)數(shù)據(jù)與被動(dòng)數(shù)據(jù)計(jì)算方式不同。
主動(dòng)數(shù)據(jù):主動(dòng)數(shù)據(jù)無(wú)前置條件,嚴(yán)格按照時(shí)序執(zhí)行,無(wú)須等待,故T0i=0;
被動(dòng)數(shù)據(jù):被動(dòng)數(shù)據(jù)存在前置條件,需等待前置條件滿足,故當(dāng)?shù)趇個(gè)被動(dòng)數(shù)據(jù)的前置條件滿足后以當(dāng)前時(shí)刻t為T(mén)0i,即T0i=t,在T0i未取值前不進(jìn)行Ti的計(jì)算。
當(dāng)Ti=t時(shí)將計(jì)算后的數(shù)據(jù)注入到指定端口進(jìn)行發(fā)送,隨后j=j+1,繼續(xù)計(jì)算Ti直到j(luò)>Ri則表示該數(shù)據(jù)輸入完成。
數(shù)據(jù)自動(dòng)生成:數(shù)據(jù)的生成包括固定數(shù)據(jù)(FD)生成與關(guān)鍵字?jǐn)?shù)據(jù)(KD)生成,生成的數(shù)據(jù)為多個(gè)十六進(jìn)制數(shù)據(jù)組成的集合 {d1,d2,…,dn}。固定數(shù)據(jù)直接取值即可,即di=FDi,其中di表示第i個(gè)字段。
根據(jù)關(guān)鍵字?jǐn)?shù)據(jù)生成規(guī)則,其生成過(guò)程如下:
初值計(jì)算:根據(jù)關(guān)鍵字中的Key與Pos計(jì)算初值y0,具體如下:
握手?jǐn)?shù)據(jù):直接從接收數(shù)據(jù)中取值,即y0=Rs~Re,其中R表示接收數(shù)據(jù)集合,s與e是Pos中表示的數(shù)據(jù)起始與終點(diǎn)位置。
時(shí)間數(shù)據(jù):直接根據(jù)時(shí)間規(guī)則計(jì)算時(shí)間,即y0=t,其中t可表示當(dāng)前日期、時(shí)間等。
連續(xù)數(shù)據(jù):從數(shù)據(jù)范圍的s→e逐次獲取數(shù)據(jù),并逐次加1,即
(2)
離散數(shù)據(jù):直接從Pos表示的序列中獲取數(shù)據(jù),即y0∈{Pos1,Pos2,…,Posn},根據(jù)發(fā)送次數(shù)逐次獲取。
校驗(yàn)數(shù)據(jù):計(jì)算指定區(qū)間s→e字段的校驗(yàn)值,即y0=Fc{ds,ds+1,…,de},其中Fc表示校驗(yàn)運(yùn)算,包括和校驗(yàn)、CRC校驗(yàn)、異或校驗(yàn)等。
特殊功能數(shù)據(jù):根據(jù)功能字段直接計(jì)算數(shù)據(jù),如長(zhǎng)度關(guān)鍵字(len)則表示取發(fā)送數(shù)據(jù)長(zhǎng)度,即y0=n,其中n表示發(fā)送數(shù)據(jù)長(zhǎng)度。
表達(dá)式計(jì)算:將計(jì)算的初值y0與表達(dá)式f進(jìn)行加權(quán)計(jì)算y=f1×y0+f2,其中f1為縮放表達(dá)式,用于對(duì)初值進(jìn)行縮放,f2為偏移表達(dá)式,用于對(duì)初值進(jìn)行偏移修正,支持線性與非線性表達(dá)式。
再根據(jù)Mode填充數(shù)據(jù),填充序列如下
(3)
(4)
數(shù)據(jù)輸入模塊的實(shí)現(xiàn)過(guò)程如下。
Algorithm:SendData
Input:(rxd,t)/*The receive data rxd,The time t*/
Output:(txd) /*The send data txd*/
(1)txd= null;/*set the txd is null*/
(2)/*check the the Passive data timing*/
(3)fori ← 0 to PDChain.Countdo
(4) PCRes[i]=CheckPC(PDChain[i],rxd);/*checkPC*/
(5)ifPCRes[i]== 1then
(6) T0[i]=t;/*update theT0*/
(7) …/*add toSChain*/
(8)end
(9)end
(10)/*check Ti and create txd*/
(11)fork ← 0 to SChain.Countdo/*include theADChainandPDChainwhich the T0≠0*/
(12)ifT[k]== tthen/*timing is coming*/
(13)fori ← 0 to SD.Countdo/*calculate data*/
(14)ifSDisFDatathen
(15)txd[i]= FD[i];
(16)else/*isKData*/
(17) y0=Calcy0(KD[i]);/*calculate y0*/
(18) y=Calcy(KD[i],y0);/*calculate y*/
(19)txd=FillData(KD[i],y);/*Fill Data*/
(20)end
(21)end
(22) SChain[k].inx++;/*send sequence*/
(23)ifSChain[k].inx <= SChain[k].Rthen
(24) T[k]=T0[k]+SChain[k].Ts+ SChain[k].inx × SChain[k].Tc;/*calculate the nextTi*/
(25)else
(26) …/*remove the SChain[k]fromSChain*/
(27)end
(28)end
(29)end
(30)returntxd;
通過(guò)某監(jiān)控嵌入式軟件的狀態(tài)查詢(xún)與靜檢功能對(duì)該框架進(jìn)行驗(yàn)證,監(jiān)控軟件運(yùn)行后周期接收下位機(jī)發(fā)送的自檢結(jié)果“55 AA 01 …”與狀態(tài)信息“AA/BB 7E …”并進(jìn)行解析,另外可主動(dòng)發(fā)送靜檢命令“55 AA 03 …”、“55 81 02 00”,待下位機(jī)收到靜檢命令后被動(dòng)反饋應(yīng)答“55 AA/BB …”及靜檢結(jié)果“AA 7E …”。首先根據(jù)監(jiān)控軟件狀態(tài)查詢(xún)與靜檢功能的輸入輸出數(shù)據(jù)流構(gòu)建如圖4需要發(fā)送的輸入數(shù)據(jù)文件。
圖4 輸入數(shù)據(jù)文件
其中字段“l(fā)en[]”表示特殊功能數(shù)據(jù)的長(zhǎng)度數(shù)據(jù),取數(shù)據(jù)字段的總長(zhǎng)度;字段“time32[]”表示時(shí)間數(shù)據(jù),取系統(tǒng)當(dāng)前時(shí)間;字段“cnt16[0~10]*10”表示連續(xù)數(shù)據(jù),數(shù)據(jù)范圍為[0~100],間隔10;字段“sum8[0~len-2]”表示校驗(yàn)數(shù)據(jù),計(jì)算指定區(qū)間數(shù)據(jù)的和校驗(yàn);字段“rec[3~4]”表示握手?jǐn)?shù)據(jù),表示取接收數(shù)據(jù)的第3~4字節(jié)。
運(yùn)行該測(cè)試框架,讀取數(shù)據(jù)文件,發(fā)送數(shù)據(jù),框架實(shí)例化各關(guān)鍵字生成相應(yīng)的測(cè)試數(shù)據(jù)并按照時(shí)序逐次向監(jiān)控軟件發(fā)送數(shù)據(jù),具體結(jié)果如圖5所示。
圖5 主動(dòng)發(fā)送數(shù)據(jù)結(jié)果
另外對(duì)監(jiān)控軟件發(fā)送的目標(biāo)數(shù)據(jù)進(jìn)行接收,當(dāng)接收到靜檢命令后進(jìn)行前置條件判斷,滿足要求后生成測(cè)試數(shù)據(jù)并按照時(shí)序要求向監(jiān)控軟件進(jìn)行被動(dòng)發(fā)送,具體結(jié)果如圖6所示。
圖6 被動(dòng)發(fā)送數(shù)據(jù)結(jié)果
對(duì)發(fā)送的數(shù)據(jù)的時(shí)間性能進(jìn)行分析,具體見(jiàn)表1。
表1 數(shù)據(jù)發(fā)送時(shí)間測(cè)試結(jié)果/ms
另外,再通過(guò)其它工具實(shí)現(xiàn)圖4中的數(shù)據(jù)發(fā)送行為,其操作結(jié)果對(duì)比見(jiàn)表2。
表2 不同類(lèi)型工具操作結(jié)果對(duì)比分析
根據(jù)測(cè)試結(jié)果可知,該自動(dòng)化測(cè)試框架能夠正確解析數(shù)據(jù)文件,實(shí)現(xiàn)測(cè)試數(shù)據(jù)的主動(dòng)與被動(dòng)輸入,自動(dòng)實(shí)例化關(guān)鍵字并生成測(cè)試數(shù)據(jù)進(jìn)行發(fā)送,發(fā)送數(shù)據(jù)內(nèi)容、時(shí)序正確,數(shù)據(jù)處理效率在毫秒級(jí),能夠滿足嵌入式軟件數(shù)據(jù)處理實(shí)時(shí)性要求。
本文將數(shù)據(jù)與關(guān)鍵字驅(qū)動(dòng)思想應(yīng)用到嵌入式軟件測(cè)試中,設(shè)計(jì)并研制了一款輕量級(jí)嵌入式軟件自動(dòng)化測(cè)試框架。相較于傳統(tǒng)嵌入式軟件測(cè)試框架,該框架能夠控制測(cè)試數(shù)據(jù)的輸入時(shí)序與條件,同時(shí)可實(shí)現(xiàn)測(cè)試數(shù)據(jù)的自適應(yīng)生成;相較于專(zhuān)業(yè)嵌入式軟件測(cè)試框架,該框架將測(cè)試數(shù)據(jù)與測(cè)試腳本完全分離,省略了測(cè)試過(guò)程中復(fù)雜的測(cè)試腳本編寫(xiě)過(guò)程,降低了測(cè)試環(huán)境搭建時(shí)間與難度,另外簡(jiǎn)明、格式化的數(shù)據(jù)結(jié)構(gòu)能夠使測(cè)試人員快速構(gòu)造測(cè)試數(shù)據(jù)進(jìn)行測(cè)試,提升了測(cè)試效率,工程實(shí)用性較強(qiáng)。
根據(jù)實(shí)例驗(yàn)證可知,該框架可用于嵌入式軟件測(cè)試,并已在多個(gè)嵌入式軟件測(cè)試中進(jìn)行應(yīng)用。但該框架目前測(cè)試數(shù)據(jù)自動(dòng)生成策略尚未結(jié)合測(cè)試設(shè)計(jì)方法,后續(xù)將測(cè)試設(shè)計(jì)方法融合其中實(shí)現(xiàn)基于模型的測(cè)試數(shù)據(jù)自動(dòng)生成,以適應(yīng)復(fù)雜系統(tǒng)的測(cè)試。