彭麗維,宋鵬飛,江雪瑩,謝 林
(1.卡斯柯信號(成都)有限公司,成都 610083;2.卡斯柯信號有限公司,上海 200071)
隨著科技飛速發展,軌道交通等領域軟件的復雜性和規模性越來越高,保證這些軟件的可靠性和安全性有重要意義。軟件測試是保證軟件質量的重要環節和依據[1],然而,軟件測試工作是一項費時費力的活動,軟件測試成本日益增加。因此,如何高效、正確、快速地對軟件進行測試逐漸成為研究的主流方向。
文獻[2]著重介紹了分塊劃分的原理,分析節點和分區兩種類型的模塊結構,將所有的代碼分成若干個模塊,分別在測試引擎中編譯鏈接每個模塊,并將結果存儲在臨時數據庫中。測試引擎將自動測試模塊和額外的可執行程序結合起來,使得測試工具可以根據新的測試需求和不同的測試標準來實時進行測試。利用上述原理設計了計算機輔助軟件測試工具。文獻[3]將軟件的檢驗和驗證(V&V)與商業計算機輔助軟件工具(CASE)結合,在實時的硬件環境下循環測試,相比于傳統的CASE,在軟件測試方面增加了Matlab需求仿真工具箱、逆向工程工具箱、生成單元測試程序工具箱和在線幫助以及信息輔助控制,實例證明在很大程度上減少了測試所需時間和物力。
楊波等從軟件的需求分析出發提出了基于需求建模的測試用例生成方法,從軟件開發的需求階段著手,利用UML建立需求元模型,再從元模型中提取出測試特征元模型,采用OCL約束對模型進行驗證,生成抽象測試用例[4]。
上述方案中在一定程度上提高了測試效率,但是僅針對某一種具體應用的聯鎖軟件,測試模型通用性不強,仍需要大量地人工編寫測試用例。
為解決上述問題,本文提出一種通用聯鎖軟件測試用例的生成方法,如圖1所示,從狀態信息表生成、狀態信息處理、測試用例生成3個階段來展開研究。根據計算機聯鎖技術條件羅列出每個階段的所有狀態及狀態之間的轉換條件和轉換關系,利用這些狀態和關系生成若干四元組合,形成聯鎖狀態轉換模型的樹形網狀結果,最后通過解析該樹形網狀結果來生成測試用例。

圖1 總體框架Fig.1 General framework
狀態信息表生成階段是指根據計算機聯鎖技術條件中描述的進路建立、進路鎖閉、信號開放、進路解鎖、聯鎖結合功能和聯鎖接口功能各個階段所需的聯鎖條件,列出每個階段所有的狀態及狀態之間轉換的條件,利用聯鎖自動化工具將這些狀態和狀態之間的轉換條件輸出到狀態信息表中。
其中狀態信息表中包括所有狀態的名稱、初始狀態和結束狀態,以及每個狀態下可執行的操作、操作對應的結果狀態和操作對應的聯鎖條件。
針對每個階段包含若干狀態,在信息表中需要指定初始狀態、結束狀態和操作對應的結果狀態,其中初始狀態和結束狀態是指從每個階段羅列出的所有狀態中,指定一個初始狀態作為后續搜索的起點和若干結束狀態作為后續搜索的結束條件[5]。
在狀態信息表中,每個狀態還需包含可執行的操作和操作對應的結果狀態,這些操作和結果是通用聯鎖軟件根據先驗閾值設定的適用于所有類型車站的通用判斷條件和操作,再結合具體站場的實際聯鎖邏輯變為具體的值來進行使用,其中操作對應的轉化條件和狀態下可執行的操作是一個適用于所有站型的通用條件判斷和操作,需要結合具體車站數據,將通用條件判斷和操作描述用實際的站場元素來替代[6]。
狀態信息處理階段是指根據狀態信息表提供的狀態轉換名稱、結束狀態、初始化狀態及狀態下可執行的操作及該操作對應的結果狀態,得到聯鎖狀態轉換模型,過程如下。
本階段劃分為2個模塊,分別為:狀態及條件信息組合模塊、聯鎖狀態轉換模塊,各模塊詳細處理分為以下若干步。
1)狀態及條件信息組合模塊,用3個子模塊Module1-1,Module1-2,Module1-3來表示。
Module1-1:將狀態信息表中描述的初始狀態作為入口點狀態,識別該狀態下可執行的所有操作,并找到操作對應的狀態結果,操作對應的轉化條件,針對每一個操作生成一個入口四元組合:“入口點狀態”“轉換條件”“可執行的操作”“結果狀態”。
“結果狀態”可能包含多個,這里將所有的結果狀態用“結果狀態1”“結果狀態2”……“結果狀態n”來描述。
Module1-2:每一個結果狀態下也包括若干個可執行的操作,重復Module1的操作,針對每一個結果狀態下的每個操作生成一個執行四元組合:結果狀態1、轉換條件、結果狀態2,循環執行Module1-2,最終生成若干個執行四元組合:結果狀態n-1、轉換條件、結果狀態n。
Module1-3:將狀態信息表中描述的結束狀態作為出口點狀態,識別所有能轉換到該狀態下的操作對應的狀態及轉化條件,針對每一個操作生成一個出口四元組合:“結果狀態”“轉換條件”“可執行的操作”“出口點狀態”。
2)聯鎖狀態轉換模塊,將1)描述的所有四元組合拼接起來,形成一棵以入口點狀態為起點,出口點狀態為結束點的中間連接若干結果狀態,并帶有轉換條件和可執行操作的樹形網狀結構。如圖2所示,具體步驟如下[7]。

圖2 樹形網狀結構生成邏輯Fig.2 Tree network structure generation logic
定義任意一個四元組合中,第一個狀態為源狀態,第三個狀態為目標狀態。
S1:尋找所有包含入口點狀態的四元組合,確定目標狀態和源狀態,每一個四元組合循環執行以下搜索。
S2:以S1步驟中找到的每一個四元組合的目標狀態為搜索起點,在所有四元組合中搜索以該目標狀態為源狀態的所有四元組合,并記錄四元組合中的轉換條件和可執行操作。
S3:若S2中搜索到的四元組合中的目標狀態包含結果狀態或者目標狀態或者源狀態在前一次的搜索結果中出現,則以該四元組合的目標狀態為源狀態的搜索結束,將本次搜索的內容組合起來形成一個分支。
S4:若S3搜索未結束,取下一個四元組合繼續S2步搜索,直到所有三元S1中描述的所有四元組合搜索完成。
S5:S4執行完成后,將S3中組合起來的若干分支合并,形成一棵以入口點狀態為起點,出口點狀態為結束點的中間連接若干結果狀態,并帶有轉換條件和可執行操作的樹形網狀結構[8]。
測試用例生成階段是指解析狀態信息處理階段得到的樹形網狀結構,生成抽象的測試用例,根據抽象測試用例中的每個四元組合的源狀態、轉換條件、可執行操作和目標狀態,注入實際車站數據,生成實例化的測試用例。
在得到具體的測試用例前,必須要有符合邏輯的狀態轉換過程作為對應的輸出,因此必須要生成抽象的測試用例。
抽象測試用例生成過程中不考慮遷移的條件,只考慮所有的狀態轉化過程。采用狀態覆蓋準則生成的用例會遺漏很多過程,嚴重影響測試質量,為了保證測試用例的完備性,必須要能夠覆蓋到所有遷移條件。在遷移覆蓋準則的前提下,設計深度優先搜索算法,解析聯鎖狀態轉換模型得到的樹形結構。
1)以樹形結構中每個四元組合的入口點狀態為起點,取出每個入口點包含的所有分支;
2)解析每條分支中包含的n個四元組合,其中第一個四元組合的源狀態必須是入口點狀態,第二個四元組合源狀態為第一個四元組合的目標狀態,第三個四元組合源狀態為第二個四元組合的目標狀態,依次類推,第n個四元組合的源狀態為第n-1個四元組合的目標狀態,第n個四元組合的目標狀態為出口點狀態或者第1個到第n-1個四元組合中出現過的目標狀態或者源狀態;
3)將步驟2)中每條分支得到的所有狀態按四元組合出現的順序組合在一起,構成一條抽象測試用例[9]。
根據JAVA語言提供的反射機制,動態調用類中的函數和方法,結合模型的建立情況,為模型中的每個模板建立一個類。該類中包含模型中所有遷移涉及到的方法,每個方法有關的輸入通過該方法返回,以便在對模型解析時能夠得到具體的輸入,具體過程如下:
1)取4.1中得到的抽象測試用例,取出抽象用例得到所有狀態信息,并結合樹形結構,獲取狀態之間的聯鎖條件及可執行的操作;
2)利用JAVA反射機制解析步驟1)中抽象用例的聯鎖條件和可執行操作,注入實際車站數據,將適用于所有站的轉換條件和可執行操作以實際站的數據中描述的元素來替代;
3)將步驟2)中解析好的聯鎖條件和可執行操作按步驟1)中取出的抽象測試用例中的四元組合順序條件到抽象用例的源狀態和目標狀態之間,構成一條可執行的實例化的測試用例;
4)每個抽象案例對應軟件的一個測試用例,解析所有的抽象測試用例,最終生成軟件所有的測試用例[10]。
安全軟件潛在的危險性對系統可靠性有很大影響,本文提出了一種基于模型的聯鎖軟件測試用例生成方法。以鐵路信號系統中的安全軟件計算機聯鎖系統部分設計過程為實例,根據軟件的需求規范和可能影響軟件安全的環境因素著手,建立聯鎖安全軟件的狀態機模型,來生成測試用例,在一定程度上提高了軟件測試的可靠性,將傳統測試軟件的方法由黑盒測試逐步轉化為白盒測試,有效地避免了由于軟件的保密性而造成軟件內部運行程序的不可靠性引起測試不全面的問題。