11.9K Views
October 25, 24
スライド概要
JJUG CCC 2024 Fall 2024/10/27
『テストが正しいかテストする?Mutation Testing入門!』
虎の穴ラボ株式会社 河野裕隆
Ruby/Javaプログラマー。エンジニアリングマネージャー。 軽度の広く浅いオタク。
#jjug_ccc #jjug_ccc_c TORANOANA Lab テストが正しいかテストする? Mutation Testing入門! 虎の穴ラボ 河野 裕隆 JJUG CCC 2024 Fall #jjug_ccc #jjug_ccc_c Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 自己紹介 河野 裕隆(こうの ひろたか) 好きなもの ● 2019/08~ 虎の穴ラボ ● VOCALOID(初音ミク) ● 新規開発チーム ● 謎解き、クイズ ○ ● クリエイティア他 X: @hk_it7 虎の穴ラボへの入社理由 ● スキルを高めあえる仲間がほしい ● ユーザーに近い仕事がしたい 2 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c このセッションの目的、目標 ● ミューテーションテストを知る ● ミューテーションテストの考え方を知る ○ 既存テストへの課題感 目指さないこと 3 ● ミューテーションテストの詳しいやり方 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 感想や疑問は 随時Xポストへ!! 4 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c みなさん📢 テストコードは書いていますか❓ 5 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c そのテストの品質は どうやって測ってますか❓ 6 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c テストカバレッジ? ● C0:命令網羅 ● C1:分岐網羅(判定条件網羅) ● C2:条件網羅 ● CMM:複合条件網羅 7 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 問題点 ● ミスがあってもカバレッジは100%になる ○ 結果としてミスに気付けない!! ○ 開発のガードになれない😭 8 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c テストコードのミスの例 - assertの書き忘れ 9 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c せっかく書くなら 意味のあるテストコードを👍 10 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c どうやって目指す❓ 11 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 意味のあるテストコードの目指しかた ● コードレビュー ○ 人力💪 ○ AIパワー🧠 ● テストをテスト🤖 ←今回はここの紹介 12 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 目次 - Mutation Testing 1. Mutation Testingとは 2. 「PIT (Pitest)」の紹介と実演 3. 注意点とさらなる課題 13 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c Mutation Testingとは 14 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c Mutation Testingとは ● 検証対象のコードに誤りを意図的に挿入 ○ ちゃんと「テストに失敗する」か確認 ○ 偽陰性のチェック ● Fuzzing Test/エラーシーディングの一種 15 ○ 意図的に予期せぬデータ等を入れるテスト Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c コラム - 偽陽性と偽陰性 ● 偽陽性 ○ 合格すべきテストが不合格になる ■ エラーになっているので気付けはする ● 偽陰性 16 ○ 不合格になるべきテストが合格になる Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c コラム - 偽陽性と偽陰性 テスト結果\実装コード 正しい 誤っている 成功 期待通り 偽陰性 失敗 偽陽性 期待通り ● 偽陽性:脆いテスト、flaky testなど ● 偽陰性:空振り、カバレッジ不足など サバンナ便り 第2回(和田卓人)より https://gihyo.jp/dev/serial/01/savanna-letter/0002 17 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c テストコードのミスの例 - assertの書き忘れ 18 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c テストコードのミスの例 - assertの書き忘れ 偽陰性の例 (空振り) 19 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c Mutation Testingとは ● Mutation:突然変異/変化 ○ mutable(<>イミュータブル)と同じ語源 ■ ラテン語の「mutare」 ● ミュータントも同じ🐢 20 ● コードに突然変異を起こす Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c Googleもすなる Mutation Testingといふものを、 我もしてみむとてするなり。 21 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 目次 - Mutation Testing 1. Mutation Testingとは 2. 「PIT (Pitest)」の紹介と実演 3. 注意点とさらなる課題 22 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c とは言え、 Mutation Testingって具体的に どんなことしてるの??? 23 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 ● コードを意図的に変更する ○ Stringの戻り値を意図的に空文字にする ○ 判定条件をひっくり返す ■ if(hoge) => if(!hoge)にする 24 ● エラーにならなかったらテストに誤りありかも Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 ● Mutation Testライブラリ ○ PIT(Pitest) ■ Java(JVM) ○ Stryker 25 ■ C#, JavaScript, Scala Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 ● 他のJava用ライブラリ ○ µJava ○ Jester ○ Jumble など 参考:https://pitest.org/java_mutation_testing_systems/ 26 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 ● なぜPITを使うのか ○ 速い ○ サポートが継続している ■ 他のJava向けライブラリは......らしい 27 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c ここから本題:実行環境作る!⚙ 28 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 ● OpenJDK 21 ● Gradle ● JUnit5 ● PIT 1.15 参考:https://github.com/h-kono-it/jjug_ccc_2024_fall 29 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c
「PIT (Pitest)」の紹介と実演 - build.gradle
plugins {
id 'java'
id 'info.solidsoft.pitest' version '1.15.0'
}
// 中略
repositories {
mavenCentral()
}
dependencies {
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
test {
useJUnitPlatform()
}
pitest {
junit5PluginVersion = '1.2.1'
pitestVersion = '1.15.2'
targetClasses = ['example.FizzBuzz*', 'example.TestFizzBuzz*','example.Coverage*',
'example.TestCoverage*']
outputFormats = ['XML', 'HTML']
}
30
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 実行してみる!💪 31 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 ● あとはテスト書いて実行するだけ ○ gradle pitest ● ↓こうなれば成功🎉 32 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c レポートを見る🗒 33 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 - レポートを見る ● 初期設定:build/reports/pitest/index.html 34 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 - 問題がある場合のレポート ● FizzBuzzで15の倍数のときにBuzzFizzを返す ように修正 ● アサーションをコメントアウト 35 ● テストは空振りで成功:コードは誤り Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 - 問題がある場合のレポート ● 初期設定:build/reports/pitest/index.html 36 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 - 詳細レポート ● KILLED:ちゃんとエ ラーになった ● SURVIVED:エラーに ならなかった ● 各列に何をやったか 37 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 「PIT (Pitest)」の紹介と実演 - 詳細レポート ● マウスオーバー:どの テストでエラーか ● 有効になっている変異 パターン ● 検査元、実行時間 38 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c より詳細は公式サイトへ👣 39 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 目次 - Mutation Testing 1. Mutation Testingとは 2. 「PIT (Pitest)」の紹介と実演 3. 注意点とさらなる課題 40 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c これで完璧じゃーん! 41 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c とはならない😭 42 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 注意点とさらなる課題 ● 指針が薄い ○ ミューテーションテストのカバレッジをど こまで目指す? ● そもそも失敗するテストがあると検知できない ○ 常にメンテやっていく(当たり前ですが) 43 ● ライブラリはまだ不安定なところがありそう Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c ありそうな質問 44 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c テスト時間めっちゃ伸びそう 45 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 注意点とさらなる課題 - テスト時間について ● 大きなプロジェクトでは未検証😭 ● Joda-Timeライブラリで1万の変異を起こした 場合、3分くらいとのこと ○ https://www.joda.org/joda-time/ ○ https://www.oracle.com/webfolder/tec hnetwork/jp/javamagazine/Java-ND16MutationTesting.pdf (PDF直リンク) 46 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 注意点とさらなる課題 - テスト時間について ● Mutation Testingとしては高速らしい ○ バイトコードで変異 ○ カバレッジを見て、狙って変異 ■ テストがないコードはそもそも変異させ ない => 意味ないから 47 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c まとめ! 48 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c まとめ ● Mutation Testで偽陰性が防げるかも ● JavaならPIT(Pitest)がオススメ ● 業務に導入するのは事前調査したほうが良い ○ 課題とのマッチ、運用方針を決めてから! 49 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 参考リンク 1. サバンナ便り 第2回 偽陽性と偽陰性 a. https://gihyo.jp/dev/serial/01/savanna-letter/0002 2. Mutation Testingを活用して テスト品質を考える a. https://speakerdeck.com/kakehashi/introduction-to-mutat ion-testing 50 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 参考リンク 3. PIT a. https://pitest.org/ 4. テストコードの品質を客観的な数値で担保しよう〜Mutation Testの すすめ〜 a. https://speakerdeck.com/kakehashi/introduction-to-mutat ion-testing 51 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.
#jjug_ccc #jjug_ccc_c 参考リンク 5. State of Mutation Testing at Google a. https://research.google/pubs/state-of-mutation-testing-a t-google/ 6. Java-ND16-MutationTesting a. https://www.oracle.com/webfolder/technetwork/jp/javam agazine/Java-ND16-MutationTesting.pdf (PDF直リンク) 52 Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.