白盒测试 首次接觸 "變異測試 Mutation Testing" 的心得

Ms.Test · 2018年09月26日 · 最后由 L 回复于 2021年10月09日 · 7676 次阅读
本帖已被设为精华帖!

暌違的帖子, 這次來講一下首次接觸變異測試的感想及練習案例

原文連接 : https://gitmaruneko.github.io/2018/03/24/MutationTest.html

前兩周參加了 Agile Taipei 的三月聚會 - 變異測試 : 一種提高測試和代碼質量的新方法

講師 Joseph 向大家介紹了 mutation testing 的精神並且給予程式碼範例練習,

是一場很棒的分享, 剛好趁此機會溫習一下曾在軟體測試課程學過的 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 工具介紹

Pitest 是一款針對 Java 語言提供的 Mutation 測試工具, 提供多種 mutators,

並且可以和 gradle、maven 這些工具整合使用,

具備整齊的規範和自動化特性, 不須太多複雜設定, 使用上很便利

(跟 muJAVA 比較起來的話 XD)

範例練習

  • 以一個判斷整數是否為 0~100 正整數的小程式來練習

 下圖為原本的測試案例

 運行單元測試, 不僅全過, 而且覆蓋率也到達100%

  • 接著要運行 Pitest, 在運行之前先做點設定
    • 於 pom.xml 加入 plugin 設定, 編譯時便會自動引用此套件
    • targetClasses 和 targetTests 設定需要作 pitest 的 class 名稱

  • 於 maven 專案視窗選擇 pitest:mutationCoverage 來運行 pitest

 當然, 也可經由 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 綠色)

 (點進原始碼頁面則可以看到有那些沒被覆蓋)

  • 現在找到了不夠有效的測試, 所以可以回過頭改動了!
    檢查後發現, 101 這個邊界值沒被檢查到, 增加這個測試案例

 再運行一次 Pitest, 發現 mutator 都被殺死了, 測試案例有效性提升!

輪迴圖

結論

Mutation testing 是一種補償工具, 可以幫助我們找到不夠有效的測試

可是不管什麼工具, 都只能用來幫助學習, 找到問題

而我們必須仔細看這些問題是不是真正的問題 :)

Share

Reference

共收到 32 条回复 时间 点赞

有点意思

台湾同学写的很棒哦😀

战 神 回复

謝謝您的肯定 :) 好開心

Ramsey 回复

是很有趣的測試活動 :)

仅楼主可见
战 神 回复

好的, 謝謝您的分享! 大感謝!

有意思,学习一个

繁体看的有些累,不过看到测试技术贴,感觉技术无国度,加油

先收藏,然后再研究😄

恒温 将本帖设为了精华贴 09月26日 22:28

又新学了个名词, 值得动手玩下。

恒温 回复

頁面連結失效了呢 :) 不過這方面的論文確實不少, 只是在業界鮮少聽到具體實施案例

活到老学到老

Ms.Test 回复

沒有太多實施案例的原因估計是因爲雖然這個技術已經出來并且被研究了很久,但是現在仍然存在大量開放性問題吧。
而且從大部分企業的 ROI 的方向來考慮,大量的變異測試性價比不會太高。自然推廣起來也會困難重重。

Ms.Test 回复

估计对你们台湾屏蔽了

恒温 回复

噗哈哈,用繁体字回复算是 respect 楼主吧~

同意您說的, 以企業角度來說. 能做好單元測試就已經很值得鼓掌了,
就投入變異性測試的時間成本來看, 所獲得的感受相較之下來會少些

謝謝你, 開心呢 :) 在這發文能獲得大家的回饋我就好開心囉

支持,欢迎妹子多来 testerhome 分享!!!

关于如何提升单元测试的代码质量,之前主要靠人工走查,此文获益匪浅,节后就试点 pitest 的效果

今天看了些资料,这个变异测试其实是通过注入变异因子生成变异体,然后用事先准备好的用例来测试,如果有用例漏了,那就要补上去。其实是对 cr 的补足。

😀 作者 有没有联系方式?。我这边也在变异测试引用到增强用例那边。

庆幸大陆是用简体,感觉繁体字好难写啊😅

徐汪成 回复

謝謝你 😅

陈子昂 回复

您好, 歡迎交流測試心得, 這是我的微信

debugtalk 回复

哈哈, 就像您測試案例寫久了自然也就習慣了

simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44
simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08

学习了

也就是说属于单元测试的范畴,而且是检验单元测试案例质量的一个技术。技术是个好技术,只是目前的状态是企业连单元测试都不愿意铺开,更不要提单元测试的精益求精了。
测试要走的路还是很长啊。

新思路!

simple [精彩盘点] TesterHome 社区 2019 年 度精华帖 中提及了此贴 12月24日 22:32

才看到,很有启发,之后有再继续实践么?

Anonyymous 回复

台湾省 国度个德尔

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册