《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 設(shè)計(jì)應(yīng)用 > 一種面向狀態(tài)COM組件的測(cè)試用例生成方法
一種面向狀態(tài)COM組件的測(cè)試用例生成方法
來(lái)源:微型機(jī)與應(yīng)用2010年第10期
吳 忠
(江西方興科技有限公司 技術(shù)部,江西 南昌330025)
摘要: 基于組件的開(kāi)發(fā)方法提高了軟件的可復(fù)用性和軟件開(kāi)發(fā)效率,但組件具有的封裝和狀態(tài)特性增加了組件和基于組件軟件的測(cè)試難度。依據(jù)組件的狀態(tài)特性,在組件中引入狀態(tài)性概念,將組件分為非狀態(tài)組件和狀態(tài)組件。對(duì)具有不同特征的組件進(jìn)行有針對(duì)性的測(cè)試。對(duì)于狀態(tài)組件,除使用非狀態(tài)組件的測(cè)試方法外,還定義了擴(kuò)展鄰接表和擴(kuò)展約束對(duì)照表來(lái)存儲(chǔ)狀態(tài)信息,并結(jié)合基于流的測(cè)試方法來(lái)產(chǎn)生方法序列測(cè)試用例及腳本。在理論研究的基礎(chǔ)上開(kāi)發(fā)出COM(Component Object Model)組件測(cè)試用例及腳本自動(dòng)生成系統(tǒng),驗(yàn)證了測(cè)試用例及腳本生成方法的有效性。
Abstract:
Key words :

摘  要: 基于組件的開(kāi)發(fā)方法提高了軟件的可復(fù)用性和軟件開(kāi)發(fā)效率,但組件具有的封裝和狀態(tài)特性增加了組件和基于組件軟件的測(cè)試難度。依據(jù)組件的狀態(tài)特性,在組件中引入狀態(tài)性概念,將組件分為非狀態(tài)組件和狀態(tài)組件。對(duì)具有不同特征的組件進(jìn)行有針對(duì)性的測(cè)試。對(duì)于狀態(tài)組件,除使用非狀態(tài)組件的測(cè)試方法外,還定義了擴(kuò)展鄰接表和擴(kuò)展約束對(duì)照表來(lái)存儲(chǔ)狀態(tài)信息,并結(jié)合基于流的測(cè)試方法來(lái)產(chǎn)生方法序列測(cè)試用例及腳本。在理論研究的基礎(chǔ)上開(kāi)發(fā)出COM(Component Object Model)組件測(cè)試用例及腳本自動(dòng)生成系統(tǒng),驗(yàn)證了測(cè)試用例及腳本生成方法的有效性。
關(guān)鍵詞: COM組件;組件測(cè)試;狀態(tài)組件;測(cè)試用例

    目前基于組件的軟件工程(CBSE)已成為軟件工程領(lǐng)域的研究熱點(diǎn)[1,2,4]。CBSE是從面向?qū)ο蟮拈_(kāi)發(fā)方法發(fā)展而來(lái),其特點(diǎn)是能夠?qū)崿F(xiàn)組件的重用,使組件實(shí)現(xiàn)“即插即用”,縮短軟件開(kāi)發(fā)周期,降低開(kāi)發(fā)維護(hù)成本。各種新型組件開(kāi)發(fā)技術(shù)進(jìn)一步提高了組件開(kāi)發(fā)效率及組件性能,但組件的一系列問(wèn)題始終沒(méi)有得到較好的解決。狀態(tài)組件是COM組件中另一類非常重要、使用非常廣泛的組件。由于狀態(tài)組件具有狀態(tài)特性,對(duì)狀態(tài)組件的測(cè)試要求也更高,難度也更大。
    本文將在非狀態(tài)組件分析的基礎(chǔ)上,針對(duì)狀態(tài)組件的特性進(jìn)行研究。將詳細(xì)分析狀態(tài)組件與擴(kuò)展有限狀態(tài)機(jī)的共性,并結(jié)合狀態(tài)組件的狀態(tài)特性及方法調(diào)用序列要求,分析兩者間的關(guān)聯(lián)性。通過(guò)將狀態(tài)組件轉(zhuǎn)換為等價(jià)的擴(kuò)展有限狀態(tài)機(jī),并將信息存儲(chǔ)在自定義的擴(kuò)展鄰接表和擴(kuò)展約束對(duì)照表中,再結(jié)合有向圖的遍歷算法來(lái)產(chǎn)生測(cè)試方法序列。方法序列中單個(gè)接口成員函數(shù)的測(cè)試用例的生成,采用非狀態(tài)組件中使用的測(cè)試用例生成方法。
1 狀態(tài)組件與狀態(tài)機(jī)
    由于狀態(tài)組件與有限狀態(tài)機(jī)存在狀態(tài)特性上的相似性[1-3],因而在狀態(tài)組件測(cè)試用例生成方法中引入了擴(kuò)展有限狀態(tài)機(jī)。
    有限狀態(tài)機(jī)FSM(Finite State Machine),已經(jīng)成為需求規(guī)格說(shuō)明的一種相當(dāng)于標(biāo)準(zhǔn)的表示方法[5,6]。在很多結(jié)構(gòu)化分析中都使用了某種形式的有限自動(dòng)機(jī),而且在絕大多數(shù)的面向?qū)ο蠓治鲋袕V泛使用。
    在現(xiàn)有的軟件測(cè)試領(lǐng)域經(jīng)常使用的狀態(tài)機(jī)是在原始狀態(tài)機(jī)的基礎(chǔ)上經(jīng)過(guò)改造的擴(kuò)展?fàn)顟B(tài)機(jī)EFSM(Extended FSM)[7]。EFSM可定義為一個(gè)5元組:EFSM=<∑,S,T,Γ,s0>,其中∑是狀態(tài)機(jī)接受的輸入集合;S是狀態(tài)機(jī)的狀態(tài)集合;Γ是邏輯表達(dá)式集合;T是轉(zhuǎn)換集合,T=∑×S×S×Γ,表示狀態(tài)機(jī)處于一個(gè)起始狀態(tài),s1∈S時(shí),接收到一個(gè)輸入e∈∑,而且滿足條件λ∈Γ,那么狀態(tài)機(jī)的狀態(tài)將變成s2∈S;s0∈S是狀態(tài)機(jī)的初始狀態(tài)集。
    由狀態(tài)組件的特性分析和有限狀態(tài)機(jī)的介紹可知,狀態(tài)組件與擴(kuò)展有限狀態(tài)機(jī)有很大的關(guān)聯(lián)性,具體體現(xiàn)在以下幾個(gè)方面:
    (1)狀態(tài)組件的接口成員方法一般都有輸入?yún)?shù),而對(duì)沒(méi)有輸入?yún)?shù)的接口成員函數(shù),可以將輸入?yún)?shù)置為空。這些輸入?yún)?shù)與有限狀態(tài)機(jī)中的輸入集∑具有一致性,因此可以認(rèn)為方法的輸入?yún)?shù)對(duì)組成了狀態(tài)組件的輸入集∑。
    (2)狀態(tài)組件的接口成員函數(shù)組成的函數(shù)方法集合[8],與有限狀態(tài)機(jī)的狀態(tài)相似,都是一類事物的集合,具有關(guān)聯(lián)性??梢詫顟B(tài)組件的接口成員函數(shù)方法抽象成一種特定的擴(kuò)展?fàn)顟B(tài)S′。這些擴(kuò)展?fàn)顟B(tài)組成的集合便可以構(gòu)成一個(gè)擴(kuò)展?fàn)顟B(tài)集S。
    (3)一些方法的后置斷言有相應(yīng)的后置斷言條件,這些后置斷言條件約束了方法可以轉(zhuǎn)換到哪一個(gè)后序方法上。這與擴(kuò)展?fàn)顟B(tài)機(jī)中的Γ是一致的。因此可以將這些后置斷言條件組成的集合當(dāng)作Γ。
    (4)當(dāng)一個(gè)初始方法M1完成后,在滿足一定的后置斷言條件時(shí),可以根據(jù)后置斷言和后置斷言方法的輸入?yún)?shù),轉(zhuǎn)移到下一個(gè)方法上。這與擴(kuò)展?fàn)顟B(tài)機(jī)中的T轉(zhuǎn)換集合也是一致的。
    (5)另外,狀態(tài)組件有一些接口成員方法沒(méi)有前置斷言,即可以被直接調(diào)用而沒(méi)有特定的要求。可以認(rèn)為這些沒(méi)有前置斷言的方法是一種初始狀態(tài)方法集,即對(duì)應(yīng)于擴(kuò)展?fàn)顟B(tài)機(jī)中的s0。
    由上述關(guān)聯(lián)性分析可知,可以將狀態(tài)組件的方法轉(zhuǎn)換為有限狀態(tài)機(jī)中的狀態(tài),而方法之間約束條件可以轉(zhuǎn)換為有限狀態(tài)機(jī)各狀態(tài)之間的轉(zhuǎn)移,其具體的對(duì)照形式如圖1所示。

    綜上所述,可以充分地認(rèn)為狀態(tài)組件可以轉(zhuǎn)換為等效的擴(kuò)展有限狀態(tài)機(jī)模型。這樣可以通過(guò)擴(kuò)展用于存儲(chǔ)擴(kuò)展有限狀態(tài)機(jī)信息的擴(kuò)展鄰接表來(lái)存儲(chǔ)狀態(tài)組件的信息。
2 狀態(tài)組件測(cè)試用例生成
    在將狀態(tài)組件的信息轉(zhuǎn)換為擴(kuò)展有限狀態(tài)機(jī),并存入擴(kuò)展鄰接表和擴(kuò)展約束對(duì)照表中后,可以通過(guò)有向圖的相關(guān)性質(zhì)來(lái)遍歷狀態(tài)組件所有方法轉(zhuǎn)換,以此產(chǎn)生方法調(diào)用序列集。狀態(tài)組件接口成員方法序列集的生成過(guò)程分為兩個(gè)步驟:第一步是產(chǎn)生初始的方法序列集(算法1);由于第一步產(chǎn)生方法序列集中可能會(huì)存在冗余,因此第二步是去除初始方法序列集中的冗余方法序列,生成最終狀態(tài)組件接口成員方法序列集(算法2)。
    算法1:初始方法序列集的生成算法
    輸入:最大循環(huán)數(shù)MaxCircle,狀態(tài)組件的擴(kuò)展鄰接表ExternAdjacencyTable,擴(kuò)展約束對(duì)照表ExternConditionTable
    輸出:初始方法序列集SequencesList
    {
        foreach(head∈ExternAdjacencyTable.ExternAdjacency-
Head)
        if(head is start method)
            CreateSequence(head,head.name);
    }
    CreateSequence(ExternAdjacencyHead head,string sequence)
    {
        foreach(conn∈head.Connections)
        {
        TempSequence=sequence;
        TempHead=ExternAdjacencyHead[conn.MethodNum];
        if(TempHead.visittime<MaxCircle)
        {
            TempSequence+=conn.postConditionID+
TempHead.methodname;
            TempHead.visittime++;
            if(TempHead is end method)
                Add TempSequence into SequencesList;
            if(TempHead has connections)
                CreateSequence(TempHead,TempSequence);
        }
        }
    }
    算法的時(shí)間復(fù)雜度主要由初始方法的數(shù)量M以及方法的間轉(zhuǎn)移的邊數(shù)E決定。每一個(gè)初始方法都要完成一遍所有邊的掃描,因此算法的時(shí)間復(fù)雜度為O(M×E)。
    算法2:方法序列集約簡(jiǎn)算法
    輸入:初始方法序列集SequencesList
    輸出:最終方法序列集Sequences
    {
        foreach(tempSequence∈SequencesList)
        {
        I=0;
        foreach(tempSequence2∈SequencesList)
        {
            if(tempSequence2 contains tempSequence)
                I++;
            if(I>1)
                break;
        }
        if(I>1)
            continue;
        else
          Add tempSequence into Sequences;
        }
    }
    算法時(shí)間復(fù)雜度由兩個(gè)foreach循環(huán)決定,兩個(gè)循環(huán)都將掃描一遍初始方法序列集,因此算法時(shí)間復(fù)雜度O(n2)。
3 系統(tǒng)實(shí)現(xiàn)及分析
    由前面的介紹可知,COM組件測(cè)試用例及腳本生成子系統(tǒng)從組件的信息說(shuō)明文檔中提取基本信息,再針對(duì)狀態(tài)組件和非狀態(tài)組件的不同特性分別進(jìn)行測(cè)試用例的設(shè)計(jì)。
    對(duì)于非狀態(tài)組件會(huì)將單個(gè)接口成員函數(shù)的參數(shù)按二元組合覆蓋產(chǎn)生的測(cè)試用例直接用于生成測(cè)試腳本;而對(duì)于狀態(tài)組件,二元組合覆蓋產(chǎn)生的測(cè)試用例會(huì)用于填充接口成員函數(shù)方法序列中的相應(yīng)函數(shù),因此測(cè)試用例文檔中會(huì)比非狀態(tài)組件的測(cè)試用例多一個(gè)TYPE字段。在完成了測(cè)試用例和方法序列集的準(zhǔn)備后,使用腳本生成模塊來(lái)完成測(cè)試腳本的自動(dòng)化生成及編譯工作。COM組件測(cè)試用例及腳本生成系統(tǒng)的結(jié)構(gòu)如圖2所示。

    測(cè)試用例生成子系統(tǒng)關(guān)鍵實(shí)現(xiàn)技術(shù)主要有以下兩項(xiàng):
    (1)信息存儲(chǔ)與提取——XML技術(shù)
    可擴(kuò)展標(biāo)記語(yǔ)言XML近年來(lái)被許多行業(yè)廣泛采用。組件信息、邊界值信息以及測(cè)試數(shù)據(jù)等的存儲(chǔ)都采用了XML文檔的形式。使用XML來(lái)定義自己的數(shù)據(jù)信息存儲(chǔ)格式,可以按照要求靈活地變更和修改。而且.NET提供了豐富的操作接口,可以方便、靈活地使用XML。
    (2)測(cè)試腳本自動(dòng)生成——反射機(jī)制和CodeDOM技術(shù)
    反射機(jī)制(Reflection)是一種運(yùn)行時(shí)機(jī)制,允許代碼在運(yùn)行時(shí)獲得數(shù)據(jù)類型信息,即代碼在運(yùn)行時(shí)可以獲得一個(gè)變量的數(shù)據(jù)類型。不僅如此,代碼運(yùn)行時(shí)還可以獲得類的成員屬性、方法、域和構(gòu)造器等許多信息。測(cè)試用例生成子系統(tǒng)通過(guò)按照測(cè)試驅(qū)動(dòng)器自定義的用戶屬性來(lái)提供測(cè)試腳本,這包括類型屬性[TestFixture]、開(kāi)始函數(shù)屬性[SetUp]、終止函數(shù)屬性[TearDown]以及測(cè)試函數(shù)屬性[Test]等。按要求生成的測(cè)試腳本在編譯成測(cè)試程序集后,驅(qū)動(dòng)器可以根據(jù)約定去查找具有相應(yīng)屬性的元素進(jìn)行調(diào)度。這也是與動(dòng)態(tài)監(jiān)控和錯(cuò)誤注入的一個(gè)接口約定。
    CodeDOM技術(shù):.NET Framework中用CodeDOM以一種語(yǔ)言中立的方式來(lái)表示源代碼文檔。通過(guò)CodeDOM創(chuàng)建對(duì)象圖,然后使用特定于某種語(yǔ)言的CodeDomProvider類的派生類產(chǎn)生相應(yīng)語(yǔ)言的測(cè)試腳本,最后編譯生成測(cè)試用例集。COM組件測(cè)試腳本到測(cè)試程序集的生成流程如圖3所示。

    對(duì)于狀態(tài)組件,采用擴(kuò)展鄰接表來(lái)存儲(chǔ)狀態(tài)組件的狀態(tài)信息,通過(guò)有向圖的遍歷算法自動(dòng)產(chǎn)生方法序列,這樣大大的提高了方法序列集生成的效率。同時(shí)在程序中加入了對(duì)循環(huán)的控制,并對(duì)有重復(fù)的方法序列進(jìn)行了約簡(jiǎn),大大的減少了測(cè)試序列集的數(shù)量,并保證了測(cè)試的有效性不會(huì)隨之降低。表1展示了典型組件約簡(jiǎn)前后的方法序列數(shù)量的對(duì)照關(guān)系,可以看出約簡(jiǎn)后的方法序列數(shù)量較約簡(jiǎn)前有了顯著的減少。

    通過(guò)IPO算法生成的測(cè)試用例可以有效觸發(fā)COM組件中的錯(cuò)誤,例如針對(duì)COM組件PDG2.dll的接口成員函數(shù)Register()生成測(cè)試用例及腳本,在編譯成程序集后供驅(qū)動(dòng)器使用,可以監(jiān)測(cè)到錯(cuò)誤異常。
    狀態(tài)組件是組件中經(jīng)常使用的一類組件,狀態(tài)特性的引入使得其測(cè)試更加的復(fù)雜化,測(cè)試用例生成的要求更高、代價(jià)也更大。本文通過(guò)分析狀態(tài)組件的特性及其與擴(kuò)展有限狀態(tài)機(jī)的相關(guān)性介紹,結(jié)合自定義的擴(kuò)展鄰接表和擴(kuò)展約束對(duì)照表等存儲(chǔ)結(jié)構(gòu),較好地實(shí)現(xiàn)了狀態(tài)組件測(cè)試方法序列用例及腳本的生成,也使得狀態(tài)組件的測(cè)試代價(jià)大大降低、測(cè)試效率顯著提高。
參考文獻(xiàn)
[1] ALI Y D,UYAR M U.A method enabling feasible conformance test sequence generation for EFSM models[J]. IEEE Transactions on Computers,2004,53(5):614-627.
[2] 蔣凡,魏蓉,鄶吉豐.基于擴(kuò)展有限狀態(tài)機(jī)測(cè)試序列生成方法研究[J].計(jì)算機(jī)工程與應(yīng)用,2007,43(7):62-64.
[3] 戰(zhàn)德臣,王忠杰,徐曉飛.基于XML的組件標(biāo)準(zhǔn)化描述[J].計(jì)算機(jī)工程與應(yīng)用,2003,39(4):89-92.
[4] 劉永紅.構(gòu)件及基于構(gòu)件的軟件測(cè)試研究[D].中科院成都計(jì)算機(jī)應(yīng)用研究所,2006.
[5] 趙明華,陳榕,王小鴿.基于元數(shù)據(jù)的構(gòu)件自動(dòng)測(cè)試技術(shù) 研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(10):1731-1736.
[6] CHANG Liu,RICHARDSON D.Software components with  retrospectors[C].In Proceedings of International Workshop on  the Role of Software Architecture in Testing and Analysis,1998:63-68.
[7] RAKESH S,DAVID C,PAUL S.A passive test oracle using a Component’s API[C].Proceedings of the 12th Asia Pacific Software Engineering Conference(APSEC’05),2005:561-567.
[8] 楊建軍,陳衛(wèi)東,葉澄清,等.面向組件的接口變異測(cè)試方法[J].浙江大學(xué)學(xué)報(bào)(工學(xué)版),2003,37(2):129-133.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。