遺傳演算法在黑盒測試中的應用

2021-05-18 01:18:01 字數 3144 閱讀 4075

在軟體測試中,黑盒測試主要是針對模組進行的功能測試。最普遍的方法是以軟體的功能說明書為基礎將軟體的輸入劃分為若干個等價類,多次執行該軟體來檢驗軟體對於不同的等價類是否能滿足要求。但是在實際應用中,有的模組太大或輸入引數太多,等價類劃分後需要進行的測試工作可能是乙個極大的任務。這時,如何選擇最優的測試用例就成為測試人員的乙個重要任務。

遺傳演算法是模仿生物遺傳和進化機制的一種最優化方法,它把類似於遺傳基因的一些行為,如交叉重組、變異、選擇和淘汰等引入到演算法求解的改進過程中。遺傳演算法的特點之一是,它同時保留著若干區域性最優解,通過交叉重組或者解的變異來尋求更好的解。與貪婪演算法相比,遺傳演算法更可能找到全域性最優解,而貪婪演算法則容易限於區域性最優而達不到全域性最優。

如果能夠將遺傳演算法有效地運用於黑盒測試中,幫助測試人員選擇最優的測試用例,那麼將給測試工作帶來極大的幫助。

1 應用方法

在設計具體的演算法之前,我們先介紹遺傳演算法的基本演算法,其演算法框架如下:

第一步,初始化:選取p個候選解作為初始解,把其中最好的解作為暫定(最優)解。

第二步,解的改進:若滿足終止條件,輸出暫定解,演算法終止。否則,進行以下的運算:

(1)解的交叉重組:從p個解中選出兩個或兩個以上的解進行交叉重組,得到新解,重複該運算若干次。

(2)解的變異:在候選解中隨機加進一些變異,產生新解。

(3)區域性搜尋:對新產生的解用區域性搜尋法進行改良。若能得到比候選解更好的解,更新候選解。

(4)從全部解中按一定的準則選出p個解作為下一代的候選解,更新暫定解。

轉第二步。

了解了遺傳演算法的演算法框架後,進一步要做的就是在軟體的黑盒測試中,如何將不同的等價類轉變為遺傳演算法的候選解, 如何設定解的優劣標準,如何設定合適的終止條件。

我們假定乙個軟體模組的輸入引數有5個:a、b、c、d、e,經過合理的等價類劃分後,每個引數又有5個不同的等價類:a1~a5,......,e1~e5。我們採用乙個廣義的遺傳演算法候選解概念,一般的遺傳演算法往往將候選解形式定為二進位制的資料串,比如:111010、010001等等,而在不同等價類輸入作為候選解時我們將候選解形式定為(按照上面假定為基礎):a3b1c2d4e5、a2b2c4d1e3等等。這樣我們解決了候選解的問題,在解的優劣標準以及終止條件的設定問題上,我們需要借助工具作為標準。

軟體測試的目的是提高軟體的可靠性,終止條件當然是軟體達到了測試的目的及要求。而解的優劣標準正好與軟體質量相反,即軟體失效機率越大,這個測試用例(乙個輸入的解)越優。文獻・2・中結合北大的青鳥黑盒測試環境提出了一種基於測試執行的失效資料模型jbfdm(jade bird failure data model)。利用該模型我們可以做到・2・:

(1)提供一致的失效資料建模、收集及管理的可靠性度量過程,從而支援可靠性度量;

(2)利用測試及軟體現場收集的資料來評價測試計畫、操作概圖及測試方法的有效性。

軟體測試的目的是發現錯誤,在黑盒測試中,錯誤表現的形式是軟體失效。但是由於軟體錯誤並不是軟體失效的充分條件,換句話說,並不是所有錯誤都會在測試或執行時暴露,所以黑盒測試的目的就是盡可能的通過執行測試用例使軟體失效而發現錯誤。在我們對測試用例的評價時,用以下的資料表示測試用例的優劣:

a=p+λ/m+μ×f

其中a表示遺傳演算法中的適應度adaptation,p表示該測試用例在實際中發生的機率probability,m表示平均失效時間(mttf),f表示失效等級。因為測試是針對使用的,所以發生機率高的測試用例適應度高就不難理解了;而m——平均失效時間越長,該測試用例應該不容易發現軟體的錯誤,所以a越低;f則表示某些特殊情況發生使軟體嚴重失效(比如造成宕機、損壞儀器等等),此時該測試用例以及其後代必須被重點關注,所以此時a越大。λ、μ是相應於各個具體的被測試軟體模組而定的係數。在實際應用中,由於軟體失效的可能性不是特別大,所以遺傳結果往往是發生機率高的測試用例後代較多。所以我們應該針對具體被測試軟體設計準確的發生概率產生演算法。具體演算法框架如圖1所示。

對於該演算法的說明如下:

*1.每乙個輸入引數往往有乙個機率(可以事先定義),可以簡單相加來求得該測試用例的概率。但是在輸入引數有較強相關性時,此方法並不能準確求得某個測試用例的發生概率,乙個解決辦法是設定輸入引數的相關耦合度。在遺傳演算法的交叉、變異時其同時進行的機率與相關耦合度成正比,即對於相關耦合度高的輸入引數,它們同時進行交叉、變異的機率高,反之則低。

*2.檢驗是否滿足測試要求時,需要先設定乙個計數器。每執行乙個新的測試用例,測試計數器加一。當發現第一次失效或故障時,計數器加二。若產生的遺傳後代又使軟體發生失效,則計數器加22。同理遞推,當遺傳演算法產生的測試用例連續n次使軟體失效,則計數器加2n。同時,記錄所有的測試情況(此工作由外圍的測試環境完成,比如北大的青鳥黑盒測試環境)。如果出現嚴重錯誤則終止測試,進行對程式的檢查。如果連續k代測試用例的遺傳後代都執行良好,計數器的值加2k。k的值由具體被測試軟體的等價類數量、輸入引數個數等決定。當測試計數器的值達到所有黑盒測試用例等價類的數值時(對於我們上面所舉的例子,該值為55=3125),結束測試。當生成的孫子代、子代與父母代三代完全相同時,演算法也必須結束,因為此時測試不會有新的結果。所以我們還要設定乙個結束條件。而且該條件強於計數器條件。

*3.每一組測試用例可以生成多個測試用例,根據適應度函式大小決定留下哪些測試用例組成新的測試用例組。

從上面的演算法框圖和說明可以看出,如果某測試用例使軟體的執行發生了問題(即某個軟體錯誤發作),它的後代也同樣受困於該軟體錯誤,演算法很快能發現這些最佳測試用例並給出結果。測試人員就可以將它們交給開發人員解決這些問題。若軟體本身確實質量優良,這些測試用例及其不同的後代無法發現失效,演算法也能盡快結束,而不是完成所有測試用例(雖然從理論上,我們希望測試盡可能執行所有測試用例)。

2 效果

上節的演算法,相對於執行所有測試用例,並沒有比較明顯的優點。尤其對於測試來說,演算法並沒有加速執行測試用例,好象還降低了執行速度。其實演算法本身的確不是用來加速執行測試用例的,其目的是找到一組最佳測試用例。因為實際上對於很多模組執行所有測試用例或哪怕是所有等價類都是幾乎不可能的。

以上一節舉的例子做說明,其輸入等價類大致有55=3125。如果乙個模組有10個輸入、每個輸入有10種等價類,那麼輸入等價類為1010。按執行乙個等價類需要1分鐘計算(很多迴圈執行模組可能不止1分鐘),需要幾個月才能執行一遍所有等價類。這時,運用遺傳演算法的優勢就體現出來了。

綜上所述,本文提出了一種利用遺傳演算法尋求最佳測試用例的測試方法原理。它能在較短時間內完成軟體模組的黑盒測試並給出測試結果和好的測試用例。利用該演算法原理,可以在測試整合環境中做一些設定或修改測試整合環境,這樣可以大大提高測試工作的效率。

遺傳演算法選擇測試

import numpy as np import geatpy as ea import random pop np.array 1,11,21 2,12,22 3,13,23 4,14,24 5,15,25 6,16,26 7,17,27 8,18,28 defselection pop fit...

遺傳演算法的簡單應用

遺傳演算法採用概率化的尋優方法,在大範圍內對解進行優化,不限於區域性。遺傳演算法擅長解決全域性最優化問題。基本過程可以是 1 隨機產生第一代個體 2 計算第一代個體的適應度 3 迴圈 達到某個條件跳出 1 0根 據適應度 從這一代 中挑選下 一代的父 母1 0根據適應度從這一代中挑選下一代的父母 1...

遺傳演算法及其應用簡介

遺傳演算法 genetic algorithm,ga 是計算數學中用於解決最優化問題的搜尋演算法,是進化演算法的一種。進化演算法最初是借鑑了達爾文進化生物學中的一些現象而發展起來的,這些現象包括遺傳 突變 自然選擇以及雜交等。預備知識 達爾文演化論,遺傳學三大基本定律 查爾斯 達爾文 1809 18...