Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

今、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界隈では(多分)

Slide 3

Slide 3 text

ほかの言語界隈だと・・・ - 「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

Slide 4

Slide 4 text

用語の確認

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

ミューテーションテスト (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

Slide 7

Slide 7 text

ミューテーション解析 > ミューテーション解析(ミューテーションテスト[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

Slide 8

Slide 8 text

ミューテーション解析 > 脚注 ^ 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

Slide 9

Slide 9 text

なので、個人的には「ミューテーション解析」か「Mutation testing」という語に合わせたい と思ってます

Slide 10

Slide 10 text

どうやって測定するのか

Slide 11

Slide 11 text

どうやって測定するのか ・・・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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

実際に Mutation testingツールを使ってみる

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

10桁の場合の検出が されてないことが 分かる

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

ちょっと試してみての感想 - まず(行ベースの)コードカバレッジを100%にしないといけないことには変わりない(周知の事実) 
 - (PHPでに限らず?) カバレッジをとったりいくつものミューテーションを実行するので割と実行時間が長い 
 - https://speakerdeck.com/theofidry/mutation-testing-phpdeveloperday?slide=85 
 - PHP/Infection に限って言えば、まだ変形させられるものは一杯ある。 
 - 境界値テストの代わりになる。・・と思ったらダメ 
 - コンポーネントの安心感にはつながりそう 


Slide 25

Slide 25 text

各言語ごとのミューテーションツール一覧など theofidry/awesome-mutation-testing: Mutation testing resources: how to make better code by introducing bugs - https://github.com/theofidry/awesome-mutation-te sting

Slide 26

Slide 26 text

表紙・イラスト https://hiyokoyarou.com/flower-color/ おわり