黃 晨,于 倩,虞礪琨,陳華南,王小麗
(1.北京軒宇信息技術有限公司,北京 100190;2.北京控制工程研究所,北京 100190)
航天嵌入式軟件功能算法復雜度高、涉及數據多,功能正確性與應用場景、上下文緊密關聯,傳統的需求分析方式難以清晰展示復雜功能邏輯、數據關聯關系,用例設計的質量依賴于人員經驗,存在大量重復性工作[1]。基于模型的測試方法[2],依據需求規格說明建立測試模型,模型的語義和語法定義嚴格,抽象程度高,所生成的測試用例集來自于模型中的數據流、對象流、消息流等形成的路徑集合,具有輸入數據和預期輸出結果,可以滿足嵌入式軟件測試標準和要求[3-6]。當前模型測試中的覆蓋準則和方法主要圍繞模型結構、路徑的覆蓋策略開展[6-7],與數據流相關的功能需求需要驗證數據值與執行邏輯的對應關系及正確性。當前針對數據流的測試基于程序的控制流圖CFG 開展,主要關注程序中變量的定義、使用之間的關聯[8]。基于程序代碼的分析技術涉及大量表達式和變量,生成數據的消耗非常大,文獻引入了基于蟻群算法[9-11]、神經網絡算法[12]、遺傳算法[13-14]等多種測試數據生成方法來提升數據生成效率。
文中從星載嵌入式軟件數據特性出發,選取活動圖模型作為需求建模語言,對比控制流、數據流對象的語義模型,說明適用功能場景、用例數據上的差異性,針對數據流對象需求模型,提出了一種基于路徑數據覆蓋的測試數據生成方法,并選取一個典型功能模型驗證方法的有效性。
系統建模語言(Systems Modeling Language,SysML)是標準的面向對象的建模語言,使用活動圖、狀態機圖、序列圖著重表現系統的動態行為[15-16]。活動圖圖元有活動節點和活動邊,使用活動節點和活動邊對操作之間的流對象進行建模,既能夠表示控制流,也能夠表示對象流。
控制流用虛線表示,用于對一個節點流向另一個節點的情況進行建模。當一個動作或活動節點結束執行時,控制流將馬上傳遞到下一個動作或者活動節點,類似于控制流程,對象是前一個活動的輸出,后一個活動的輸入。控制流強調軟件執行一串活動、動作的過程情況,控制流對象是軟件的活動、動作。
對象流用實線表示,包括數據流和信號流兩種。數據流的對象是一個活動的輸入或輸出,表示一種數據流關系。信號流將一個信號發送、信號接收與一個對象相連接,表示向該對象發送、該對象接收一個信號。數據流強調數據從一個活動、動作流向下一個活動、動作的數據變化,數據流對象是軟件活動、動作所產生的數據。
以指令接收功能為例,如圖1 和圖2 所示,具體說明控制流、數據流對象模型的差異性、功能場景適用性。

圖1 控制流模型

圖2 數據流模型
圖1 表示軟件接收到數據指令后的一系列動作、行為。軟件從接收到啟動接收指令后,開始接收數據。如果數據接收完成或者接收數據超時,則處理接收到數據;如果接收數據未完成,則繼續接收數據。控制流模型中經常會出現環路。
圖2 表示對接收到數據進行校驗和處理。軟件對接收到的數據進行校驗,如果校驗和正確,則組包正確應答數據包;如果校驗和錯誤,則組包錯誤應答數據包。應答包組包完成后,發送該數據包。
采用等價類劃分的方法對上述控制流和數據流模型開展用例設計。圖1 的控制流模型測試用例有三個:
用例1,對應路徑(1)-(2)-(3)-(4)-(6)-(7)。輸入:a.接收到啟動接收指令;b.接收數據正常。預期結果:輸出接收數據狀態為“接收數據完成”。
用例2,對應路徑(1)-(2)-(3)-(4)-(5)-(3)-(4)-(6)-(7)。輸入:a.接收到啟動接收指令;b.接收數據超時(數據包長度字段大于實際接收到數據包字節數)。預期結果:輸出接收數據狀態為“接收數據超時”。
用例3,對應路徑(1)-(2)-(3)-(4)-(5)-(3)-(4)-(6)-(7)。輸入:a.接收到啟動接收指令;b.接收數據超時(接收數據過程中,暫停一段時間,繼續接收數據)。預期結果:輸出接收數據狀態為“接收數據超時”。
用例2 和用例3 具有相同的測試路徑,均存在環路(3)-(4)-(5)-(3)-(4),但是步驟b 的測試場景(輸入數據)有所不同。
圖2 的數據流模型測試用例有兩個:
用例1,對應路徑(1)-(2)-(3)-(6)。輸入:接收到校驗和正確的串口數據。預期結果:輸出“正確應答數據包”。
用例2,對應路徑(1)-(4)-(5)-(6)。輸入:接收到校驗和錯誤的串口數據。預期結果:輸出“錯誤應答數據包”。
采用控制流建立模型時,重點關注測試需求設計中來自于外部事件觸發的執行動作、邏輯是否正確。針對動作執行序列、狀態轉換過程等功能,一般建立控制流模型。
采用數據流建立模型時,重點關注數據值對執行邏輯的影響。針對數值計算、數據采集與轉換等關注于數據處理的功能,一般建立數據流模型。
針對數據流模型,測試用例的覆蓋性和充分性決定于測試輸入數據能否有效覆蓋模型中的全部有效路徑。
根據數據流模型中圖元的語義,對模型結構進行解析,將其轉換為有向圖,計算可執行路徑;根據路徑上變量類型和輸入域、輸出域范圍、表達式類型及測試覆蓋要求,求解表達式中變量數據值,作為測試用例的數據。數據流模型計算轉換過程如圖3 所示。

圖3 計算轉換過程
根據需求模型中數據對象的變化過程進行建模,判定節點上為判定表達式,動作節點上為賦值表達式。
根據模型圖元及屬性對結構進行解析,建立數據流模型中圖元與有向圖的映射關系,活動、動作節點對應有向圖的節點,數據流對應有向圖的邊,確定有向圖的初始節點、終止節點等基本屬性。采用深度優先搜索遍歷有向圖,考慮節點是否有父節點、是否有子節點、父節點名稱、相鄰節點、是否遍歷終止節點等情況,計算得到可執行路徑的集合。
2.3.1 變量基本屬性
模型中涉及的所有變量都需要進行基本屬性定義,基本屬性有變量名、輸入/輸出、變量類型(靜態、動態)、數據類型(整形、單精度浮點型、雙精度浮點、結構體等)、有效范圍、離散/連續、步長、初值。
對于模型變量類型,靜態變量表示初值可觀,數值來自于外部設定;動態變量表示初值無法直接觀測,數值由模型中表達式求解所得。
2.3.2 表達式類型及測試覆蓋要求
將模型中的表達式分為兩種類型和四種子類型。類型有判定表達式和賦值表達式;子類型有邏輯表達式、關系表達式、條件表達式、算術表達式。表達式子類型不同,生成數據的覆蓋要求不同,要求如圖4 所示。

圖4 表達式類型及數據覆蓋要求
數據覆蓋要求如下:
1)等價類數據:有效等價類數據為有效取值范圍內的典型或者任意數據;無效等價類數據為有效取值范圍外的典型或者任意數據。
2)邊界值數據:高端邊界值考慮有效取值范圍內等于邊界值,稍小于邊界值,有效取值范圍外稍大于邊界值;低端邊界值考慮有效取值范圍內等于邊界值,稍小于邊界值,有效取值范圍外稍大于邊界值。
3)修正條件判定數據:數據集合應滿足每個輸入輸出至少出現一次,每一個判定中的每一個條件必須能夠獨立影響一個判定的輸出,即在其他條件不變的前提下僅改變這個條件的值,而使判定結果改變的數據。4)初始數據:算術表達式變量的初始值。5)指定數據:算術表達式的指定數據值。
2.3.3 表達式求解
建立路徑上表達式組的集合,依據每類表達式所需滿足的數據覆蓋要求求解表達式組。算法實現過程如圖5 所示。

圖5 表達式組求解過程
根據測試用例設計要求對測試數據進行分組,形成測試用例集。確定某個或多個靜態變量的數值變化規律作為用例前提條件,測試用例可包括多個步驟,每個步驟包括輸入數據和輸出數據,一個用例中多個步驟之間的輸入數據值應有所不同。
選取星載嵌入式軟件某數據處理功能建立數據流對象模型,該功能屬于算法類功能,模型中涉及多個輸入數據排列組合的表達式,設計測試用例時考慮輸入數據的覆蓋情況。
依據輸入文件,建立活動圖數據流模型作為功能需求模型,生成滿足路徑和數據覆蓋的測試用例集。功能需求模型如圖6 所示。

圖6 數據處理功能模型
1)變量定義
根據變量基本屬性對圖6 中的模型變量進行定義,共定義九個變量:
①In_A[N]、In_B[N]、In_C[N]:輸入,靜態,整型,有效范圍0/1,離散,步長無,初值無;
②t_Cal[N]、t_P[N]:輸入,動態,整型,有效范圍0/1,離散,步長無,初值無;
③N:輸入,靜態,整型,有效范圍6,離散,步長無,初值無;
④i:輸入,靜態,整型,有效范圍0~N-1,離散,步長1,初值0;
⑤num:輸入,靜態,整型,有效范圍3,離散,步長無,初值3;
⑥g_Flag:輸出,靜態,整型,有效范圍0/1,離散,步長無,初值無。
2)變量操作說明
FOR 表示依次遍歷某個變量中指定范圍的數據;SUM 表示計算指定范圍內數值的和。
3)生成路徑集合
對需求模型進行解析,圖5 中的數據流用編號進行標識,生成全部路徑六條,可執行路徑三條,刪除不可執行三條路徑。路徑集合為:①路徑1:(1)-(2)-(3)-(5)-(6)-(8)-(9),可執行;②路徑2:(1)-(2)-(3)-(5)-(7)-(8)-(9),可執行;③路徑3:(1)-(2)-(4)-(8)-(10),可執行;④路徑4:(1)-(2)-(3)-(5)-(6)-(8)-(10),不可執行;⑤路徑5:(1)-(2)-(3)-(5)-(7)-(8)-(10),不可執行;⑥路徑6:(1)-(2)-(4)-(8)-(9),不可執行。
4)生成表達式組集合
根據表達式類型建立每條路徑上的表達式組集合,求解生成表達組的輸入數據集合,在三條可執行路徑上共生成六組表達式集合,選取可執行路徑1和3 上表達式組進行說明,如圖7 所示。

圖7 表達式組示例
5)測試用例集生成
①路徑1(1)-(2)-(3)-(5)-(6)-(8)-(9)表達式組
當In_A 有且僅有四個1 時,生成15 組數據;當In_A 有且僅有五個1 時,生成6 組數據;當In_A 有且僅有六個1 時,生成1 組數據。
滿足等價類數據覆蓋要求,形成三個測試用例,具體如表1-3 所示。測試用例1 考慮當In_A 有且僅有四個1 的情況;測試用例2 考慮當In_A 有且僅有五個1 的情況;測試用例3 考慮當In_A 有且僅有六個1 的情況。

表1 測試用例1

表2 測試用例2

表3 測試用例3
③路徑3(1)-(2)-(4)-(8)-(10)表達式組
在In_A有且僅有兩個1,In_B、In_C輸入值有解情況下,生成15 組數據;在In_A 有且僅有一個1,In_B、In_C 輸入值有解的情況下,生成六組數據;在In_A 全0,In_B、In_C 輸入值有解的情況下,生成一組數據。
滿足等價類數據覆蓋要求,形成三個測試用例。
文中選取活動圖模型作為需求建模語言,活動圖中控制流和數據流對象在適用功能場景、用例數據方面具有差異,控制流強調軟件執行一串活動、動作的過程情況;數據流強調從一個活動、動作流向下一個活動、動作的數據變化。建立數據流對象模型,設定變量類型、有效范圍等基本屬性,對模型解析后得到可執行路徑及表達式組,可求解生成滿足測試覆蓋要求的數據及測試用例集,這種方法將測試重點放在測試需求分析及建模上,既能有效縮短用例設計時間又同時保證生成測試用例的充分性,大幅提升測試效率。
基于模型的自動化測試方法,在提升需求分析能力的同時保證測試充分性,后續結合領域軟件特征及用例設計要求,繼續研究典型需求建模方法,推進模型測試在航天領域的工程化應用。