彭麗維,宋鵬飛,江雪瑩,謝 林
(1.卡斯柯信號(成都)有限公司,成都 610083;2.卡斯柯信號有限公司,上海 200071)
隨著科技飛速發(fā)展,軌道交通等領(lǐng)域軟件的復(fù)雜性和規(guī)模性越來越高,保證這些軟件的可靠性和安全性有重要意義。軟件測試是保證軟件質(zhì)量的重要環(huán)節(jié)和依據(jù)[1],然而,軟件測試工作是一項(xiàng)費(fèi)時費(fèi)力的活動,軟件測試成本日益增加。因此,如何高效、正確、快速地對軟件進(jìn)行測試逐漸成為研究的主流方向。
文獻(xiàn)[2]著重介紹了分塊劃分的原理,分析節(jié)點(diǎn)和分區(qū)兩種類型的模塊結(jié)構(gòu),將所有的代碼分成若干個模塊,分別在測試引擎中編譯鏈接每個模塊,并將結(jié)果存儲在臨時數(shù)據(jù)庫中。測試引擎將自動測試模塊和額外的可執(zhí)行程序結(jié)合起來,使得測試工具可以根據(jù)新的測試需求和不同的測試標(biāo)準(zhǔn)來實(shí)時進(jìn)行測試。利用上述原理設(shè)計(jì)了計(jì)算機(jī)輔助軟件測試工具。文獻(xiàn)[3]將軟件的檢驗(yàn)和驗(yàn)證(V&V)與商業(yè)計(jì)算機(jī)輔助軟件工具(CASE)結(jié)合,在實(shí)時的硬件環(huán)境下循環(huán)測試,相比于傳統(tǒng)的CASE,在軟件測試方面增加了Matlab需求仿真工具箱、逆向工程工具箱、生成單元測試程序工具箱和在線幫助以及信息輔助控制,實(shí)例證明在很大程度上減少了測試所需時間和物力。
楊波等從軟件的需求分析出發(fā)提出了基于需求建模的測試用例生成方法,從軟件開發(fā)的需求階段著手,利用UML建立需求元模型,再從元模型中提取出測試特征元模型,采用OCL約束對模型進(jìn)行驗(yàn)證,生成抽象測試用例[4]。
上述方案中在一定程度上提高了測試效率,但是僅針對某一種具體應(yīng)用的聯(lián)鎖軟件,測試模型通用性不強(qiáng),仍需要大量地人工編寫測試用例。
為解決上述問題,本文提出一種通用聯(lián)鎖軟件測試用例的生成方法,如圖1所示,從狀態(tài)信息表生成、狀態(tài)信息處理、測試用例生成3個階段來展開研究。根據(jù)計(jì)算機(jī)聯(lián)鎖技術(shù)條件羅列出每個階段的所有狀態(tài)及狀態(tài)之間的轉(zhuǎn)換條件和轉(zhuǎn)換關(guān)系,利用這些狀態(tài)和關(guān)系生成若干四元組合,形成聯(lián)鎖狀態(tài)轉(zhuǎn)換模型的樹形網(wǎng)狀結(jié)果,最后通過解析該樹形網(wǎng)狀結(jié)果來生成測試用例。
圖1 總體框架Fig.1 General framework
狀態(tài)信息表生成階段是指根據(jù)計(jì)算機(jī)聯(lián)鎖技術(shù)條件中描述的進(jìn)路建立、進(jìn)路鎖閉、信號開放、進(jìn)路解鎖、聯(lián)鎖結(jié)合功能和聯(lián)鎖接口功能各個階段所需的聯(lián)鎖條件,列出每個階段所有的狀態(tài)及狀態(tài)之間轉(zhuǎn)換的條件,利用聯(lián)鎖自動化工具將這些狀態(tài)和狀態(tài)之間的轉(zhuǎn)換條件輸出到狀態(tài)信息表中。
其中狀態(tài)信息表中包括所有狀態(tài)的名稱、初始狀態(tài)和結(jié)束狀態(tài),以及每個狀態(tài)下可執(zhí)行的操作、操作對應(yīng)的結(jié)果狀態(tài)和操作對應(yīng)的聯(lián)鎖條件。
針對每個階段包含若干狀態(tài),在信息表中需要指定初始狀態(tài)、結(jié)束狀態(tài)和操作對應(yīng)的結(jié)果狀態(tài),其中初始狀態(tài)和結(jié)束狀態(tài)是指從每個階段羅列出的所有狀態(tài)中,指定一個初始狀態(tài)作為后續(xù)搜索的起點(diǎn)和若干結(jié)束狀態(tài)作為后續(xù)搜索的結(jié)束條件[5]。
在狀態(tài)信息表中,每個狀態(tài)還需包含可執(zhí)行的操作和操作對應(yīng)的結(jié)果狀態(tài),這些操作和結(jié)果是通用聯(lián)鎖軟件根據(jù)先驗(yàn)閾值設(shè)定的適用于所有類型車站的通用判斷條件和操作,再結(jié)合具體站場的實(shí)際聯(lián)鎖邏輯變?yōu)榫唧w的值來進(jìn)行使用,其中操作對應(yīng)的轉(zhuǎn)化條件和狀態(tài)下可執(zhí)行的操作是一個適用于所有站型的通用條件判斷和操作,需要結(jié)合具體車站數(shù)據(jù),將通用條件判斷和操作描述用實(shí)際的站場元素來替代[6]。
狀態(tài)信息處理階段是指根據(jù)狀態(tài)信息表提供的狀態(tài)轉(zhuǎn)換名稱、結(jié)束狀態(tài)、初始化狀態(tài)及狀態(tài)下可執(zhí)行的操作及該操作對應(yīng)的結(jié)果狀態(tài),得到聯(lián)鎖狀態(tài)轉(zhuǎn)換模型,過程如下。
本階段劃分為2個模塊,分別為:狀態(tài)及條件信息組合模塊、聯(lián)鎖狀態(tài)轉(zhuǎn)換模塊,各模塊詳細(xì)處理分為以下若干步。
1)狀態(tài)及條件信息組合模塊,用3個子模塊Module1-1,Module1-2,Module1-3來表示。
Module1-1:將狀態(tài)信息表中描述的初始狀態(tài)作為入口點(diǎn)狀態(tài),識別該狀態(tài)下可執(zhí)行的所有操作,并找到操作對應(yīng)的狀態(tài)結(jié)果,操作對應(yīng)的轉(zhuǎn)化條件,針對每一個操作生成一個入口四元組合:“入口點(diǎn)狀態(tài)”“轉(zhuǎn)換條件”“可執(zhí)行的操作”“結(jié)果狀態(tài)”。
“結(jié)果狀態(tài)”可能包含多個,這里將所有的結(jié)果狀態(tài)用“結(jié)果狀態(tài)1”“結(jié)果狀態(tài)2”……“結(jié)果狀態(tài)n”來描述。
Module1-2:每一個結(jié)果狀態(tài)下也包括若干個可執(zhí)行的操作,重復(fù)Module1的操作,針對每一個結(jié)果狀態(tài)下的每個操作生成一個執(zhí)行四元組合:結(jié)果狀態(tài)1、轉(zhuǎn)換條件、結(jié)果狀態(tài)2,循環(huán)執(zhí)行Module1-2,最終生成若干個執(zhí)行四元組合:結(jié)果狀態(tài)n-1、轉(zhuǎn)換條件、結(jié)果狀態(tài)n。
Module1-3:將狀態(tài)信息表中描述的結(jié)束狀態(tài)作為出口點(diǎn)狀態(tài),識別所有能轉(zhuǎn)換到該狀態(tài)下的操作對應(yīng)的狀態(tài)及轉(zhuǎn)化條件,針對每一個操作生成一個出口四元組合:“結(jié)果狀態(tài)”“轉(zhuǎn)換條件”“可執(zhí)行的操作”“出口點(diǎn)狀態(tài)”。
2)聯(lián)鎖狀態(tài)轉(zhuǎn)換模塊,將1)描述的所有四元組合拼接起來,形成一棵以入口點(diǎn)狀態(tài)為起點(diǎn),出口點(diǎn)狀態(tài)為結(jié)束點(diǎn)的中間連接若干結(jié)果狀態(tài),并帶有轉(zhuǎn)換條件和可執(zhí)行操作的樹形網(wǎng)狀結(jié)構(gòu)。如圖2所示,具體步驟如下[7]。
圖2 樹形網(wǎng)狀結(jié)構(gòu)生成邏輯Fig.2 Tree network structure generation logic
定義任意一個四元組合中,第一個狀態(tài)為源狀態(tài),第三個狀態(tài)為目標(biāo)狀態(tài)。
S1:尋找所有包含入口點(diǎn)狀態(tài)的四元組合,確定目標(biāo)狀態(tài)和源狀態(tài),每一個四元組合循環(huán)執(zhí)行以下搜索。
S2:以S1步驟中找到的每一個四元組合的目標(biāo)狀態(tài)為搜索起點(diǎn),在所有四元組合中搜索以該目標(biāo)狀態(tài)為源狀態(tài)的所有四元組合,并記錄四元組合中的轉(zhuǎn)換條件和可執(zhí)行操作。
S3:若S2中搜索到的四元組合中的目標(biāo)狀態(tài)包含結(jié)果狀態(tài)或者目標(biāo)狀態(tài)或者源狀態(tài)在前一次的搜索結(jié)果中出現(xiàn),則以該四元組合的目標(biāo)狀態(tài)為源狀態(tài)的搜索結(jié)束,將本次搜索的內(nèi)容組合起來形成一個分支。
S4:若S3搜索未結(jié)束,取下一個四元組合繼續(xù)S2步搜索,直到所有三元S1中描述的所有四元組合搜索完成。
S5:S4執(zhí)行完成后,將S3中組合起來的若干分支合并,形成一棵以入口點(diǎn)狀態(tài)為起點(diǎn),出口點(diǎn)狀態(tài)為結(jié)束點(diǎn)的中間連接若干結(jié)果狀態(tài),并帶有轉(zhuǎn)換條件和可執(zhí)行操作的樹形網(wǎng)狀結(jié)構(gòu)[8]。
測試用例生成階段是指解析狀態(tài)信息處理階段得到的樹形網(wǎng)狀結(jié)構(gòu),生成抽象的測試用例,根據(jù)抽象測試用例中的每個四元組合的源狀態(tài)、轉(zhuǎn)換條件、可執(zhí)行操作和目標(biāo)狀態(tài),注入實(shí)際車站數(shù)據(jù),生成實(shí)例化的測試用例。
在得到具體的測試用例前,必須要有符合邏輯的狀態(tài)轉(zhuǎn)換過程作為對應(yīng)的輸出,因此必須要生成抽象的測試用例。
抽象測試用例生成過程中不考慮遷移的條件,只考慮所有的狀態(tài)轉(zhuǎn)化過程。采用狀態(tài)覆蓋準(zhǔn)則生成的用例會遺漏很多過程,嚴(yán)重影響測試質(zhì)量,為了保證測試用例的完備性,必須要能夠覆蓋到所有遷移條件。在遷移覆蓋準(zhǔn)則的前提下,設(shè)計(jì)深度優(yōu)先搜索算法,解析聯(lián)鎖狀態(tài)轉(zhuǎn)換模型得到的樹形結(jié)構(gòu)。
1)以樹形結(jié)構(gòu)中每個四元組合的入口點(diǎn)狀態(tài)為起點(diǎn),取出每個入口點(diǎn)包含的所有分支;
2)解析每條分支中包含的n個四元組合,其中第一個四元組合的源狀態(tài)必須是入口點(diǎn)狀態(tài),第二個四元組合源狀態(tài)為第一個四元組合的目標(biāo)狀態(tài),第三個四元組合源狀態(tài)為第二個四元組合的目標(biāo)狀態(tài),依次類推,第n個四元組合的源狀態(tài)為第n-1個四元組合的目標(biāo)狀態(tài),第n個四元組合的目標(biāo)狀態(tài)為出口點(diǎn)狀態(tài)或者第1個到第n-1個四元組合中出現(xiàn)過的目標(biāo)狀態(tài)或者源狀態(tài);
3)將步驟2)中每條分支得到的所有狀態(tài)按四元組合出現(xiàn)的順序組合在一起,構(gòu)成一條抽象測試用例[9]。
根據(jù)JAVA語言提供的反射機(jī)制,動態(tài)調(diào)用類中的函數(shù)和方法,結(jié)合模型的建立情況,為模型中的每個模板建立一個類。該類中包含模型中所有遷移涉及到的方法,每個方法有關(guān)的輸入通過該方法返回,以便在對模型解析時能夠得到具體的輸入,具體過程如下:
1)取4.1中得到的抽象測試用例,取出抽象用例得到所有狀態(tài)信息,并結(jié)合樹形結(jié)構(gòu),獲取狀態(tài)之間的聯(lián)鎖條件及可執(zhí)行的操作;
2)利用JAVA反射機(jī)制解析步驟1)中抽象用例的聯(lián)鎖條件和可執(zhí)行操作,注入實(shí)際車站數(shù)據(jù),將適用于所有站的轉(zhuǎn)換條件和可執(zhí)行操作以實(shí)際站的數(shù)據(jù)中描述的元素來替代;
3)將步驟2)中解析好的聯(lián)鎖條件和可執(zhí)行操作按步驟1)中取出的抽象測試用例中的四元組合順序條件到抽象用例的源狀態(tài)和目標(biāo)狀態(tài)之間,構(gòu)成一條可執(zhí)行的實(shí)例化的測試用例;
4)每個抽象案例對應(yīng)軟件的一個測試用例,解析所有的抽象測試用例,最終生成軟件所有的測試用例[10]。
安全軟件潛在的危險(xiǎn)性對系統(tǒng)可靠性有很大影響,本文提出了一種基于模型的聯(lián)鎖軟件測試用例生成方法。以鐵路信號系統(tǒng)中的安全軟件計(jì)算機(jī)聯(lián)鎖系統(tǒng)部分設(shè)計(jì)過程為實(shí)例,根據(jù)軟件的需求規(guī)范和可能影響軟件安全的環(huán)境因素著手,建立聯(lián)鎖安全軟件的狀態(tài)機(jī)模型,來生成測試用例,在一定程度上提高了軟件測試的可靠性,將傳統(tǒng)測試軟件的方法由黑盒測試逐步轉(zhuǎn)化為白盒測試,有效地避免了由于軟件的保密性而造成軟件內(nèi)部運(yùn)行程序的不可靠性引起測試不全面的問題。