概述
變異測試(有時也叫做“編譯分析”)是一種在細節方面改進程式原始碼的軟體測試方法。這些所謂的變異,是基於良好定義的變異操作,這些操作或者是模擬典型套用錯誤(例如:使用錯誤的操作符或者變數名字),或者是強制產生有效地測試(例如使得每個表達式都等於0)。目的是幫助測試者發現有效地測試,或者定位測試數據的弱點,或者是在執行中很少(或從不)使用的代碼的弱點。
首創於1970s,變異測試最初是為了定位揭示測試單元的弱點。這個理論是:如果一個邊緣被引入,同時出現的行為(通常是輸出)不受影響的情況下,那么這說明了:變異代碼從沒有被執行過(產生了過剩代碼)或者測試單元無法定位錯誤。為了使之適用於所有情況,必須引入大量的變異,導致這個程式的極大量的副本被編譯和執行。變異測試的花費問題,阻礙了它作為一種軟體測試方法的實際套用。
變異測試最初被一個學生Dick Lipton提出,被DeMillo,Lipton和Sayward首次發現和公之於眾。Lipton and Sayward.,是第一個變異測試工具,是由Timothy Budd於1980在耶魯大學的博士工作(名為變異分析)中實現的。
近來,隨著電腦能力的發展,變異測試也在電腦科學論壇中重新復興起來。而且,已經有一些定義方法,可以把變異測試套用在OOP和非過程化語言中,如XML,SMV以及有限狀態機。
變異測試的前景
變異測試,通過選擇一些變異操作,並對於每一個可執行代碼段依次把它們套用在原始碼中。對程式使用變異操作的結果叫做一個突變異種。如果測試單元可以察覺到錯誤(即:一個測試失敗了),那么就說該突變異種被殺害了。
例如,考慮項目的C++代碼片段:
if (a && b)
c = 1;
else
c = 0;
條件編譯操作可以用“||”來替換“&&”,產生下面的突變:
if (a || b)
c = 1;
else
c = 0;
現在,為了使測試殺死這個突變,需要滿足一下條件:
(1) 測試輸入數據必須對突變和原始創新引起不同的程式狀態。例如:一個測試a=1,b=0可以達到這個目的。
(2)‘c’的值應該傳播到程式輸出並被測試檢查。
弱的突變測試(弱的突變覆蓋)只要求滿足第一個條件。強的突變測試要求滿足兩個條件。強突變更有效,因此它保證測試單元可以真實的捕捉錯誤。弱突變近似於代碼覆蓋方法。它只需較少的計算能力來保證測試單元滿足弱突變測試。
一些變異操作
一些突變操作已經被發現了,例如:算術和邏輯的突變操作,並行工程,複雜對象如容器……