java變異測試(殺死突變體)
簡介
如果程序產(chǎn)生不同的輸出,則測試輸入可以區(qū)分兩個(gè)程序
對于這個(gè)輸入。 變異測試基于一個(gè)簡單的概念:如果一個(gè)測試套件是擅長將我們的程序與其他類似程序區(qū)分開來,那么很可能要善于找茬。 這樣做的理由是,那么測試可能會被視為試圖將程序與某些程序區(qū)分開來正確的程序。
給定一個(gè)程序 p,一個(gè)突變體是某個(gè)變體 p’ of p.通常,我們通過應(yīng)用突變算子來生成突變體:允許我們轉(zhuǎn)換的規(guī)則程式。 例如,將算術(shù)運(yùn)算符 + 的出現(xiàn)替換為算術(shù)運(yùn)算符 * 的規(guī)則是變異運(yùn)算符。 其他例如在謂詞中將 > 替換為 >=。 通常,我們會產(chǎn)生一個(gè)突變體通過僅應(yīng)用一個(gè)運(yùn)算符的一個(gè)實(shí)例:此類突變體是一階的突變體。
僅使用一階突變體已在兩個(gè)方面得到證明。 首先,它是認(rèn)為如果我們的測試發(fā)現(xiàn)由一階突變體定義的微小差異然后它會發(fā)現(xiàn)由高階突變體定義的更大差異:這稱為耦合效應(yīng)。 其次,也有人認(rèn)為真正的程序員小錯(cuò)誤,因此真正的程序就像正確的一階突變體程序:這被稱為稱職的程序員假設(shè)。 有一些支持這些假設(shè)的經(jīng)驗(yàn)證據(jù),但不可避免地,這些證據(jù)是有限的。
只使用一階突變體的原因是務(wù)實(shí)的:如果我們不將我們限制在一階突變體,那么突變體的總數(shù)是可能是巨大的。 事實(shí)上,即使我們只產(chǎn)生一階突變體,突變測試工具會產(chǎn)生大量的突變體,即使是一小塊代碼。 這是限制突變測試采用的因素之一。
生成突變體
我們通常使用突變計(jì)算運(yùn)算符來生成突變體,例如:
(1) replace + by *
(2) replace a variable x, in an expression, by another variable y
(3) replace a variable x, on the LHS of an assignment, by another variable y
(4) deleting a statement.
如果一個(gè)突變體可以通過一次應(yīng)用一個(gè)突變算子產(chǎn)生,那么它就是一階突變體。通常只使用一階突變體:這限制了生成的突變體的數(shù)量。 如果一個(gè)突變體不是一階突變體,那么它就是一個(gè)高階突變體耦合效應(yīng):如果我們殺死一級突變體,那么我們就會殺死(大多數(shù))高階突變體
有能力的程序員假設(shè):真實(shí)代碼接近正確的(因此類似于正確的一級突變體程序)
突變檢測術(shù)語
我們說測試用例 t 殺死了突變體 p’ of p 如果 p’ 和 p產(chǎn)生不同
給定來自 t 的輸入時(shí)的輸出。 此外,突變體 p’ of p 是等價(jià)的
如果沒有測試輸入殺死 p’. (p’ of p 在句法上與 p 不同)
在突變測試中,我們產(chǎn)生了程序 p 的一組 M 個(gè)突變體。 如果每個(gè)突變體都被 T 殺死,則認(rèn)為測試套件 T 是足夠的:對于每個(gè)(非等價(jià)的)突變體 p’在 M 中,T 中有一些測試用例 t 殺死了 p’. 突變覆蓋率是被殺死的非等價(jià)突變體的百分比通過 T. 我們的目標(biāo)是生成一個(gè)達(dá)到 100% 覆蓋率的測試套件; 那個(gè)滿足相應(yīng)的充分性標(biāo)準(zhǔn)。
尋找殺死突變體的測試輸入
假設(shè)我們在語句 s 處對程序 p 進(jìn)行了變異以形成變異體 p’。 然后為了讓測試輸入殺死 p’,它必須實(shí)現(xiàn)以下目標(biāo);
? 執(zhí)行p’ 的語句s。
? 感染狀態(tài):讓 s 處的突變/變化導(dǎo)致某些變量 v 的值有所不同(可能是程序指針,代表?xiàng)l件的不同值)。
? 將對v 值的更改傳播到輸出??紤]以下示例并將其稱為p。 其中,input(x) 是一段代碼,它接受一個(gè)輸入并將其分配給 x; output(y) 是一段代碼,它輸出 y 的值。
1 . i n p u t ( x ) ;
2 . y=1;
3 . i f ( x>0)
4 . x=x ;
e l s e
5 . x=?x ;
6 . x=x+1;
7 . w hil e ( x>0) {
8 . y=y?x ;
9 . x=x?1;
}
1 0. output ( y ) ;
mutate statement 4:
3 . i f ( x>0)
4 . x=y ;
e l s e
5 . x=?x ;
6 . x=x+1;
工具支持
有多種編程語言的工具: For Java, examples include the following(PIT; Major; μJava )
也是一種相對通用的工具,可用于任何具有元模型的語言:
The Wodel tool (and language)
通常產(chǎn)生的突變體數(shù)量使得使用工具支持必不可少。 通常,工具至少會執(zhí)行以下操作:
? 產(chǎn)生突變體。
? 使用給定的測試輸入t 運(yùn)行所有未被殺死的突變體,決定其中哪些被殺死到t。
? 說明哪些突變體尚未被殺死。
工具也可能隨機(jī)生成測試用例。如前所述,通??梢詺⑺涝S多突變體
通過使用隨機(jī)生成的測試輸入。 使這些過程自動(dòng)化相對簡單。 然而,一些突變體更難殺死。 例如,考慮條件 x>c 到 x>=c 的突變,其中 x 是浮點(diǎn)變量。 只有當(dāng)測試輸入將程序帶到這個(gè)條件并且此時(shí) x 取值 c 時(shí),才有可能殺死這個(gè)突變體。 鑒于 x 可以取的大量可能值,可能很難通過隨機(jī)測試殺死這樣的突變體。
因此,通常有一個(gè)不是自動(dòng)化的最后階段:測試人員考慮尚未被殺死的剩余突變體。 這個(gè)最后階段很昂貴,可能是目前阻止突變測試擴(kuò)展到大型系統(tǒng)的主要因素。
雖然許多工具都支持突變測試,但有一個(gè)“經(jīng)典”工具:Mothra。 該工具將變異測試應(yīng)用于 FORTRAN 程序,是第一個(gè)重要的變異測試工具。 您會發(fā)現(xiàn)有很多突變測試工具 - 嘗試一些互聯(lián)網(wǎng)搜索!
使變異測試更有效
突變測試可能需要付出過多的努力。 即使給定一個(gè)小程序,也會產(chǎn)生許多突變體,其中一些是等價(jià)的。 之一問題是我們通常會生成和編譯許多突變體。 這個(gè)問題可以通過生成程序模式來解決:原始程序的參數(shù)化版本,其中添加的參數(shù)值決定哪些突變被“打開”。
除此之外,還有以下主要方法類別
可以使突變測試更有效:
? 使用更少的突變體。
? 自動(dòng)識別等效突變體或減少突變體的數(shù)量產(chǎn)生了等效的突變體。
研究表明,通過選擇標(biāo)準(zhǔn)的適當(dāng)子集突變算子有可能產(chǎn)生更少的突變體,但(可以說)幾乎不會降低這些突變體的有效性。 這種方法稱為選擇性突變。 還表明,從一組可能的突變體中隨機(jī)抽樣也可能是有效的。
已經(jīng)提出了許多限制等效突變問題的方法。 其中包括:
? 使用定理證明器等工具來確定是否剩余突變體是等價(jià)的。
? 使用依賴性分析等方法來避免產(chǎn)生一些保證是等效突變體的突變體。
? 避免或限制使用產(chǎn)生許多等效突變體的操作符。
? 使用簡單的檢查。 特別是,發(fā)現(xiàn)比較編譯后的代碼足以消除一些等效的突變體。
模擬突變測試中的其他標(biāo)準(zhǔn)
一些測試標(biāo)準(zhǔn)可能會在突變測試中被模擬:有可能產(chǎn)生
一組突變體,如果我們殺死所有這些突變體,那么我們就滿足了正在考慮的標(biāo)準(zhǔn)。 在這里我們將看一個(gè)標(biāo)準(zhǔn):100% statementcoverage。
一個(gè)標(biāo)準(zhǔn)的變異運(yùn)算符用產(chǎn)生錯(cuò)誤的新語句替換語句。 因此,為了產(chǎn)生一組突變體來模擬語句覆蓋,我們可以執(zhí)行以下操作:
? 對于程序 p 的每個(gè)語句 s,通過替換 s 產(chǎn)生一個(gè)突變體 ps
通過產(chǎn)生運(yùn)行時(shí)錯(cuò)誤的語句。
? 生成測試以殺死所有非等效突變體。文章來源:http://www.zghlxwxcb.cn/news/detail-733927.html
變異模型
變異測試中的大部分工作都會改變源代碼。 然而,人們對變異模型的興趣越來越大。 顯然,如果我們有一個(gè)可執(zhí)行語言的模型,那么我們可以直接使用突變算子、殺死突變體和等效突變體的概念。 我們還獲得了類似的測試有效性和充分性度量。有許多潛在的好處。 一、經(jīng)常生產(chǎn)模型在代碼之前,因此模型的變異可能導(dǎo)致在代碼生成之前就生成測試。 此類測試用例的早期生成可能會加速軟件開發(fā),并有可能提高代碼質(zhì)量。 此外,模型的突變體可能代表相當(dāng)不同的故障類別,因此終止此類突變體的測試用例可能會發(fā)現(xiàn)為終止代碼而生成的測試用例未發(fā)現(xiàn)的故障。文章來源地址http://www.zghlxwxcb.cn/news/detail-733927.html
到了這里,關(guān)于java變異測試(殺死突變體)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!