Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

duck-falcon
October 28, 2023

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

コードカバレッジ計測ツールを導入したらテストを書くのが楽しくなった話
https://kaigionrails.org/2023/talks/duck/

レガシーなコードに対してテストを書くというのは挑戦であり、しばしば時間とリソース(それと精神力)を多く必要とします。 どうすればチーム全体で楽しく、効率的にこの問題に取り組むことができるのでしょうか?

本セッションでは、まずコードカバレッジの基本的な概念を説明します。 C0, C1, C2カバレッジの違いや、なぜ100%のカバレッジを追求するべきでないのか、その理由について簡単に説明します。

そして、コードカバレッジツール: SimpleCovの導入を通して、 実際のプロジェクトでテストを書く負荷を最小限にし、 チームメンバーがテストコーディングを楽しむことができる環境を整えた方法を紹介します。 また、新規開発の品質向上にもいい影響を与えた話も合わせて行います。

duck-falcon

October 28, 2023
Tweet

More Decks by duck-falcon

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  36. その結果・・・

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide