Slide 1

Slide 1 text

コードカバレッジ計測ツールを 導入したらテストを書くのが楽 しくなった話 Kaigi on Rails 2023 duck-falcon

Slide 2

Slide 2 text

自己紹介 会社: 株式会社 Techouse 部署: 技術部 IT エンジニア 名前: duck-falcon 普段は主にインフラ(AWS)を見てます

Slide 3

Slide 3 text

第一部 コードカバレッジとは 第二部 カバレッジ計測ツールを導入した結果、テストを楽し くかけるようになった話

Slide 4

Slide 4 text

第一部 コードカバレッジとは

Slide 5

Slide 5 text

コードカバレッジとは ソースコードがテストされた割合 あとで直す 20% 60% 90% 悲 嬉

Slide 6

Slide 6 text

コードカバレッジをどう使うか テストの品質を保つための指標として使う

Slide 7

Slide 7 text

コードカバレッジをどう使うか テストの品質を保つための指標として使う テストを お願いします! 了解

Slide 8

Slide 8 text

コードカバレッジをどう使うか テストの品質を保つための指標として使う テストを お願いします! 品質に ばらつき 了解

Slide 9

Slide 9 text

コードカバレッジをどう使うか テストの品質を保つための指標として使う C0カバレッジ80%で テストして! 了解!!

Slide 10

Slide 10 text

コードカバレッジをどう使うか テストの品質を保つための指標として使う C0カバレッジ80%で テストして! 了解!! 品質が保 ちやすい

Slide 11

Slide 11 text

カバレッジの計測方法 ・C0カバレッジ(命令網羅率) ・C1カバレッジ(分岐網羅率) ・C2カバレッジ(条件網羅率) ・MCC(複合条件網羅率) よく使われるのは以下の4つ 条件が厳しい

Slide 12

Slide 12 text

C0カバレッジ(statement coverage/命令網羅率) 全ての命令が実行されれば100%

Slide 13

Slide 13 text

C0カバレッジ(statement coverage/命令網羅率) 全ての命令が実行されれば100% def calculate_ticket_price() price = 1800 # 平日かつ学生は200円引き if weekday? && student? price -= 200 end price end

Slide 14

Slide 14 text

C0カバレッジ(statement coverage/命令網羅率) 全ての命令が実行されれば100% def calculate_ticket_price() price = 1800 # 平日かつ学生は200円引き if weekday? && student? price -= 200 end price end 条件次第では 実行されない

Slide 15

Slide 15 text

C0カバレッジ(statement coverage/命令網羅率) 全ての命令が実行されれば100% def calculate_ticket_price() price = 1800 # 平日かつ学生は200円引き if weekday? && student? price -= 200 end price end カバレッジ100% のテストケース例 1. 水曜日かつ学生 条件次第では 実行されない

Slide 16

Slide 16 text

C1カバレッジ(branch coverage/分岐網羅率) def calculate_ticket_price() price = 1800 # 平日かつ学生は200円引き if weekday? && student? price -= 200 end price end 全ての分岐を1度でも行えば100%

Slide 17

Slide 17 text

C1カバレッジ(branch coverage/分岐網羅率) def calculate_ticket_price() price = 1800 # 平日かつ学生は200円引き if weekday? && student? price -= 200 end price end 全ての分岐を1度でも行えば100%

Slide 18

Slide 18 text

C1カバレッジ(branch coverage/分岐網羅率) def calculate_ticket_price() price = 1800 # 平日かつ学生は200円引き if weekday? && student? price -= 200 end price end カバレッジ100% のテストケース例 1. 水曜日かつ学生 2. 土曜日 全ての分岐を1度でも行えば100%

Slide 19

Slide 19 text

C2カバレッジ(condition coverate/条件網羅率) def calculate_ticket_price() price = 1800 # 平日かつ学生は200円引き if weekday? && student? price -= 200 end price end 全ての条件の真偽が1度でも出れば100%

Slide 20

Slide 20 text

C2カバレッジ(condition coverage/条件網羅率) def calculate_ticket_price() price = 1800 # 平日かつ学生は200円引き if weekday? && student? price -= 200 end price end 全ての条件の真偽が1度でも出れば100%

Slide 21

Slide 21 text

C2カバレッジ(condition coverage/条件網羅率) def calculate_ticket_price() price = 1800 # 平日かつ学生は200円引き if weekday? && student? price -= 200 end price end 全ての条件の真偽が1度でも出れば100% カバレッジ100% のテストケース例 1. 水曜日かつ学生 2. 土曜日かつ大人 平日 学生 水曜日学生 真 真 土曜日大人 偽 偽

Slide 22

Slide 22 text

MCC(複合条件網羅率) def calculate_ticket_price() price = 1800 # 平日かつ学生は200円引き if weekday? && student? price -= 200 end price end 全ての条件の真偽の組み合わせが出れば100% カバレッジ100% のテストケース例 1. 水曜日かつ学生 2. 土曜日かつ大人 3. 水曜日かつ大人 4. 土曜日かつ学生

Slide 23

Slide 23 text

結局どのカバレッジ計測方法を使えばいいの?

Slide 24

Slide 24 text

結局どのカバレッジ計測方法を使えばいいの? C0, C1カバレッジで 80~95%を 目指すのが良い

Slide 25

Slide 25 text

全部できれば一番のように思えるが MCC で 100% が最も良さそうと思うが・・・ ・品質はそれほど上がらず、労力ばかりかかる ・100%にするためだけの低品質なテストが増える などなど

Slide 26

Slide 26 text

結局どのカバレッジ計測方法を使えばいいの? プロジェクトによるが・・・ C0,C1カバレッジの併用がおすすめ

Slide 27

Slide 27 text

カバレッジ率の目標値 カバレッジの目標は80~95% 程度が良いとされている  -> 100%は普通目指さない ・100%にしても品質はそれほど上がらず、労力ばかりかかる ・100%にするためだけの低品質なテストが増える などなど

Slide 28

Slide 28 text

第一部まとめ ・コードカバレッジとはソースがテストされた割合のこと ・カバレッジ計測には種類がある ・悩んだらC0,C1カバレッジで80~95%目標がおすすめ

Slide 29

Slide 29 text

第二部  カバレッジ計測ツールを導入した結果、 テストを楽しく書けるようになった話

Slide 30

Slide 30 text

プロジェクトの背景 タスクリスト —————優先度高————— xx機能リリース yy機能リリース —————優先度低————— top/controllers/hello_controller.rb のテスト top/models/hello.rb のテスト ・ほとんどテストの書かれていないコード(Rails) ・テストを書きたいとは思っているが、後回しにされていた  -> バグ・障害が頻発していた 優先度を 上げたい

Slide 31

Slide 31 text

SimpleCov(https://github.com/simplecov-ruby/simplecov)を導入 カバレッジ計測ツールの導入

Slide 32

Slide 32 text

SimpleCov(https://github.com/simplecov-ruby/simplecov)を導入 カバレッジ計測ツールの導入

Slide 33

Slide 33 text

push カバレッジをチーム全員で見れるようにする

Slide 34

Slide 34 text

push pull request カバレッジをチーム全員で見れるようにする

Slide 35

Slide 35 text

push pull request github pages カバレッジをチーム全員で見れるようにする

Slide 36

Slide 36 text

その結果・・・

Slide 37

Slide 37 text

その結果・・・ 思ったよりテストは書かれなかった!!!!

Slide 38

Slide 38 text

気持ちはあっても時間がない タスクリスト —————優先度高————— xx機能リリース yy機能リリース —————優先度低————— top/controllers/hello_controller.rb のテスト top/models/hello.rb のテスト 優先度を 上げたい

Slide 39

Slide 39 text

タスクリスト —————優先度高————— xx機能リリース yy機能リリース —————優先度低————— top/controllers/hello_controller.rb のテスト top/models/hello.rb のテスト 優先度を 上げたい 気持ちはあっても時間がない

Slide 40

Slide 40 text

優先度の高いタスク 新規機能追加  バグ修正

Slide 41

Slide 41 text

優先度の高いタスク 新規機能追加  バグ修正 要件定義 仕様作成 開発 バグの再現 該当コード特定 コード修正

Slide 42

Slide 42 text

優先度の高いタスク 新規機能追加  バグ修正 要件定義 仕様作成 開発 バグの再現 該当コード特定 コード修正 既存コードを読む作業が入る

Slide 43

Slide 43 text

タスクリスト —————優先度高————— xx機能リリース yy機能リリース —————優先度低————— top/controllers/hello_controller.rb のテスト top/models/hello.rb のテスト コードを読むついでにテストを書けば労力が最小

Slide 44

Slide 44 text

HelloController のテスト HelloController メソッド1のテスト HelloController メソッド2のテスト HelloController メソッド3のテスト 分解

Slide 45

Slide 45 text

カバレッジを見ればテストされているかは一目瞭然

Slide 46

Slide 46 text

カバレッジは改善してきた 31.98% 61.29% 改善

Slide 47

Slide 47 text

プロジェクトの背景② タスクリスト —————優先度高————— xx機能リリース —————優先度中————— yy機能リリース top/controllers/hello_controller.rb のテスト —————優先度低————— その他 優先度 が上昇

Slide 48

Slide 48 text

テストの優先度決定にもカバレッジが使える タスクリスト —————優先度中————— top/controllers/hello_controller.rb のテスト top/controllers/basic_controller.rb のテスト top/controllers/cat_controller.rb のテスト top/controllers/hoge_controller.rb のテスト ・・・

Slide 49

Slide 49 text

テストの優先度決定にもカバレッジが使える タスクリスト —————優先度中————— top/controllers/hello_controller.rb のテスト top/controllers/basic_controller.rb のテスト top/controllers/cat_controller.rb のテスト top/controllers/hoge_controller.rb のテスト ・・・ カバレッジ ✖ 機能の重要度 で、テストの中での優先度を決定

Slide 50

Slide 50 text

やってみた結果 5件 改善 3か月の障害件数 1件!

Slide 51

Slide 51 text

まとめ ・優先度の高いタスクと一緒にやってもらうことでテストを書いても らえた   -> 労力を減らすのにカバレッジが活躍 ・追加するテストの優先度決定にもカバレッジが役に立った