はじめてのミューテーション解析 / Mutation Testing

はじめてのミューテーション解析 / Mutation Testing

社内勉強会向けに作成した資料です

2a2aa51ff6073742296b986e253f8945?s=128

kazusuke sasezaki

August 19, 2019
Tweet

Transcript

  1. はじめてのミューテーション解 析/ Mutation testing 2019年 8月19日 社内勉強会

  2. 今、Mutation testingが熱い! - Tests Coverage is Dead — Long Live

    Mutation Testing - https://medium.com/appsflyer/tests-coverage-is-dead-long-live-mutation-testing-7fd61020330e - カンファレンス・meetupでのフィードバックサイト joind.inでの検索結果   - https://joind.in/search?keyword=mutation ・・・PHP界隈では(多分)
  3. ほかの言語界隈だと・・・ - 「Javaの鉱脈」でPITの記事を書きました | さにあらず : https://blog.satotaichi.info/mutation-testing/ - テストをテストする方法-ミューテーションテスト- #gadvent

    - うさぎ組 : http://kyon-mm.hatenablog.com/entry/2014/12/12/120000 - Mutation Testing with Ruby - (define -ayalog '()) : http://ayato.hateblo.jp/entry/20150202/1422839583 ※ ミュータント解析の提案は1993年とのことです http://jasst.jp/archives/jasst04/pdf/A5dh.pdf
  4. 用語の確認

  5. ミューテーション解析 > テストスイートの完全性を判定する手法の一つ。プログラムのわずかな変形(変異)を テストスイートがどの程度識別できるかを測定する。 https://www.qbook.jp/qpterm/search?initial=%E3%81%BF http://jstqb.jp/dl/JSTQB-glossary.V2.3.J02.pdf

  6. ミューテーションテスト (mutation testing) > back-to-back testingを参照のこと。 https://www.qbook.jp/qpterm/search?initial=%E3%81%BF http://jstqb.jp/dl/JSTQB-glossary.V2.3.J02.pdf

  7. ミューテーション解析 > ミューテーション解析(ミューテーションテスト[1]、ミューテーション法)はソフトウェアテ ストにおける、テストスイートの十分さを測定するための手法である。この手法では、テ スト対象のプログラムの一部を機械的に書き換えることで、ミュータントと呼ばれる「人工 的な誤りを含むプログラム」を生成する。 https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%8 6%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%A7%A3%E6%9E %90

  8. ミューテーション解析 > 脚注 ^ mutation analysisよりもmutation testingという単語が広く使われているが、 ミューテーション解析はソフトウェアが想定通りに実装されていることを直接確かめるテ スティングとは異なり、テスティングで利用されるテストケースの品質を評価するための 手法である。従って、本稿ではミューテーション解析という用語を主に利用する。

    https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%8 6%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%A7%A3%E6%9E %90
  9. なので、個人的には「ミューテーション解析」か「Mutation testing」という語に合わせたい と思ってます

  10. どうやって測定するのか

  11. どうやって測定するのか ・・・wikipedia「ミューテーション解析」のつづき > テストスイートをミュータントに対して実行した結果と、元のプログラムに対して実行し た結果が異なれば、テストスイートにはその誤りを発見するだけの鋭敏さが備わってい ると考えられるだろう(テストスイートはミュータントをkillすると表現する)。機械的に大量 にミュータントを生成したとき、そのうちテストスイートがkill出来るミュータントの割合を測 定することで、テストスイートの「欠陥発見能力」の十分さを測定することが出来る。 https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%8 6%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%A7%A3%E6%9E

    %90
  12. どうやって測定するのか ・・・ほかの方の説明では > Mutation testing とは、プログラムに対するテストケースが十分であるかを測定する手 法です。テスト対象のプログラムを機械的に変更してバグを埋め込み、テストがちゃんと 失敗するかどうかを調べます。バグのあるプログラムをテストするので、テストの失敗は バグを検出できたことを意味します。さまざまなバグを作り出してテストを行い、バグの 検出率によってテストケースの十分さを測定します。

    https://y-uti.hatenablog.jp/entry/2018/11/18/161639
  13. 実際に Mutation testingツールを使ってみる

  14. https://devblog.thebase.in/en try/2019/06/13/110000 より一部改変

  15. None
  16. None
  17. None
  18. 10桁の場合の検出が されてないことが 分かる

  19. 10桁の場合のテストを追加して 再実行

  20. None
  21. 実際のaudiobook.jpのコードに適用した場合(demo)

  22. 今回の PHPのmutation testingツール Infectionで用意 されているミューテター https://infection.github.io/guide/mutators.html

  23. 拡張として mbstringのミューテーターもあります https://infection.github.io/2019/05/18/whats-new-in-0. 13.0/#mbstring-mutators

  24. ちょっと試してみての感想 - まず(行ベースの)コードカバレッジを100%にしないといけないことには変わりない(周知の事実) 
 - (PHPでに限らず?) カバレッジをとったりいくつものミューテーションを実行するので割と実行時間が長い 
 - https://speakerdeck.com/theofidry/mutation-testing-phpdeveloperday?slide=85 


    - PHP/Infection に限って言えば、まだ変形させられるものは一杯ある。 
 - 境界値テストの代わりになる。・・と思ったらダメ 
 - コンポーネントの安心感にはつながりそう 

  25. 各言語ごとのミューテーションツール一覧など theofidry/awesome-mutation-testing: Mutation testing resources: how to make better code

    by introducing bugs - https://github.com/theofidry/awesome-mutation-te sting
  26. 表紙・イラスト https://hiyokoyarou.com/flower-color/ おわり