遺傳算法在黑盒測試中的應(yīng)用
摘要:提出了一種利用遺傳算法幫助測試人員在較短時(shí)間內(nèi)完成軟件模塊的黑盒測試,并給出測試結(jié)果和好的測試用例的方法。
本文引用地址:http://m.butianyuan.cn/article/255650.htm關(guān)鍵詞:遺傳算法 測試用例 耦合度
在軟件測試中,黑盒測試主要是針對(duì)模塊進(jìn)行的功能測試。最普遍的方法是以軟件的功能說明書為基礎(chǔ)將軟件的輸入劃分為若干個(gè)等價(jià)類,多次運(yùn)行該軟件來檢驗(yàn)軟件對(duì)于不同的等價(jià)類是否能滿足要求。但是在實(shí)際應(yīng)用中,有的模塊太大或輸入?yún)?shù)太多,等價(jià)類劃分后需要進(jìn)行的測試工作可能是一個(gè)極大的任務(wù)。這時(shí),如何選擇最優(yōu)的測試用例就成為測試人員的一個(gè)重要任務(wù)。
遺傳算法是模仿生物遺傳和進(jìn)化機(jī)制的一種最優(yōu)化方法,它把類似于遺傳基因的一些行為,如交叉重組、變異、選擇和淘汰等引入到算法求解的改進(jìn)過程中。遺傳算法的特點(diǎn)之一是,它同時(shí)保留著若干局部最優(yōu)解,通過交叉重組或者解的變異來尋求更好的解。與貪婪算法相比,遺傳算法更可能找到全局最優(yōu)解,而貪婪算法則容易限于局部最優(yōu)而達(dá)不到全局最優(yōu)。
如果能夠?qū)⑦z傳算法有效地運(yùn)用于黑盒測試中,幫助測試人員選擇最優(yōu)的測試用例,那么將給測試工作帶來極大的幫助。
1 應(yīng)用方法
在設(shè)計(jì)具體的算法之前,我們先介紹遺傳算法的基本算法,其算法框架如下[1]:
第一步,初始化:選?。饌€(gè)候選解作為初始解,把其中最好的解作為暫定(最優(yōu))解。
第二步,解的改進(jìn):若滿足終止條件,輸出暫定解,算法終止。否則,進(jìn)行以下的運(yùn)算:
(1)解的交叉重組:從p個(gè)解中選出兩個(gè)或兩個(gè)以上的解進(jìn)行交叉重組,得到新解,重復(fù)該運(yùn)算若干次。
(2)解的變異:在候選解中隨機(jī)加進(jìn)一些變異,產(chǎn)生新解。
(3)局部搜索:對(duì)新產(chǎn)生的解用局部搜索法進(jìn)行改良。若能得到比候選解更好的解,更新候選解。
(4)從全部解中按一定的準(zhǔn)則選出p個(gè)解作為下一代的候選解,更新暫定解。
轉(zhuǎn)第二步。
了解了遺傳算法的算法框架后,進(jìn)一步要做的就是在軟件的黑盒測試中,如何將不同的等價(jià)類轉(zhuǎn)變?yōu)檫z傳算法的候選解, 如何設(shè)定解的優(yōu)劣標(biāo)準(zhǔn),如何設(shè)置合適的終止條件。
我們假定一個(gè)軟件模塊的輸入?yún)?shù)有5個(gè):A、B、C、D、E,經(jīng)過合理的等價(jià)類劃分后,每個(gè)參數(shù)又有5個(gè)不同的等價(jià)類:A1~A5,......,E1~E5。我們采用一個(gè)廣義的遺傳算法候選解概念,一般的遺傳算法往往將候選解形式定為二進(jìn)制的數(shù)據(jù)串,比如:111010、010001等等,而在不同等價(jià)類輸入作為候選解時(shí)我們將候選解形式定為(按照上面假定為基礎(chǔ)):A3B1C2D4E5、A2B2C4D1E3等等。這樣我們解決了候選解的問題,在解的優(yōu)劣標(biāo)準(zhǔn)以及終止條件的設(shè)定問題上,我們需要借助工具作為標(biāo)準(zhǔn)。
軟件測試的目的是提高軟件的可靠性,終止條件當(dāng)然是軟件達(dá)到了測試的目的及要求。而解的優(yōu)劣標(biāo)準(zhǔn)正好與軟件質(zhì)量相反,即軟件失效幾率越大,這個(gè)測試用例(一個(gè)輸入的解)越優(yōu)。文獻(xiàn)2中結(jié)合北大的青鳥黑盒測試環(huán)境提出了一種基于測試執(zhí)行的失效數(shù)據(jù)模型JBFDM(Jade Bird failure data model)。利用該模型我們可以做到[2]:
(1)提供一致的失效數(shù)據(jù)建模、收集及管理的可靠性度量過程,從而支持可靠性度量;
(2)利用測試及軟件現(xiàn)場收集的數(shù)據(jù)來評(píng)價(jià)測試計(jì)劃、操作概圖及測試方法的有效性。
軟件測試的目的是發(fā)現(xiàn)錯(cuò)誤,在黑盒測試中,錯(cuò)誤表現(xiàn)的形式是軟件失效。但是由于軟件錯(cuò)誤并不是軟件失效的充分條件,換句話說,并不是所有錯(cuò)誤都會(huì)在測試或運(yùn)行時(shí)暴露,所以黑盒測試的目的就是盡可能的通過運(yùn)行測試用例使軟件失效而發(fā)現(xiàn)錯(cuò)誤。在我們對(duì)測試用例的評(píng)價(jià)時(shí),用以下的數(shù)據(jù)表示測試用例的優(yōu)劣:
A=P+λ/M+μ×F
其中A表示遺傳算法中的適應(yīng)度Adaptation,P表示該測試用例在實(shí)際中發(fā)生的幾率Probability,M表示平均失效時(shí)間(MTTF),F表示失效等級(jí)。因?yàn)闇y試是針對(duì)使用的,所以發(fā)生幾率高的測試用例適應(yīng)度高就不難理解了;而M——平均失效時(shí)間越長,該測試用例應(yīng)該不容易發(fā)現(xiàn)軟件的錯(cuò)誤,所以A越低;F則表示某些特殊情況發(fā)生使軟件嚴(yán)重失效(比如造成死機(jī)、損壞儀器等等),此時(shí)該測試用例以及其后代必須被重點(diǎn)關(guān)注,所以此時(shí)A越大。λ、μ是相應(yīng)于各個(gè)具體的被測試軟件模塊而定的系數(shù)。在實(shí)際應(yīng)用中,由于軟件失效的可能性不是特別大,所以遺傳結(jié)果往往是發(fā)生幾率高的測試用例后代較多。所以我們應(yīng)該針對(duì)具體被測試軟件設(shè)計(jì)準(zhǔn)確的發(fā)生概率產(chǎn)生算法。具體算法框架如圖1所示。
對(duì)于該算法的說明如下:
*1.每一個(gè)輸入?yún)?shù)往往有一個(gè)幾率(可以事先定義),可以簡單相加來求得該測試用例的概率。但是在輸入?yún)?shù)有較強(qiáng)相關(guān)性時(shí),此方法并不能準(zhǔn)確求得某個(gè)測試用例的發(fā)生概率,一個(gè)解決辦法是設(shè)置輸入?yún)?shù)的相關(guān)耦合度。在遺傳算法的交叉、變異時(shí)其同時(shí)進(jìn)行的幾率與相關(guān)耦合度成正比,即對(duì)于相關(guān)耦合度高的輸入?yún)?shù),它們同時(shí)進(jìn)行交叉、變異的幾率高,反之則低。
*2.檢驗(yàn)是否滿足測試要求時(shí),需要先設(shè)置一個(gè)計(jì)數(shù)器。每運(yùn)行一個(gè)新的測試用例,測試計(jì)數(shù)器加一。當(dāng)發(fā)現(xiàn)第一次失效或故障時(shí),計(jì)數(shù)器加二。若產(chǎn)生的遺傳后代又使軟件發(fā)生失效,則計(jì)數(shù)器加22。同理遞推,當(dāng)遺傳算法產(chǎn)生的測試用例連續(xù)n次使軟件失效,則計(jì)數(shù)器加2n。同時(shí),記錄所有的測試情況(此工作由外圍的測試環(huán)境完成,比如北大的青鳥黑盒測試環(huán)境)。如果出現(xiàn)嚴(yán)重錯(cuò)誤則終止測試,進(jìn)行對(duì)程序的檢查。如果連續(xù)k代測試用例的遺傳后代都運(yùn)行良好,計(jì)數(shù)器的值加2k。k的值由具體被測試軟件的等價(jià)類數(shù)量、輸入?yún)?shù)個(gè)數(shù)等決定。當(dāng)測試計(jì)數(shù)器的值達(dá)到所有黑盒測試用例等價(jià)類的數(shù)值時(shí)(對(duì)于我們上面所舉的例子,該值為55=3125),結(jié)束測試。當(dāng)生成的孫子代、子代與父母代三代完全相同時(shí),算法也必須結(jié)束,因?yàn)榇藭r(shí)測試不會(huì)有新的結(jié)果。所以我們還要設(shè)置一個(gè)結(jié)束條件。而且該條件強(qiáng)于計(jì)數(shù)器條件。
*3.每一組測試用例可以生成多個(gè)測試用例,根據(jù)適應(yīng)度函數(shù)大小決定留下哪些測試用例組成新的測試用例組。
從上面的算法框圖和說明可以看出,如果某測試用例使軟件的運(yùn)行發(fā)生了問題(即某個(gè)軟件錯(cuò)誤發(fā)作),它的后代也同樣受困于該軟件錯(cuò)誤,算法很快能發(fā)現(xiàn)這些最佳測試用例并給出結(jié)果。測試人員就可以將它們交給開發(fā)人員解決這些問題。若軟件本身確實(shí)質(zhì)量優(yōu)良,這些測試用例及其不同的后代無法發(fā)現(xiàn)失效,算法也能盡快結(jié)束,而不是完成所有測試用例(雖然從理論上,我們希望測試盡可能運(yùn)行所有測試用例)。
2 效果
上節(jié)的算法,相對(duì)于運(yùn)行所有測試用例,并沒有比較明顯的優(yōu)點(diǎn)。尤其對(duì)于測試來說,算法并沒有加速運(yùn)行測試用例,好象還降低了運(yùn)行速度。其實(shí)算法本身的確不是用來加速運(yùn)行測試用例的,其目的是找到一組最佳測試用例。因?yàn)閷?shí)際上對(duì)于很多模塊運(yùn)行所有測試用例或哪怕是所有等價(jià)類都是幾乎不可能的。
以上一節(jié)舉的例子做說明,其輸入等價(jià)類大致有55=3125。如果一個(gè)模塊有10個(gè)輸入、每個(gè)輸入有10種等價(jià)類,那么輸入等價(jià)類為1010。按運(yùn)行一個(gè)等價(jià)類需要1分鐘計(jì)算(很多循環(huán)運(yùn)行模塊可能不止1分鐘),需要幾個(gè)月才能運(yùn)行一遍所有等價(jià)類。這時(shí),運(yùn)用遺傳算法的優(yōu)勢就體現(xiàn)出來了。
綜上所述,本文提出了一種利用遺傳算法尋求最佳測試用例的測試方法原理。它能在較短時(shí)間內(nèi)完成軟件模塊的黑盒測試并給出測試結(jié)果和好的測試用例。利用該算法原理,可以在測試集成環(huán)境中做一些設(shè)置或修改測試集成環(huán)境,這樣可以大大提高測試工作的效率。
評(píng)論