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

Goのカバレッジ計測の仕組みをコードリーディングで理解する

Avatar for OPTiM OPTiM
October 06, 2025
79

 Goのカバレッジ計測の仕組みをコードリーディングで理解する

2025/9/28 開催「Go Bash vol.2」での発表資料です。

https://layerx.connpass.com/event/367057/

Avatar for OPTiM

OPTiM

October 06, 2025
Tweet

More Decks by OPTiM

Transcript

  1. © 2019-2025 OPTiM Corp. All rights reserved. 2 自己紹介 ・

    名前:宍戸(ししど) ・ 担当:バックエンド ・ 所属:株式会社オプティム ・ プロダクト ・2023年~ OPTiM Biz (MDM)で開発と問い合わせ対応 ・2025年~ OPTiM Collaboration Portal でバックエンド
  2. © 2019-2025 OPTiM Corp. All rights reserved. 4 会社紹介 商号

    株式会社オプティム(プライム市場:3694) Tokyo Kobe 設立 2000年 オフィス OPTiM TOKYO(東京本社@浜松町) 総スタッフ数 700名 ※正スタッフ 433名 OPTiM SAGA(佐賀本店@佐賀大学キャンパス内) OPTiM KOBE (神戸オフィス@三ノ宮) TECH CENTER IIZUKA (テックセンター飯塚@九州工業大学飯塚キャンパス前) 代表者 菅谷 俊二 うち7割がエンジニア職 Optimization:最適化 Optimism:楽観主義 × (2025年4月現在) Saga
  3. © 2019-2025 OPTiM Corp. All rights reserved. 9 ・ カバレッジとは?

    ・ 実装を確認してみる ・ カバレッジを計測するための仕組み ・ まとめ アジェンダ
  4. © 2019-2025 OPTiM Corp. All rights reserved. 11 カバレッジ =

    テストのカバー率  Go のテストにおいてカバレッジを図るためのコマンドが存在します  カバレッジ = テスト対象コードのうち実行された命令文(statements)の割合
  5. © 2019-2025 OPTiM Corp. All rights reserved. 13 Go の実装を確認しに行く

    https://github.com/golang/go 今回はコマンド関連の実装から コードリーディングしていくので Cmd ディレクトリ配下を確認
  6. © 2019-2025 OPTiM Corp. All rights reserved. 14 エントリーポイントの実装 参考:

    src/cmd/go/main.go lookupCmd が怪しそう あとで登場します
  7. © 2019-2025 OPTiM Corp. All rights reserved. 15 コマンドの探索 src/cmd/go/internal/base/base.go

    1: go test –-cover の場合、test コマンドが存在する 2: c.Runnable で main.go の init 関数にある test と一致するフィールドが存在することを確認 3: サブコマンドが存在する場合は継続する lookupCmd の中の処理 src/cmd/go/main.go
  8. © 2019-2025 OPTiM Corp. All rights reserved. 17 Cover のフラグが立つ手順

    src/cmd/go/internal/test/testflag.go AddCoverFlags が怪しい
  9. © 2019-2025 OPTiM Corp. All rights reserved. 18 AddCoverFlags の実装

    src/cmd/go/internal/work/build.go AddCoverFlags は cover 系のフラグを cmd に登録する関数 フラグが使える状態になっただけで 有効にはなってない
  10. © 2019-2025 OPTiM Corp. All rights reserved. 21 カバレッジを計測する仕組み 分子

    = AST で仕込んだカウンタを、実行時に集計した数 分母 = AST 解析で検出した全ブロック数 coverage % = 分子 / 分母
  11. © 2019-2025 OPTiM Corp. All rights reserved. 22 どのようにカウンタを仕込むのか cover

    のフラグをオン AST で解析開始 ブロックごとの検知 カウンタ挿入 AST(抽象構文木) とは ◼ プログラムを木構造にした設計図 ◼ 文字列としてのコードではなく「構造」で表す ◼ 例:if x > 0 { return x }
  12. © 2019-2025 OPTiM Corp. All rights reserved. 25 ifブロック通過 (coverCount++)

    elseブロック通過 (coverCount++) Cover 率 100%!!
  13. © 2019-2025 OPTiM Corp. All rights reserved. 26 まとめ ・Go

    のカバレッジは AST を変換してブロックごとにカウンタを挿入 する仕組みで成り立つ ・ カバレッジを理解するとどこがカバーできていないかを明確にする ことができる ・数字の裏側を知ることで、カバレッジを「ただの%」から「テスト 改善の指標」にできる