黃 晨,于 倩,虞礪琨,陳華南,王小麗
(1.北京軒宇信息技術(shù)有限公司,北京 100190;2.北京控制工程研究所,北京 100190)
航天嵌入式軟件功能算法復(fù)雜度高、涉及數(shù)據(jù)多,功能正確性與應(yīng)用場(chǎng)景、上下文緊密關(guān)聯(lián),傳統(tǒng)的需求分析方式難以清晰展示復(fù)雜功能邏輯、數(shù)據(jù)關(guān)聯(lián)關(guān)系,用例設(shè)計(jì)的質(zhì)量依賴于人員經(jīng)驗(yàn),存在大量重復(fù)性工作[1]?;谀P偷臏y(cè)試方法[2],依據(jù)需求規(guī)格說(shuō)明建立測(cè)試模型,模型的語(yǔ)義和語(yǔ)法定義嚴(yán)格,抽象程度高,所生成的測(cè)試用例集來(lái)自于模型中的數(shù)據(jù)流、對(duì)象流、消息流等形成的路徑集合,具有輸入數(shù)據(jù)和預(yù)期輸出結(jié)果,可以滿足嵌入式軟件測(cè)試標(biāo)準(zhǔn)和要求[3-6]。當(dāng)前模型測(cè)試中的覆蓋準(zhǔn)則和方法主要圍繞模型結(jié)構(gòu)、路徑的覆蓋策略開(kāi)展[6-7],與數(shù)據(jù)流相關(guān)的功能需求需要驗(yàn)證數(shù)據(jù)值與執(zhí)行邏輯的對(duì)應(yīng)關(guān)系及正確性。當(dāng)前針對(duì)數(shù)據(jù)流的測(cè)試基于程序的控制流圖CFG 開(kāi)展,主要關(guān)注程序中變量的定義、使用之間的關(guān)聯(lián)[8]?;诔绦虼a的分析技術(shù)涉及大量表達(dá)式和變量,生成數(shù)據(jù)的消耗非常大,文獻(xiàn)引入了基于蟻群算法[9-11]、神經(jīng)網(wǎng)絡(luò)算法[12]、遺傳算法[13-14]等多種測(cè)試數(shù)據(jù)生成方法來(lái)提升數(shù)據(jù)生成效率。
文中從星載嵌入式軟件數(shù)據(jù)特性出發(fā),選取活動(dòng)圖模型作為需求建模語(yǔ)言,對(duì)比控制流、數(shù)據(jù)流對(duì)象的語(yǔ)義模型,說(shuō)明適用功能場(chǎng)景、用例數(shù)據(jù)上的差異性,針對(duì)數(shù)據(jù)流對(duì)象需求模型,提出了一種基于路徑數(shù)據(jù)覆蓋的測(cè)試數(shù)據(jù)生成方法,并選取一個(gè)典型功能模型驗(yàn)證方法的有效性。
系統(tǒng)建模語(yǔ)言(Systems Modeling Language,SysML)是標(biāo)準(zhǔn)的面向?qū)ο蟮慕UZ(yǔ)言,使用活動(dòng)圖、狀態(tài)機(jī)圖、序列圖著重表現(xiàn)系統(tǒng)的動(dòng)態(tài)行為[15-16]。活動(dòng)圖圖元有活動(dòng)節(jié)點(diǎn)和活動(dòng)邊,使用活動(dòng)節(jié)點(diǎn)和活動(dòng)邊對(duì)操作之間的流對(duì)象進(jìn)行建模,既能夠表示控制流,也能夠表示對(duì)象流。
控制流用虛線表示,用于對(duì)一個(gè)節(jié)點(diǎn)流向另一個(gè)節(jié)點(diǎn)的情況進(jìn)行建模。當(dāng)一個(gè)動(dòng)作或活動(dòng)節(jié)點(diǎn)結(jié)束執(zhí)行時(shí),控制流將馬上傳遞到下一個(gè)動(dòng)作或者活動(dòng)節(jié)點(diǎn),類(lèi)似于控制流程,對(duì)象是前一個(gè)活動(dòng)的輸出,后一個(gè)活動(dòng)的輸入??刂屏鲝?qiáng)調(diào)軟件執(zhí)行一串活動(dòng)、動(dòng)作的過(guò)程情況,控制流對(duì)象是軟件的活動(dòng)、動(dòng)作。
對(duì)象流用實(shí)線表示,包括數(shù)據(jù)流和信號(hào)流兩種。數(shù)據(jù)流的對(duì)象是一個(gè)活動(dòng)的輸入或輸出,表示一種數(shù)據(jù)流關(guān)系。信號(hào)流將一個(gè)信號(hào)發(fā)送、信號(hào)接收與一個(gè)對(duì)象相連接,表示向該對(duì)象發(fā)送、該對(duì)象接收一個(gè)信號(hào)。數(shù)據(jù)流強(qiáng)調(diào)數(shù)據(jù)從一個(gè)活動(dòng)、動(dòng)作流向下一個(gè)活動(dòng)、動(dòng)作的數(shù)據(jù)變化,數(shù)據(jù)流對(duì)象是軟件活動(dòng)、動(dòng)作所產(chǎn)生的數(shù)據(jù)。
以指令接收功能為例,如圖1 和圖2 所示,具體說(shuō)明控制流、數(shù)據(jù)流對(duì)象模型的差異性、功能場(chǎng)景適用性。
圖1 控制流模型
圖2 數(shù)據(jù)流模型
圖1 表示軟件接收到數(shù)據(jù)指令后的一系列動(dòng)作、行為。軟件從接收到啟動(dòng)接收指令后,開(kāi)始接收數(shù)據(jù)。如果數(shù)據(jù)接收完成或者接收數(shù)據(jù)超時(shí),則處理接收到數(shù)據(jù);如果接收數(shù)據(jù)未完成,則繼續(xù)接收數(shù)據(jù)??刂屏髂P椭薪?jīng)常會(huì)出現(xiàn)環(huán)路。
圖2 表示對(duì)接收到數(shù)據(jù)進(jìn)行校驗(yàn)和處理。軟件對(duì)接收到的數(shù)據(jù)進(jìn)行校驗(yàn),如果校驗(yàn)和正確,則組包正確應(yīng)答數(shù)據(jù)包;如果校驗(yàn)和錯(cuò)誤,則組包錯(cuò)誤應(yīng)答數(shù)據(jù)包。應(yīng)答包組包完成后,發(fā)送該數(shù)據(jù)包。
采用等價(jià)類(lèi)劃分的方法對(duì)上述控制流和數(shù)據(jù)流模型開(kāi)展用例設(shè)計(jì)。圖1 的控制流模型測(cè)試用例有三個(gè):
用例1,對(duì)應(yīng)路徑(1)-(2)-(3)-(4)-(6)-(7)。輸入:a.接收到啟動(dòng)接收指令;b.接收數(shù)據(jù)正常。預(yù)期結(jié)果:輸出接收數(shù)據(jù)狀態(tài)為“接收數(shù)據(jù)完成”。
用例2,對(duì)應(yīng)路徑(1)-(2)-(3)-(4)-(5)-(3)-(4)-(6)-(7)。輸入:a.接收到啟動(dòng)接收指令;b.接收數(shù)據(jù)超時(shí)(數(shù)據(jù)包長(zhǎng)度字段大于實(shí)際接收到數(shù)據(jù)包字節(jié)數(shù))。預(yù)期結(jié)果:輸出接收數(shù)據(jù)狀態(tài)為“接收數(shù)據(jù)超時(shí)”。
用例3,對(duì)應(yīng)路徑(1)-(2)-(3)-(4)-(5)-(3)-(4)-(6)-(7)。輸入:a.接收到啟動(dòng)接收指令;b.接收數(shù)據(jù)超時(shí)(接收數(shù)據(jù)過(guò)程中,暫停一段時(shí)間,繼續(xù)接收數(shù)據(jù))。預(yù)期結(jié)果:輸出接收數(shù)據(jù)狀態(tài)為“接收數(shù)據(jù)超時(shí)”。
用例2 和用例3 具有相同的測(cè)試路徑,均存在環(huán)路(3)-(4)-(5)-(3)-(4),但是步驟b 的測(cè)試場(chǎng)景(輸入數(shù)據(jù))有所不同。
圖2 的數(shù)據(jù)流模型測(cè)試用例有兩個(gè):
用例1,對(duì)應(yīng)路徑(1)-(2)-(3)-(6)。輸入:接收到校驗(yàn)和正確的串口數(shù)據(jù)。預(yù)期結(jié)果:輸出“正確應(yīng)答數(shù)據(jù)包”。
用例2,對(duì)應(yīng)路徑(1)-(4)-(5)-(6)。輸入:接收到校驗(yàn)和錯(cuò)誤的串口數(shù)據(jù)。預(yù)期結(jié)果:輸出“錯(cuò)誤應(yīng)答數(shù)據(jù)包”。
采用控制流建立模型時(shí),重點(diǎn)關(guān)注測(cè)試需求設(shè)計(jì)中來(lái)自于外部事件觸發(fā)的執(zhí)行動(dòng)作、邏輯是否正確。針對(duì)動(dòng)作執(zhí)行序列、狀態(tài)轉(zhuǎn)換過(guò)程等功能,一般建立控制流模型。
采用數(shù)據(jù)流建立模型時(shí),重點(diǎn)關(guān)注數(shù)據(jù)值對(duì)執(zhí)行邏輯的影響。針對(duì)數(shù)值計(jì)算、數(shù)據(jù)采集與轉(zhuǎn)換等關(guān)注于數(shù)據(jù)處理的功能,一般建立數(shù)據(jù)流模型。
針對(duì)數(shù)據(jù)流模型,測(cè)試用例的覆蓋性和充分性決定于測(cè)試輸入數(shù)據(jù)能否有效覆蓋模型中的全部有效路徑。
根據(jù)數(shù)據(jù)流模型中圖元的語(yǔ)義,對(duì)模型結(jié)構(gòu)進(jìn)行解析,將其轉(zhuǎn)換為有向圖,計(jì)算可執(zhí)行路徑;根據(jù)路徑上變量類(lèi)型和輸入域、輸出域范圍、表達(dá)式類(lèi)型及測(cè)試覆蓋要求,求解表達(dá)式中變量數(shù)據(jù)值,作為測(cè)試用例的數(shù)據(jù)。數(shù)據(jù)流模型計(jì)算轉(zhuǎn)換過(guò)程如圖3 所示。
圖3 計(jì)算轉(zhuǎn)換過(guò)程
根據(jù)需求模型中數(shù)據(jù)對(duì)象的變化過(guò)程進(jìn)行建模,判定節(jié)點(diǎn)上為判定表達(dá)式,動(dòng)作節(jié)點(diǎn)上為賦值表達(dá)式。
根據(jù)模型圖元及屬性對(duì)結(jié)構(gòu)進(jìn)行解析,建立數(shù)據(jù)流模型中圖元與有向圖的映射關(guān)系,活動(dòng)、動(dòng)作節(jié)點(diǎn)對(duì)應(yīng)有向圖的節(jié)點(diǎn),數(shù)據(jù)流對(duì)應(yīng)有向圖的邊,確定有向圖的初始節(jié)點(diǎn)、終止節(jié)點(diǎn)等基本屬性。采用深度優(yōu)先搜索遍歷有向圖,考慮節(jié)點(diǎn)是否有父節(jié)點(diǎn)、是否有子節(jié)點(diǎn)、父節(jié)點(diǎn)名稱、相鄰節(jié)點(diǎn)、是否遍歷終止節(jié)點(diǎn)等情況,計(jì)算得到可執(zhí)行路徑的集合。
2.3.1 變量基本屬性
模型中涉及的所有變量都需要進(jìn)行基本屬性定義,基本屬性有變量名、輸入/輸出、變量類(lèi)型(靜態(tài)、動(dòng)態(tài))、數(shù)據(jù)類(lèi)型(整形、單精度浮點(diǎn)型、雙精度浮點(diǎn)、結(jié)構(gòu)體等)、有效范圍、離散/連續(xù)、步長(zhǎng)、初值。
對(duì)于模型變量類(lèi)型,靜態(tài)變量表示初值可觀,數(shù)值來(lái)自于外部設(shè)定;動(dòng)態(tài)變量表示初值無(wú)法直接觀測(cè),數(shù)值由模型中表達(dá)式求解所得。
2.3.2 表達(dá)式類(lèi)型及測(cè)試覆蓋要求
將模型中的表達(dá)式分為兩種類(lèi)型和四種子類(lèi)型。類(lèi)型有判定表達(dá)式和賦值表達(dá)式;子類(lèi)型有邏輯表達(dá)式、關(guān)系表達(dá)式、條件表達(dá)式、算術(shù)表達(dá)式。表達(dá)式子類(lèi)型不同,生成數(shù)據(jù)的覆蓋要求不同,要求如圖4 所示。
圖4 表達(dá)式類(lèi)型及數(shù)據(jù)覆蓋要求
數(shù)據(jù)覆蓋要求如下:
1)等價(jià)類(lèi)數(shù)據(jù):有效等價(jià)類(lèi)數(shù)據(jù)為有效取值范圍內(nèi)的典型或者任意數(shù)據(jù);無(wú)效等價(jià)類(lèi)數(shù)據(jù)為有效取值范圍外的典型或者任意數(shù)據(jù)。
2)邊界值數(shù)據(jù):高端邊界值考慮有效取值范圍內(nèi)等于邊界值,稍小于邊界值,有效取值范圍外稍大于邊界值;低端邊界值考慮有效取值范圍內(nèi)等于邊界值,稍小于邊界值,有效取值范圍外稍大于邊界值。
3)修正條件判定數(shù)據(jù):數(shù)據(jù)集合應(yīng)滿足每個(gè)輸入輸出至少出現(xiàn)一次,每一個(gè)判定中的每一個(gè)條件必須能夠獨(dú)立影響一個(gè)判定的輸出,即在其他條件不變的前提下僅改變這個(gè)條件的值,而使判定結(jié)果改變的數(shù)據(jù)。4)初始數(shù)據(jù):算術(shù)表達(dá)式變量的初始值。5)指定數(shù)據(jù):算術(shù)表達(dá)式的指定數(shù)據(jù)值。
2.3.3 表達(dá)式求解
建立路徑上表達(dá)式組的集合,依據(jù)每類(lèi)表達(dá)式所需滿足的數(shù)據(jù)覆蓋要求求解表達(dá)式組。算法實(shí)現(xiàn)過(guò)程如圖5 所示。
圖5 表達(dá)式組求解過(guò)程
根據(jù)測(cè)試用例設(shè)計(jì)要求對(duì)測(cè)試數(shù)據(jù)進(jìn)行分組,形成測(cè)試用例集。確定某個(gè)或多個(gè)靜態(tài)變量的數(shù)值變化規(guī)律作為用例前提條件,測(cè)試用例可包括多個(gè)步驟,每個(gè)步驟包括輸入數(shù)據(jù)和輸出數(shù)據(jù),一個(gè)用例中多個(gè)步驟之間的輸入數(shù)據(jù)值應(yīng)有所不同。
選取星載嵌入式軟件某數(shù)據(jù)處理功能建立數(shù)據(jù)流對(duì)象模型,該功能屬于算法類(lèi)功能,模型中涉及多個(gè)輸入數(shù)據(jù)排列組合的表達(dá)式,設(shè)計(jì)測(cè)試用例時(shí)考慮輸入數(shù)據(jù)的覆蓋情況。
依據(jù)輸入文件,建立活動(dòng)圖數(shù)據(jù)流模型作為功能需求模型,生成滿足路徑和數(shù)據(jù)覆蓋的測(cè)試用例集。功能需求模型如圖6 所示。
圖6 數(shù)據(jù)處理功能模型
1)變量定義
根據(jù)變量基本屬性對(duì)圖6 中的模型變量進(jìn)行定義,共定義九個(gè)變量:
①I(mǎi)n_A[N]、In_B[N]、In_C[N]:輸入,靜態(tài),整型,有效范圍0/1,離散,步長(zhǎng)無(wú),初值無(wú);
②t_Cal[N]、t_P[N]:輸入,動(dòng)態(tài),整型,有效范圍0/1,離散,步長(zhǎng)無(wú),初值無(wú);
③N:輸入,靜態(tài),整型,有效范圍6,離散,步長(zhǎng)無(wú),初值無(wú);
④i:輸入,靜態(tài),整型,有效范圍0~N-1,離散,步長(zhǎng)1,初值0;
⑤num:輸入,靜態(tài),整型,有效范圍3,離散,步長(zhǎng)無(wú),初值3;
⑥g_Flag:輸出,靜態(tài),整型,有效范圍0/1,離散,步長(zhǎng)無(wú),初值無(wú)。
2)變量操作說(shuō)明
FOR 表示依次遍歷某個(gè)變量中指定范圍的數(shù)據(jù);SUM 表示計(jì)算指定范圍內(nèi)數(shù)值的和。
3)生成路徑集合
對(duì)需求模型進(jìn)行解析,圖5 中的數(shù)據(jù)流用編號(hào)進(jìn)行標(biāo)識(shí),生成全部路徑六條,可執(zhí)行路徑三條,刪除不可執(zhí)行三條路徑。路徑集合為:①路徑1:(1)-(2)-(3)-(5)-(6)-(8)-(9),可執(zhí)行;②路徑2:(1)-(2)-(3)-(5)-(7)-(8)-(9),可執(zhí)行;③路徑3:(1)-(2)-(4)-(8)-(10),可執(zhí)行;④路徑4:(1)-(2)-(3)-(5)-(6)-(8)-(10),不可執(zhí)行;⑤路徑5:(1)-(2)-(3)-(5)-(7)-(8)-(10),不可執(zhí)行;⑥路徑6:(1)-(2)-(4)-(8)-(9),不可執(zhí)行。
4)生成表達(dá)式組集合
根據(jù)表達(dá)式類(lèi)型建立每條路徑上的表達(dá)式組集合,求解生成表達(dá)組的輸入數(shù)據(jù)集合,在三條可執(zhí)行路徑上共生成六組表達(dá)式集合,選取可執(zhí)行路徑1和3 上表達(dá)式組進(jìn)行說(shuō)明,如圖7 所示。
圖7 表達(dá)式組示例
5)測(cè)試用例集生成
①路徑1(1)-(2)-(3)-(5)-(6)-(8)-(9)表達(dá)式組
當(dāng)In_A 有且僅有四個(gè)1 時(shí),生成15 組數(shù)據(jù);當(dāng)In_A 有且僅有五個(gè)1 時(shí),生成6 組數(shù)據(jù);當(dāng)In_A 有且僅有六個(gè)1 時(shí),生成1 組數(shù)據(jù)。
滿足等價(jià)類(lèi)數(shù)據(jù)覆蓋要求,形成三個(gè)測(cè)試用例,具體如表1-3 所示。測(cè)試用例1 考慮當(dāng)In_A 有且僅有四個(gè)1 的情況;測(cè)試用例2 考慮當(dāng)In_A 有且僅有五個(gè)1 的情況;測(cè)試用例3 考慮當(dāng)In_A 有且僅有六個(gè)1 的情況。
表1 測(cè)試用例1
表2 測(cè)試用例2
表3 測(cè)試用例3
③路徑3(1)-(2)-(4)-(8)-(10)表達(dá)式組
在In_A有且僅有兩個(gè)1,In_B、In_C輸入值有解情況下,生成15 組數(shù)據(jù);在In_A 有且僅有一個(gè)1,In_B、In_C 輸入值有解的情況下,生成六組數(shù)據(jù);在In_A 全0,In_B、In_C 輸入值有解的情況下,生成一組數(shù)據(jù)。
滿足等價(jià)類(lèi)數(shù)據(jù)覆蓋要求,形成三個(gè)測(cè)試用例。
文中選取活動(dòng)圖模型作為需求建模語(yǔ)言,活動(dòng)圖中控制流和數(shù)據(jù)流對(duì)象在適用功能場(chǎng)景、用例數(shù)據(jù)方面具有差異,控制流強(qiáng)調(diào)軟件執(zhí)行一串活動(dòng)、動(dòng)作的過(guò)程情況;數(shù)據(jù)流強(qiáng)調(diào)從一個(gè)活動(dòng)、動(dòng)作流向下一個(gè)活動(dòng)、動(dòng)作的數(shù)據(jù)變化。建立數(shù)據(jù)流對(duì)象模型,設(shè)定變量類(lèi)型、有效范圍等基本屬性,對(duì)模型解析后得到可執(zhí)行路徑及表達(dá)式組,可求解生成滿足測(cè)試覆蓋要求的數(shù)據(jù)及測(cè)試用例集,這種方法將測(cè)試重點(diǎn)放在測(cè)試需求分析及建模上,既能有效縮短用例設(shè)計(jì)時(shí)間又同時(shí)保證生成測(cè)試用例的充分性,大幅提升測(cè)試效率。
基于模型的自動(dòng)化測(cè)試方法,在提升需求分析能力的同時(shí)保證測(cè)試充分性,后續(xù)結(jié)合領(lǐng)域軟件特征及用例設(shè)計(jì)要求,繼續(xù)研究典型需求建模方法,推進(jìn)模型測(cè)試在航天領(lǐng)域的工程化應(yīng)用。