ミューテーションテストをやってみよう

1.9K Views

January 31, 24

スライド概要

2024/1/31(水)
Flutter/Dart-Test-Talk Vol.1での登壇資料

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

©︎ DartでMutation testingを してみよう Flutter/Dart Test Talk Vol.1(2024/01/31) 1 tarappo 2024 10X, Inc.

2.

©︎ 自己紹介 平田敏之(tarappo) かんたんな経歴(Software Engineer in Test) • DeNA SWET(- 2022/04) • 10X(2022/04 -) 領域 ・「開発生産性の向上」「品質の担保」をミッション 2023 10X, Inc.

3.

©︎ 今日話すこと • ミューテーションテストとは • Dart x ミューテーションテスト • サンプルコードをもとにやってみよう • メリット・デメリット 3 2024 10X, Inc.

4.

©︎ はじめに 自動テストを実装する機会は増えてきているかと思います • そこで質問です。 • 自動テストはちゃんと必要なテストケースを考えて作っていますか? • 今ある自動テストで • なにかあったときに問題を見つけられる自信がありますか? • コードカバレッジが高いから大丈夫と言いきれますか? そこでミューテーションテストを試してみましょう 4 2024 10X, Inc.

5.

©︎ ミューテーションテストとは? テストコードの十分さを測定するための手法 プロダクトコードに変異を入れたときにそれをテストコードで検知できるかどうか • • 変異=ミュータント 変異を入れるとはなにか?の具体例 >=を>に変更 ※たまにあるミス このように変更されたときに「テストコード」で検知できますか? 5 2024 10X, Inc.

6.

©︎ ミューテーションテストとは? >=を>に変更 ※たまにあるミス 60歳以上(user.age > = 60) → 60歳超(user.age > 60)に変異 • • 仕様書などで以上とあるのに含まない形で書いた経験ないですか? このときのテストケース例 • 年齢周りのテストケースで59歳、60歳のみ見てた場合は変異に気づかない 6 2024 10X, Inc.

7.

©︎ ミューテーションテストとは? 変異のパターン例 • AOR:arithmetic operator replacement • • 算術演算子置き換え • a + b → a - b、a/b などに変換 LCR:logical connector replacement • • 論理結合子置き換え • a &&b → a || b などに変換 ROR:relational operator replacement • • 関係演算子置き換え • a > b → a < b、 a ==b などに変換 7 2024 10X, Inc.

8.

©︎ Dart x ミューテーションテスト Dartでミューテーションテストをするには? • Dartで利用できる次のようなPackageがある Package • • https://pub.dev/packages/mutation̲test GitHub • • https://github.com/domohuhn/mutation-test 8 2024 10X, Inc.

9.

• 実行例 • 設定ファイル(mutation̲test̲con g.xml) 9 fi ©︎ 実行例 2024 10X, Inc.

10.

©︎ テスト中 • コードに変異を入れているところ • 実行中 ※実際は1つずつ変異させています※ 10 2024 10X, Inc.

11.

©︎ 出力結果 出力形式 • • HTML、JUnit形式、Markdownなど 変更時に見つけられている点 11 2024 10X, Inc.

12.

©︎ 試してみよう(1)- サンプルコード • 単純なポイント計算 前提 • • ルール • 12 100円で1ポイント • User.ageが60「以上」だとポイントが2倍 • ポイントの最大値は200 2024 10X, Inc.

13.

©︎ 試してみよう(2)- なにをテストしますか? 前提 100円で1ポイント ルール User.ageが60「以上」だとポイントが2倍 ポイントの最大値は200 テストケース例 • User.ageが60未満 • • Case1) 59歳の場合、100円で1ポイントになる User.ageが60以上 • • Case2) 60歳の場合、100円で2ポイントになる • Case3) 60歳の場合、10000円で200ポイントになる 13 2024 10X, Inc.

14.

©︎ 試してみよう(3)- サンプルテストコード 基本ルール 100円1ポイント ポイント2倍 ポイント上限(200ポイント) 14 これで足りていますか? 2024 10X, Inc.

15.

©︎ 試してみよう(4)- 実行結果 • ミューテーションテストの実行結果 15 2024 10X, Inc.

16.

©︎ 試してみよう(5)- 実行結果 不等号を間違えたケース • ミューテーションテストの実行結果 返す値を間違えたケース 実際に上記のコードに変更した場合、テストコードは落ちない=守れていない 16 2024 10X, Inc.

17.

©︎ 試してみよう(6)- テストコードの見直し 前提 100円で1ポイント ルール User.ageが60「以上」だとポイントが2倍 ポイントの最大値は200(<=200) テストケース例 • User.ageが60未満 • • ポイントの上限になる金額「だけ」見ている Case1) 59歳の場合、100円で1ポイントになる User.ageが60以上 • • Case2) 60歳の場合、100円で2ポイントになる • Case3) 60歳の場合、10000円で200ポイントになる 60歳「のみ」を確認しており61歳からの値はつかっていない 17 2024 10X, Inc.

18.

©︎ 試してみよう(7)- テストコードの更新 61歳のケースを追加 ポイント上限以上の金額を追加 [蛇足] このようなテストケースが増えてきた場合、 Parameterized Testsで整えるのが良いです 18 2024 10X, Inc.

19.

©︎ 試してみよう(8)- 結果 All Passed 19 2024 10X, Inc.

20.

©︎ ミューテーションテストは万能なのか? どんなものも「メリット」「デメリット」があります メリット • テスト漏れに気づける • • テスト設計が「不十分」「苦手」なケースは一定多い印象 カバレッジとは違った自動テストのFB • • コードカバレッジと併せて使うと良い 20 2024 10X, Inc.

21.

©︎ ミューテーションテストのむずかしいところ デメリット • 自動テストが一定あることが前提 • • カバレッジと併せて利用すると良い 実行時間の長さ • • 実行対象は絞る必要がある(PRであれば変更ファイルのみを対象にするのが良い) 検知したものが全て直すべき対象ではない=チェックコストがかかる • • 対象外が多くなると価値がないと判断するようになるため整備が必要 • 等価ミュータントのケースもある 21 2024 10X, Inc.

22.

©︎ ミューテーションテストのむずかしいところ 等価ミュータント • • 変異前・後での振る舞いが変わらないパターン • 変異(ミュータント)を入れてもテストコードで見つけることが無理なケース >を>=としても振る舞いとしては変わらない 22 2024 10X, Inc.

23.

©︎ おわりに • 自動テストはあたりまえの時代になりつつあります • 今まで以上に「テスト設計」は重要であり「テスト技法」も重要です • ミューテーションテストも使って自動テストをもっと活用しましょう 自動テストをもっと活用して楽しみましょう!! 23 2024 10X, Inc.