暌違的帖子, 這次來講一下首次接觸變異測試的感想及練習案例
原文連接 : https://gitmaruneko.github.io/2018/03/24/MutationTest.html
前兩周參加了 Agile Taipei 的三月聚會 - 變異測試 : 一種提高測試和代碼質量的新方法
講師 Joseph 向大家介紹了 mutation testing 的精神並且給予程式碼範例練習,
是一場很棒的分享, 剛好趁此機會溫習一下曾在軟體測試課程學過的 mutation testing.
(其實不太喜歡"變異測試"這個翻譯, 但一時之間找不到較好的說法, 所以仍然以 Mutation testing 來稱呼.)
Mutation testing雖帶著一個測試字眼, 但其實是一種用來衡量評估測試品質的方法,
開發人員撰寫程式碼, 然後運行測試案例來評估開發程式的品質,
接著再變更原本的程式碼, 即 Mutation testing 來評估測試案例的品質,
(是不是覺得這是一輪測過一輪的輪迴 :D )
舉例來說 :
假設原本的程式碼為
sum = a + b
則可變動成
§ sum = a - b
§ sum = a + b
§ …等
像以上的例子就是一種 math mutator 的變動,
其他還有 condition boundary mutator(<、>、=)、increments mutator(i++、i--)…等,
所以並不是對你的程式碼胡亂改動就是 Mutation 測試阿 XDD,
改完後, 重新運行測試案例, 如果發現測試全過, 那就表示測試案例有漏洞啦!!
運行完測試後, 除了檢查結果, 可能還會察看覆蓋率, 以往我會追求高覆蓋率,
認為測試寫得多, 覆蓋率高, 便能維持好開發程式的品質,
只是覆蓋率高就表示程式萬無一失了嗎?
試問自己幾個問題 :
是阿, 數字有什麼用? 測試案例寫得再多, 有效性不足仍然沒用,
數據是輔助, 但不代表全部.
這些覆蓋率最主要的作用在於提醒開發人員 : 還有哪些程式碼仍未被測試到?
並不代表測試碼的有效性
理論和想法看得夠多了, 還是寫點程式碼比較有感,
針對講師介紹的工具 pitest 作個小練習,
體驗一下 mutation test 究竟能給予怎樣的幫助
Pitest 是一款針對 Java 語言提供的 Mutation 測試工具, 提供多種 mutators,
並且可以和 gradle、maven 這些工具整合使用,
具備整齊的規範和自動化特性, 不須太多複雜設定, 使用上很便利
(跟 muJAVA 比較起來的話 XD)
下圖為原本的測試案例
運行單元測試, 不僅全過, 而且覆蓋率也到達100%
當然, 也可經由 command line 直接運行,
於 command line 輸入 : mvn org.pitest:pitest-maven:mutationCoverage
運行結束後, 至 target/pit-reports 資料夾內查看結果
經 pitest 評估後的狀況, mutation coverage 未達 100%
表示仍有可以加強測試的部分
點進 default 連結, 可查閱做了哪些 mutation
此圖為例, 表示對原始碼的第 3 行作的 conditional mutation 測試沒過
* 紅色行數表示測試案例沒有被 mutation testing 覆蓋 (顯示 SURVIED 紅色)
* 綠色行數反之 (顯示 KILLED 綠色)
(點進原始碼頁面則可以看到有那些沒被覆蓋)
再運行一次 Pitest, 發現 mutator 都被殺死了, 測試案例有效性提升!
Mutation testing 是一種補償工具, 可以幫助我們找到不夠有效的測試
可是不管什麼工具, 都只能用來幫助學習, 找到問題
而我們必須仔細看這些問題是不是真正的問題 :)