最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

如何通過變異測(cè)試提高測(cè)試用例質(zhì)量

出處:維庫(kù)電子市場(chǎng)網(wǎng) 發(fā)布于:2023-03-01 17:05:43


變異測(cè)試評(píng)估測(cè)試用例的質(zhì)量。它重新執(zhí)行已經(jīng)通過的測(cè)試用例,但在更改的測(cè)試對(duì)象上,并揭示測(cè)試用例是否檢測(cè)到測(cè)試對(duì)象中的更改。安全關(guān)鍵系統(tǒng)的開發(fā)標(biāo)準(zhǔn)(例如 IEC 61508)建議進(jìn)行突變測(cè)試。在實(shí)踐中,測(cè)試執(zhí)行和突變生成的自動(dòng)化是不可避免的。自動(dòng)化突變測(cè)試是TESSY新主版本V4.3重要的新功能,是嵌入式軟件單元、模塊和集成自動(dòng)化測(cè)試工具。本文展示了如何應(yīng)用突變測(cè)試來提高測(cè)試用例的質(zhì)量;突變測(cè)試提出的問題以及如何克服這些問題。

突變測(cè)試基礎(chǔ)

變異測(cè)試重復(fù)執(zhí)行已經(jīng)通過測(cè)試對(duì)象(例如軟件單元)的測(cè)試用例。但是,當(dāng)重復(fù)測(cè)試用例時(shí),它們不是使用測(cè)試對(duì)象的原始源代碼執(zhí)行的,而是使用已更改(“變異”)的代碼執(zhí)行的。變異代碼與原始代碼不同;更改可能涉及次要細(xì)節(jié),例如用邏輯 OR 替換邏輯 AND;但是,更改也可能非常劇烈,例如刪除 if 指令的 else 分支。當(dāng)然,即使在更改之后,測(cè)試對(duì)象也必須保持可編譯性,否則無法重復(fù)測(cè)試。

當(dāng)用變異的源代碼重復(fù)測(cè)試時(shí),問題是現(xiàn)有的測(cè)試用例是否揭示了變異(技術(shù)術(shù)語(yǔ)是“殺死”)。如果在重復(fù)測(cè)試時(shí)至少有一個(gè)測(cè)試用例失敗,則突變將被殺死。如果這沒有發(fā)生,則測(cè)試用例不會(huì)檢測(cè)到源代碼已被更改,或者換句話說:測(cè)試用例還認(rèn)為原始對(duì)象以外的測(cè)試對(duì)象是正確的。這令人擔(dān)憂,需要進(jìn)一步調(diào)查。對(duì)于這項(xiàng)調(diào)查,如果只進(jìn)行了突變,那將很有幫助。

如果幸存的突變不是等效突變,則測(cè)試用例的質(zhì)量不足。等效突變不會(huì)改變測(cè)試對(duì)象對(duì)外部的行為,因此不會(huì)被殺死。下面進(jìn)一步給出等效突變的示例。當(dāng)然,突變的激進(jìn)程度很重要。一個(gè)細(xì)微的突變比幾個(gè)劇烈的變化更難檢測(cè)。通常會(huì)進(jìn)行幾次具有不同突變的測(cè)試運(yùn)行。這評(píng)估了測(cè)試用例的質(zhì)量。

圖 1 顯示了由 TESSY 自動(dòng)執(zhí)行的突變測(cè)試過程。原始源代碼通過所有現(xiàn)有測(cè)試后,才能開始實(shí)際的變異測(cè)試過程。TESSY 只執(zhí)行突變并重復(fù)所有現(xiàn)有測(cè)試,當(dāng)然會(huì)記錄突變是否被殺死。然后恢復(fù)原來的測(cè)試對(duì)象,再進(jìn)行變異。


圖 1:TESSY 自動(dòng)化了整個(gè)突變測(cè)試過程。()

圖 2 顯示了 TESSY 自 V4.3 版本以來可以執(zhí)行的突變。用戶可以選擇要應(yīng)用的突變,因此當(dāng)然也會(huì)影響進(jìn)行突變的次數(shù),進(jìn)而影響整個(gè)突變測(cè)試過程的執(zhí)行時(shí)間。


圖 2:TESSY V4.3 執(zhí)行的默認(rèn)突變。()

突變測(cè)試的兩個(gè)假設(shè)

默認(rèn)情況下,TESSY 執(zhí)行的更改很微妙,例如關(guān)系運(yùn)算符“<”變?yōu)椤?lt;=”。這是基于“有能力的程序員”[Liggesmeyer] 的假設(shè),該假設(shè)說熟練的軟件開發(fā)人員只會(huì)犯小錯(cuò)誤——例如,使用一個(gè)循環(huán)次數(shù)太多或次數(shù)太少的循環(huán)(“off-by-一個(gè)”錯(cuò)誤)。為了查明測(cè)試用例是否發(fā)現(xiàn)了這樣的小錯(cuò)誤并因此具有良好的質(zhì)量,突變必須是微妙的。低質(zhì)量的測(cè)試用例也應(yīng)該揭示根本性的突變,例如刪除一條甚至幾條指令。另一個(gè)經(jīng)經(jīng)驗(yàn)證實(shí)的假設(shè) [Offut] 指出存在耦合效應(yīng):恰好殺死一個(gè)突變體的測(cè)試用例也會(huì)殺死多個(gè)突變體。因此只進(jìn)行一個(gè)突變就足夠了。


我們考慮一個(gè)已通過四個(gè)測(cè)試用例(圖 3)并通過這些測(cè)試用例實(shí)現(xiàn) 100% 代碼覆蓋率的測(cè)試對(duì)象。


圖 3:四個(gè)通過的測(cè)試用例的測(cè)試數(shù)據(jù)應(yīng)用于原始測(cè)試對(duì)象。()

如果 TESSY 進(jìn)行突變測(cè)試(突變的標(biāo)準(zhǔn)設(shè)置如圖 2 所示),結(jié)果是一個(gè)被殺死的突變體和一個(gè)存活的突變體(圖 4)。


圖 4:TESSY 突變測(cè)試的結(jié)果。()

在上圖(圖 4)的左上部分,顯示了被殺死的突變(“突變導(dǎo)致測(cè)試失敗”)。此突變將測(cè)試對(duì)象的個(gè) if 指令(在圖 4 的右上角突出顯示)中的關(guān)系運(yùn)算符從“<”更改為“<=”。結(jié)果,測(cè)試用例失敗,這在變異測(cè)試中是積極的。因此,此突變標(biāo)有綠色勾號(hào)。

在圖 4 的左下部分,您可以看到幸存的突變(“突變?cè)谒袦y(cè)試用例中幸存”);此突變將測(cè)試對(duì)象的第二個(gè) if 指令(在圖 4 的右下方突出顯示)中的關(guān)系運(yùn)算符從“>”更改為“> =”。沒有測(cè)試用例通過失敗檢測(cè)到此更改。這是有問題的,需要調(diào)查。

變異分?jǐn)?shù)和測(cè)試用例質(zhì)量

突變得分是殺死的突變與所有突變的比率。


圖 5:TESSY 中的突變?cè)u(píng)分。()

上圖(圖 5)顯示了 TESSY 為四個(gè)測(cè)試用例確定的突變分?jǐn)?shù)(再次參考四個(gè)測(cè)試用例的測(cè)試數(shù)據(jù),編號(hào)為 1.1 到 4.1,如前面圖 3 所示)。

測(cè)試用例 2 殺死了兩個(gè)突變體中的一個(gè),因?yàn)闇y(cè)試用例 2 由于個(gè) if 指令 (v1 < r1.range_start) 從“<”到“<=”的突變而失敗。這導(dǎo)致突變得分為 50%。測(cè)試用例 2 在 M 列中標(biāo)有綠色復(fù)選標(biāo)記,因?yàn)樗鼩⑺懒艘粋€(gè)突變體。其他三個(gè)測(cè)試用例沒有殺死任何突變體,因此有一個(gè)紅叉或突變分?jǐn)?shù)為 0%。

測(cè)試用例 2 殺死了一個(gè)突變體,因此比其他沒有殺死任何突變體的測(cè)試用例質(zhì)量更高。這是由于測(cè)試用例 2 中變量 v1 的值。這取決于個(gè) if 指令中的關(guān)系運(yùn)算符。在第二個(gè)測(cè)試用例中,變量 v1 和變量 r1.range_start 的值都是 5,因此個(gè) if 指令中的決定是“5 < 5”,計(jì)算結(jié)果為“false”。在突變中,決策是“5 <= 5”,其計(jì)算結(jié)果為“真”。因此,第二個(gè)測(cè)試用例提供了一個(gè)意想不到的結(jié)果(“否”而不是正確和預(yù)期的“是”),從而殺死了突變體。

測(cè)試用例 4 應(yīng)該在第二個(gè) if 指令 (v1 > r1.range_start + r1.range_len) 的決定中殺死另一個(gè)突變(從 '>' 到 '>=')。但這不起作用,因?yàn)闇y(cè)試用例 4 中 v1 的值不合適。變量 v1 的值為 9,r1.range_start + r1.range_len 的結(jié)果為 5 + 2 = 7。因此,第二個(gè) if 語(yǔ)句中的決定是原始的 '9 > 7' 和突變的 '9 >= 7',兩者都評(píng)估為“真”。因此,原始和突變體在兩種情況下都給出正確的結(jié)果“否”;original 和 mutant 都通過了第四個(gè)測(cè)試用例;這意味著突變體沒有被殺死。

測(cè)試用例 2 的質(zhì)量?jī)?yōu)于測(cè)試用例 4,因?yàn)闇y(cè)試用例 2 使用了邊界值而測(cè)試用例 4 沒有。測(cè)試用例 2 使用邊界值 5,它是從 5 開始且長(zhǎng)度為 2 的范圍的起始值。對(duì)于變量 v1 的值為 9,測(cè)試用例 4 不使用范圍的邊界值。

這說明了為什么邊界值可以形成良好的測(cè)試數(shù)據(jù),以及為什么安全關(guān)鍵軟件的開發(fā)標(biāo)準(zhǔn)建議將邊界值作為測(cè)試數(shù)據(jù)。例如,IEC 61508 [61508] 在第 3 部分的表 B.2 和 B.3 中推薦了“邊界值分析”方法。在這兩個(gè)表中,此方法推薦用于 SIL 1,強(qiáng)烈推薦用于 SIL 2 至 4。 ISO 26262 [26262] 還提到第 6 部分表 8 中的方法 1c“邊界值分析”作為獲取軟件單元測(cè)試測(cè)試數(shù)據(jù)的過程。該方法推薦用于 ASIL A,強(qiáng)烈推薦用于 ASIL B 至 D。

突變測(cè)試還可以評(píng)估測(cè)試用例集。如果一組測(cè)試用例殺死了所有突變體,則稱其為足夠的。適當(dāng)?shù)臏y(cè)試用例集越小越好。它還可用于評(píng)估測(cè)試用例構(gòu)造方法。


突變也可能導(dǎo)致無限循環(huán);這意味著測(cè)試不會(huì)結(jié)束。為確保此類突變不會(huì)導(dǎo)致整個(gè)流程停頓,TESSY 會(huì)監(jiān)控執(zhí)行時(shí)間。如果突變的執(zhí)行時(shí)間超過沒有突變的執(zhí)行時(shí)間的十倍,TESSY 將中止測(cè)試執(zhí)行。無限循環(huán)或超時(shí)殺死突變體。突變也可能導(dǎo)致測(cè)試對(duì)象崩潰,例如由于被零除。突變測(cè)試對(duì)象的崩潰也會(huì)殺死突變體。超時(shí)或崩潰后,如果有更多突變適用,突變測(cè)試過程將繼續(xù)。


圖 6:無限循環(huán)殺死突變體。()

在上面的示例(圖 6)中,count() 函數(shù)使用一個(gè)測(cè)試用例進(jìn)行測(cè)試,該測(cè)試用例的參數(shù) x 的輸入值為 10,并通過返回值 1 提供正確的結(jié)果。該測(cè)試用例殺死了上圖所示的所有四個(gè)突變圖 6 的左側(cè)。第三個(gè)突變(從 '<=' 到 '>=')并沒有像往常一樣被測(cè)試用例的失敗殺死,而是被無限循環(huán)和由此觸發(fā)的超時(shí)殺死。TESSY 將此突變?cè)u(píng)為已殺死。之后,進(jìn)行第四次突變。


圖 7:撞車殺死了突變體。()

在上面的示例(圖 7)中,crash_by_pide() 函數(shù)使用一個(gè)測(cè)試用例進(jìn)行測(cè)試,其中參數(shù)a和b具有相同的值。這個(gè)測(cè)試用例在 if 指令的決定中殺死了 '!=' 到 '==' 的突變。


突變測(cè)試的主要問題是等效突變。這些突變不會(huì)改變測(cè)試對(duì)象的外部行為。


圖 8:等效突變的示例。()

在上圖中(圖 8),顯示了一個(gè)等效的突變。關(guān)系比較運(yùn)算符從“>”到“>=”的突變沒有外部可見的效果,因此不能被任何測(cè)試用例殺死。但是輸入值 0 肯定會(huì)導(dǎo)致原始和變異源代碼的不同內(nèi)部程序行為。在原始代碼中執(zhí)行 if 指令的 else 分支,變異執(zhí)行 then 分支。

因?yàn)榈刃蛔儾荒鼙粶y(cè)試用例殺死,所以必須手動(dòng)(由人)檢查所有幸存的突變以確定它是否是等效突變。這可能很耗時(shí)。然而,如果像 TESSY 一樣,只進(jìn)行一個(gè)突變,這將很有幫助。此外,手頭的測(cè)試對(duì)象是軟件單元,與整個(gè)軟件相比是很小的。這減少了檢查等效突變的工作量。重要的是,我們可以假設(shè),經(jīng)過單元測(cè)試的安全關(guān)鍵軟件比其他軟件具有更好的測(cè)試用例,因?yàn)樵撥浖枰獙?shí)現(xiàn)高百分比的代碼覆蓋率。這意味著,只有一小部分(如果有的話)安全關(guān)鍵軟件沒有被任何測(cè)試用例執(zhí)行。另一方面,沒有像安全關(guān)鍵軟件那樣經(jīng)過徹底測(cè)試的軟件可能有很大一部分代碼沒有被任何測(cè)試用例執(zhí)行。很明顯,無法殺死未被任何測(cè)試用例執(zhí)行的軟件部分的突變。這意味著更多的幸存突變體和因此更多的努力來決定不充分的測(cè)試用例和等效突變體。

等價(jià)突變可以看作是被殺死的突變;它們并不表示低質(zhì)量的測(cè)試用例。


在安全關(guān)鍵軟件的單元測(cè)試期間,幸存的突變(不是等效突變)應(yīng)該導(dǎo)致更改或額外的測(cè)試用例。由于軟件需要高度完整性,終目標(biāo)是殺死所有應(yīng)用的突變(同樣,不包括等效突變)。這可能不是集成測(cè)試的目標(biāo)。集成測(cè)試的主要目標(biāo)是測(cè)試單元的正確交互。因此,用于集成測(cè)試的測(cè)試用例檢查單元的交互,而不是檢查每個(gè)單元是否對(duì)每個(gè)可能出現(xiàn)的錯(cuò)誤條件(例如意外的 NULL 指針)做出正確反應(yīng)。

在集成測(cè)試期間引發(fā)錯(cuò)誤條件在技術(shù)上可能很困難,因此可能會(huì)被忽略。這是支持的,因?yàn)榭梢约僭O(shè)在單元測(cè)試期間測(cè)試了對(duì)錯(cuò)誤條件的反應(yīng)。因此,在集成測(cè)試期間達(dá)到 100% 的代碼覆蓋率并不是重要的,尤其是代表防御性編程的代碼部分(例如,對(duì)意外 NULL 指針的反應(yīng))可能仍未被發(fā)現(xiàn)。很明顯,無法殺死未被任何測(cè)試用例執(zhí)行的代碼中的突變。應(yīng)用此類突變會(huì)導(dǎo)致手動(dòng)調(diào)查此類突變的人工努力,因?yàn)橛捎谠撏蛔兪堑葍r(jià)突變或低質(zhì)量測(cè)試用例,因此尚不清楚該突變是否存活。此外,應(yīng)用此類突變會(huì)增加突變測(cè)試的執(zhí)行時(shí)間。

如果 TESSY 中的代碼覆蓋率信息可用于變異測(cè)試,TESSY 會(huì)避免未被任何測(cè)試用例執(zhí)行的代碼部分發(fā)生變異。此功能在集成測(cè)試期間特別有用,因?yàn)榭赡苡泻艽笠徊糠治幢桓采w的代碼不會(huì)也永遠(yuǎn)不會(huì)被任何測(cè)試用例執(zhí)行。盡管用處不大,但 TESSY 還在單元測(cè)試期間抑制了未覆蓋代碼中的突變。


圖 9:兩個(gè)突變被抑制,因?yàn)樗鼈儫o法被殺死。()

在上圖中(圖 9)測(cè)試集成了抽象數(shù)據(jù)類型“stack”的函數(shù) push() 和 pop()。圖 9 的右側(cè)顯示了 push() 的源代碼。第 15 行中的條 if 指令檢查堆棧指針(變量 next_free_element)是否已到達(dá)堆棧頂部,表明堆棧溢出。個(gè) if 指令的 then 部分用紅色陰影表示,表示它沒有被任何測(cè)試用例執(zhí)行。因此,第二個(gè) if 指令(第 17 行)中決策的突變是無法檢測(cè)到的,并且會(huì)繼續(xù)存在。

利用代碼覆蓋信息,TESSY 在第二個(gè) if 指令 (error_report_level > 0) 的決策中抑制了關(guān)系運(yùn)算符“>”的兩個(gè)突變,圖 9 右側(cè)以灰色陰影顯示。在左側(cè)在圖 9 中,相同的決定以灰色陰影顯示,在其下方顯示了兩個(gè)可能的突變(從“>”到“<”以及從“>”到“>=”)。兩種突變均未應(yīng)用。這由“結(jié)果”列中的破折號(hào)('-')表示。

如果 TESSY 在沒有事先進(jìn)行代碼覆蓋測(cè)量的情況下執(zhí)行突變測(cè)試,TESSY 會(huì)應(yīng)用這兩個(gè)突變來決定第二個(gè) if 指令。當(dāng)然,他們都沒有被殺。與單元測(cè)試相反,集成測(cè)試可能沒有必要添加測(cè)試用例來檢查錯(cuò)誤情況(在我們的例子中是堆棧溢出)是否得到正確處理。通過避免這些突變,TESSY 為人類和計(jì)算機(jī)計(jì)算節(jié)省了大量時(shí)間。

標(biāo)準(zhǔn)突變測(cè)試

IEC 61508 將突變測(cè)試描述為“從錯(cuò)誤播種執(zhí)行測(cè)試用例”,并建議將其用于安全完整性等級(jí) (SIL) 2 至 4(在第 3 部分的表 B.2 中)。IEC 61508 還指出(在第 7 部分的 C.5.6 節(jié)中)可以根據(jù)測(cè)試套件在原始測(cè)試對(duì)象中發(fā)現(xiàn)的錯(cuò)誤數(shù)量和該測(cè)試套件殺死的突變數(shù)量來估計(jì)錯(cuò)誤總數(shù)(預(yù)測(cè)). 殺死的突變體與突變體總數(shù)的比值等于原始測(cè)試對(duì)象中發(fā)現(xiàn)的錯(cuò)誤與原始測(cè)試對(duì)象中錯(cuò)誤總數(shù)的比值。這種估計(jì)自然假設(shè)突變的類型和位置以及實(shí)際錯(cuò)誤具有相同的統(tǒng)計(jì)分布;例如,如果實(shí)際錯(cuò)誤是錯(cuò)誤的計(jì)算但沒有使用算術(shù)突變,

ISO 26262 僅在第 6 部分表 7 中的“故障注入測(cè)試”方法(方法 1l)的注釋中提到了“代碼突變”,其中列出了軟件單元驗(yàn)證的方法。

結(jié)論

突變測(cè)試可以揭示不充分的測(cè)試用例。改進(jìn)它們會(huì)增加在測(cè)試軟件中發(fā)現(xiàn)錯(cuò)誤的機(jī)會(huì)。因此,變異測(cè)試不僅評(píng)估測(cè)試用例的質(zhì)量,還有助于提高被測(cè)軟件的質(zhì)量。變異測(cè)試的執(zhí)行在 TESSY 中是自動(dòng)執(zhí)行的,因此執(zhí)行不需要任何更大的努力。

然而,即使沒有 TESSY,每個(gè)處理測(cè)試項(xiàng)目的人都可以手動(dòng)執(zhí)行一些突變并重新執(zhí)行測(cè)試,看看測(cè)試用例是否殺死了突變。

術(shù)語(yǔ)


這就是 IEC 61508 所說的突變測(cè)試(參考第 7 部分的 C.5.6 節(jié))


如果通過一組測(cè)試用例發(fā)現(xiàn)具有單個(gè)突變的突變體,則同時(shí)也發(fā)現(xiàn)了多個(gè)突變。


僅從外部(黑匣子)考慮突變體,并且突變體僅通過測(cè)試用例發(fā)現(xiàn),從外部提供與原始結(jié)果不同的結(jié)果。


測(cè)試用例確保突變體內(nèi)部的行為與原始行為不同。但是,這種其他行為在外部是不可見的。

足夠的測(cè)試用例/足夠的測(cè)試用例集

如果一個(gè)測(cè)試用例殺死了一個(gè)不等價(jià)的突變體,那么它就被稱為足夠的。如果一組測(cè)試用例殺死了所有非等價(jià)的突變體,則稱其為足夠的。


被殺死的突變體與突變體數(shù)量的比率。通常以百分比給出。


外部錯(cuò)誤被注入到未變異的測(cè)試對(duì)象中,以測(cè)試健壯性。ISO 26262 提到“代碼突變”作為故障注入測(cè)試的例子。


關(guān)鍵詞:電子

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://udpf.com.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

俠客夢(mèng)——DIY電子科技創(chuàng)新創(chuàng)客創(chuàng)意作品
廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見,您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見一經(jīng)采納,將有感恩紅包奉上哦!