---
title: JJUG CCC 2024 Fall mutation testing
tags: 
author: [hirotaka kono](https://www.docswell.com/user/hk_it7)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/3JKDVGQP7D.jpg?width=480
description: JJUG CCC 2024 Fall 2024/10/27 『テストが正しいかテストする？Mutation Testing入門！』  虎の穴ラボ株式会社 河野裕隆
published: October 25, 24
canonical: https://www.docswell.com/s/hk_it7/K1R23G-JJUG%20CCC_2024_Fall_mutation_testing
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/3JKDVGQP7D.jpg)

#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.


# Page. 2

![Page Image](https://bcdn.docswell.com/page/LE3RMNP475.jpg)

#jjug_ccc #jjug_ccc_c
自己紹介
河野 裕隆（こうの ひろたか）
好きなもの
●
2019/08～ 虎の穴ラボ
●
VOCALOID（初音ミク）
●
新規開発チーム
●
謎解き、クイズ
○
●
クリエイティア他
X: @hk_it7
虎の穴ラボへの入社理由
●
スキルを高めあえる仲間がほしい
●
ユーザーに近い仕事がしたい
2
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 3

![Page Image](https://bcdn.docswell.com/page/8EDY6WL5EG.jpg)

#jjug_ccc #jjug_ccc_c
このセッションの目的、目標
● ミューテーションテストを知る
● ミューテーションテストの考え方を知る
○ 既存テストへの課題感
目指さないこと
3
● ミューテーションテストの詳しいやり方
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 4

![Page Image](https://bcdn.docswell.com/page/V7P6Y92DJ8.jpg)

#jjug_ccc #jjug_ccc_c
感想や疑問は
随時Xポストへ！！
4
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 5

![Page Image](https://bcdn.docswell.com/page/2JV3GMDGEQ.jpg)

#jjug_ccc #jjug_ccc_c
みなさん📢
テストコードは書いていますか❓
5
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 6

![Page Image](https://bcdn.docswell.com/page/5EG38GVD7L.jpg)

#jjug_ccc #jjug_ccc_c
そのテストの品質は
どうやって測ってますか❓
6
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4JQ59X6X7P.jpg)

#jjug_ccc #jjug_ccc_c
テストカバレッジ？
● C0：命令網羅
● C1：分岐網羅（判定条件網羅）
● C2：条件網羅
● CMM：複合条件網羅
7
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 8

![Page Image](https://bcdn.docswell.com/page/K749X642E1.jpg)

#jjug_ccc #jjug_ccc_c
問題点
● ミスがあってもカバレッジは100%になる
○ 結果としてミスに気付けない！！
○ 開発のガードになれない😭
8
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 9

![Page Image](https://bcdn.docswell.com/page/LJ1KNV4K7G.jpg)

#jjug_ccc #jjug_ccc_c
テストコードのミスの例 - assertの書き忘れ
9
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GJWD4LXP72.jpg)

#jjug_ccc #jjug_ccc_c
せっかく書くなら
意味のあるテストコードを👍
10
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 11

![Page Image](https://bcdn.docswell.com/page/4EZG2M66J3.jpg)

#jjug_ccc #jjug_ccc_c
どうやって目指す❓
11
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 12

![Page Image](https://bcdn.docswell.com/page/Y76YVN2LEV.jpg)

#jjug_ccc #jjug_ccc_c
意味のあるテストコードの目指しかた
● コードレビュー
○ 人力💪
○ AIパワー🧠
● テストをテスト🤖 ←今回はここの紹介
12
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 13

![Page Image](https://bcdn.docswell.com/page/G75GD52M74.jpg)

#jjug_ccc #jjug_ccc_c
目次 - Mutation Testing
1. Mutation Testingとは
2. 「PIT （Pitest）」の紹介と実演
3. 注意点とさらなる課題
13
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 14

![Page Image](https://bcdn.docswell.com/page/9J2Y8N4RJR.jpg)

#jjug_ccc #jjug_ccc_c
Mutation Testingとは
14
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 15

![Page Image](https://bcdn.docswell.com/page/DEYG6PM5EM.jpg)

#jjug_ccc #jjug_ccc_c
Mutation Testingとは
● 検証対象のコードに誤りを意図的に挿入
○ ちゃんと「テストに失敗する」か確認
○ 偽陰性のチェック
● Fuzzing Test/エラーシーディングの一種
15
○ 意図的に予期せぬデータ等を入れるテスト
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 16

![Page Image](https://bcdn.docswell.com/page/VJNGZ5W478.jpg)

#jjug_ccc #jjug_ccc_c
コラム - 偽陽性と偽陰性
● 偽陽性
○ 合格すべきテストが不合格になる
■ エラーになっているので気付けはする
● 偽陰性
16
○ 不合格になるべきテストが合格になる
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 17

![Page Image](https://bcdn.docswell.com/page/YE9WZYX4E3.jpg)

#jjug_ccc #jjug_ccc_c
コラム - 偽陽性と偽陰性
テスト結果＼実装コード
正しい
誤っている
成功
期待通り
偽陰性
失敗
偽陽性
期待通り
● 偽陽性：脆いテスト、ﬂaky testなど
● 偽陰性：空振り、カバレッジ不足など
サバンナ便り 第2回（和田卓人）より https://gihyo.jp/dev/serial/01/savanna-letter/0002
17
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 18

![Page Image](https://bcdn.docswell.com/page/GE8N162V7D.jpg)

#jjug_ccc #jjug_ccc_c
テストコードのミスの例 - assertの書き忘れ
18
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 19

![Page Image](https://bcdn.docswell.com/page/LELPQ92R7R.jpg)

#jjug_ccc #jjug_ccc_c
テストコードのミスの例 - assertの書き忘れ
偽陰性の例
（空振り）
19
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 20

![Page Image](https://bcdn.docswell.com/page/4JM41Z8P7W.jpg)

#jjug_ccc #jjug_ccc_c
Mutation Testingとは
● Mutation：突然変異/変化
○ mutable（&lt;&gt;イミュータブル）と同じ語源
■ ラテン語の「mutare」
● ミュータントも同じ🐢
20
● コードに突然変異を起こす
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 21

![Page Image](https://bcdn.docswell.com/page/PJRWL65Y79.jpg)

#jjug_ccc #jjug_ccc_c
Googleもすなる
Mutation Testingといふものを、
我もしてみむとてするなり。
21
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 22

![Page Image](https://bcdn.docswell.com/page/PEXPWMK47X.jpg)

#jjug_ccc #jjug_ccc_c
目次 - Mutation Testing
1. Mutation Testingとは
2. 「PIT （Pitest）」の紹介と実演
3. 注意点とさらなる課題
22
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 23

![Page Image](https://bcdn.docswell.com/page/3EKDVG5PJD.jpg)

#jjug_ccc #jjug_ccc_c
とは言え、
Mutation Testingって具体的に
どんなことしてるの？？？
23
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 24

![Page Image](https://bcdn.docswell.com/page/L73RMNK4J5.jpg)

#jjug_ccc #jjug_ccc_c
「PIT （Pitest）」の紹介と実演
● コードを意図的に変更する
○ Stringの戻り値を意図的に空文字にする
○ 判定条件をひっくり返す
■ if(hoge) =&gt; if(!hoge)にする
24
● エラーにならなかったらテストに誤りありかも
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 25

![Page Image](https://bcdn.docswell.com/page/87DY6W357G.jpg)

#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.


# Page. 26

![Page Image](https://bcdn.docswell.com/page/VJP6Y94DE8.jpg)

#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.


# Page. 27

![Page Image](https://bcdn.docswell.com/page/2EV3GMXG7Q.jpg)

#jjug_ccc #jjug_ccc_c
「PIT （Pitest）」の紹介と実演
● なぜPITを使うのか
○ 速い
○ サポートが継続している
■ 他のJava向けライブラリは......らしい
27
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 28

![Page Image](https://bcdn.docswell.com/page/57G38GRDJL.jpg)

#jjug_ccc #jjug_ccc_c
ここから本題：実行環境作る！⚙
28
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 29

![Page Image](https://bcdn.docswell.com/page/4EQ59XVXJP.jpg)

#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.


# Page. 30

![Page Image](https://bcdn.docswell.com/page/KJ49X6M271.jpg)

#jjug_ccc #jjug_ccc_c
「PIT （Pitest）」の紹介と実演 - build.gradle
plugins {
id &#039;java&#039;
id &#039;info.solidsoft.pitest&#039; version &#039;1.15.0&#039;
}
// 中略
repositories {
mavenCentral()
}
dependencies {
testImplementation platform(&#039;org.junit:junit-bom:5.10.0&#039;)
testImplementation &#039;org.junit.jupiter:junit-jupiter&#039;
}
test {
useJUnitPlatform()
}
pitest {
junit5PluginVersion = &#039;1.2.1&#039;
pitestVersion = &#039;1.15.2&#039;
targetClasses = [&#039;example.FizzBuzz*&#039;, &#039;example.TestFizzBuzz*&#039;,&#039;example.Coverage*&#039;,
&#039;example.TestCoverage*&#039;]
outputFormats = [&#039;XML&#039;, &#039;HTML&#039;]
}
30
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 31

![Page Image](https://bcdn.docswell.com/page/LE1KNV8KJG.jpg)

#jjug_ccc #jjug_ccc_c
実行してみる！💪
31
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 32

![Page Image](https://bcdn.docswell.com/page/GEWD4LZPJ2.jpg)

#jjug_ccc #jjug_ccc_c
「PIT （Pitest）」の紹介と実演
● あとはテスト書いて実行するだけ
○ gradle pitest
● ↓こうなれば成功🎉
32
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 33

![Page Image](https://bcdn.docswell.com/page/47ZG2M16E3.jpg)

#jjug_ccc #jjug_ccc_c
レポートを見る🗒
33
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 34

![Page Image](https://bcdn.docswell.com/page/YJ6YVNLL7V.jpg)

#jjug_ccc #jjug_ccc_c
「PIT （Pitest）」の紹介と実演 - レポートを見る
● 初期設定：build/reports/pitest/index.html
34
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 35

![Page Image](https://bcdn.docswell.com/page/GJ5GD51MJ4.jpg)

#jjug_ccc #jjug_ccc_c
「PIT （Pitest）」の紹介と実演 - 問題がある場合のレポート
● FizzBuzzで15の倍数のときにBuzzFizzを返す
ように修正
● アサーションをコメントアウト
35
● テストは空振りで成功：コードは誤り
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 36

![Page Image](https://bcdn.docswell.com/page/LE3RMN1975.jpg)

#jjug_ccc #jjug_ccc_c
「PIT （Pitest）」の紹介と実演 - 問題がある場合のレポート
● 初期設定：build/reports/pitest/index.html
36
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 37

![Page Image](https://bcdn.docswell.com/page/8EDY6WX8EG.jpg)

#jjug_ccc #jjug_ccc_c
「PIT （Pitest）」の紹介と実演 - 詳細レポート
● KILLED：ちゃんとエ
ラーになった
● SURVIVED：エラーに
ならなかった
● 各列に何をやったか
37
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 38

![Page Image](https://bcdn.docswell.com/page/V7P6Y9PWJ8.jpg)

#jjug_ccc #jjug_ccc_c
「PIT （Pitest）」の紹介と実演 - 詳細レポート
● マウスオーバー：どの
テストでエラーか
● 有効になっている変異
パターン
● 検査元、実行時間
38
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 39

![Page Image](https://bcdn.docswell.com/page/2JV3GM29EQ.jpg)

#jjug_ccc #jjug_ccc_c
より詳細は公式サイトへ👣
39
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 40

![Page Image](https://bcdn.docswell.com/page/5EG38GR47L.jpg)

#jjug_ccc #jjug_ccc_c
目次 - Mutation Testing
1. Mutation Testingとは
2. 「PIT （Pitest）」の紹介と実演
3. 注意点とさらなる課題
40
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 41

![Page Image](https://bcdn.docswell.com/page/4JQ59XVR7P.jpg)

#jjug_ccc #jjug_ccc_c
これで完璧じゃーん！
41
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 42

![Page Image](https://bcdn.docswell.com/page/K749X6MQE1.jpg)

#jjug_ccc #jjug_ccc_c
とはならない😭
42
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 43

![Page Image](https://bcdn.docswell.com/page/LJ1KNV8L7G.jpg)

#jjug_ccc #jjug_ccc_c
注意点とさらなる課題
● 指針が薄い
○ ミューテーションテストのカバレッジをど
こまで目指す？
● そもそも失敗するテストがあると検知できない
○ 常にメンテやっていく（当たり前ですが）
43
● ライブラリはまだ不安定なところがありそう
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 44

![Page Image](https://bcdn.docswell.com/page/GJWD4LZQ72.jpg)

#jjug_ccc #jjug_ccc_c
ありそうな質問󰢧
44
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 45

![Page Image](https://bcdn.docswell.com/page/4EZG2M13J3.jpg)

#jjug_ccc #jjug_ccc_c
テスト時間めっちゃ伸びそう
45
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 46

![Page Image](https://bcdn.docswell.com/page/Y76YVNLZEV.jpg)

#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.


# Page. 47

![Page Image](https://bcdn.docswell.com/page/G75GD51974.jpg)

#jjug_ccc #jjug_ccc_c
注意点とさらなる課題 - テスト時間について
● Mutation Testingとしては高速らしい
○ バイトコードで変異
○ カバレッジを見て、狙って変異
■ テストがないコードはそもそも変異させ
ない =&gt; 意味ないから
47
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 48

![Page Image](https://bcdn.docswell.com/page/9J2Y8N15JR.jpg)

#jjug_ccc #jjug_ccc_c
まとめ！
48
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 49

![Page Image](https://bcdn.docswell.com/page/DEYG6PZ6EM.jpg)

#jjug_ccc #jjug_ccc_c
まとめ
● Mutation Testで偽陰性が防げるかも
● JavaならPIT（Pitest）がオススメ
● 業務に導入するのは事前調査したほうが良い
○ 課題とのマッチ、運用方針を決めてから！
49
Copyright (C) 2024 Toranoana Lab Inc. All Rights Reserved.


# Page. 50

![Page Image](https://bcdn.docswell.com/page/VJNGZ5Y178.jpg)

#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.


# Page. 51

![Page Image](https://bcdn.docswell.com/page/YE9WZYPYE3.jpg)

#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.


# Page. 52

![Page Image](https://bcdn.docswell.com/page/GE8N16DK7D.jpg)

#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.


