Slide 1

Slide 1 text

Mutation Testingとはなにか? Laravel(Pest)でInfectionを使ってみる Kanon (@samurai_se) Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio

Slide 2

Slide 2 text

アジェンダ 2 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio ● 自己紹介 ● Mutation Testingとは ● 実際に使ってみる ● 個人的な課題 ● おわりに

Slide 3

Slide 3 text

1. 自己紹介 3 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio 3 Kanon 株式会社 虎の穴ラボ 個人事業 blessing software @samurai_se ↓詳しくは↓ ● 3次元に嫁が1人います。2次元にはたくさんいます。 ● 本業はKtor(Kotlin), Next.js(TypeScript)で副業がLaravel(PHP), Next.js(TypeScript) ● アニメと漫画と声優さんが好きです ● 推しは水瀬いのりさんと早見沙織さんです

Slide 4

Slide 4 text

Mutation Testingとは Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio

Slide 5

Slide 5 text

Mutation Testingとは 5 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio コードに意図的なバグを植え付けることで、 テストコードの検証が適切に行われているか? を測定する手法

Slide 6

Slide 6 text

自分が自動テストに対してずっと思っていたこと 6 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio テストコードが正しく書けているか分からないのに、 どれだけたくさんテストコードを書いたところで 品質って担保できてないやん

Slide 7

Slide 7 text

カバレッジレポートの罠 7 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio ● 従来のカバレッジメトリクスは嘘をつく ● 例えば以下の(極端な)テストケース コード参考:javascript-testing-best-practice

Slide 8

Slide 8 text

Pest(PHPUnitも?)はassertionがなければwarningを吐く 8 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio

Slide 9

Slide 9 text

以下の(これまた極端な)例の場合は検知できない 9 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio 適切な表示がされているか? を確認できていないが、テスト が通っている しかしプロダクションコード自 体は実行されているため、カバ レッジの%は上がる

Slide 10

Slide 10 text

そこでMutation Testing 10 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio ● Mutation = 突然変異 ○ コードを意図的に変更し、バグを植え付ける ○ ex) a===0 を a!==0と変異させる ○ その後テストを実行し、正しいテストが書かれて いればアサーションがエラーとなるはず ○ エラーとならなかった箇所がきちんと検証されて いないと判断できる ● Googleでは2017~18年ごろから全社的に導入されてい るっぽい 参考:Googleにおける突然変異テストの状況 変異の内容

Slide 11

Slide 11 text

Mutation Testingに関わる指標 11 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio ● Killed ○ 変異後、成功すべきテストが失敗したことにより 検知された変異の数 ● Survived ○ 変異後、失敗すべきテストが成功したことにより 検知された変異の数 つまり、Survivedの数が多ければ多いほどテストコードの品質が低い

Slide 12

Slide 12 text

Mutation Testingに関わる指標 12 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio ● MSI(Mutation Score Indicator) ○ (Killed+/TotalMutant)*100 ● これが低ければ低いほどテストコードの品質が低い

Slide 13

Slide 13 text

実際に動かしてみる Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio 当初ライブデモの予定でしたが後から資料を見てくれた人も動きが見れ るように動画にしています💦

Slide 14

Slide 14 text

試すことこと 14 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio ● 単純実行 ● 並列実行してスピードアップ ● 実際にレポートを見てみる

Slide 15

Slide 15 text

単純実行 15 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio

Slide 16

Slide 16 text

並列実行 16 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio

Slide 17

Slide 17 text

レポート 17 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio

Slide 18

Slide 18 text

課題 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio

Slide 19

Slide 19 text

実務で使うレベルの詳しい話と検証ができていない 19 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio ● MSIの割合が一定以下の場合、CIをエラーにする ○ —min-msi オプションがある ● 毎回全てではなく、Git上差分のあるファイルだけを対象 ○ —git-diff-lines オプションなどで可能 ● CIでの実行レポートを参照する ○ Cloud HTML Report(Strykerが提供するSaaS)がある このあたりはいずれまた別のカンファレンスで

Slide 20

Slide 20 text

Happy Hacking!! 20 Copyright © 2023 blessing software. All Rights Reserved. Illustrated by @amon_mikio コミュニティ よろしくお願いします🙏