Go言語入門:統合テストのカバレッジ -Vol.1-

スポンサーリンク
Go言語入門:統合テストのカバレッジ -Vol.1- ノウハウ
Go言語入門:統合テストのカバレッジ -Vol.1-
この記事は約5分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

本日は、Go言語の統合テストのカバレッジついて解説しています。

スポンサーリンク

背景

Go言語でテストを書いていると、「go test -coverprofileでカバレッジが取れるのは知っているけど、統合テストのカバレッジってどうやって測るんだろう?」と疑問に思ったことはありませんか?

公式ドキュメントには、Go 1.20から統合テストのカバレッジ測定がサポートされたことが書かれていますが、英語で書かれている上に、ユニットテストとの違いや具体的な手順の説明が簡潔すぎて、初めて読むと「結局どうすればいいの?」と戸惑ってしまうかもしれません。

この記事では、公式ドキュメントの内容を丁寧な日本語に翻訳し、さらに初心者の方でも理解できるように、ユニットテストと統合テストの違い、なぜ3ステップ必要なのか、そして実際にどのようなコマンドを実行すればよいのかを、具体例を交えて解説していきます。

統合テストのカバレッジ測定は一見難しそうに見えますが、仕組みを理解すれば決して複雑ではありません。実際のアプリケーションでどれだけコードがテストされているかを把握することで、より品質の高いソフトウェア開発ができるようになります。一緒に学んでいきましょう!

概要

Goは、go test -coverprofile=... <pkg_target> コマンドを通じて、パッケージ単体テストレベルでカバレッジプロファイルを収集するための使いやすいサポートを提供しています。Go 1.20以降、ユーザーはより大規模な統合テスト向けのカバレッジプロファイルを収集できるようになりました。統合テストとは、特定のアプリケーションバイナリを複数回実行する、より重厚で複雑なテストのことです。

単体テストの場合、カバレッジプロファイルの収集とレポート生成には2つのステップが必要です。まず go test -coverprofile=... を実行し、次に go tool cover {-func,-html} を呼び出してレポートを生成します。

統合テストの場合、3つのステップが必要です。ビルドステップ、実行ステップ(ビルドステップで生成されたバイナリを複数回呼び出す場合があります)、そして最後にレポート生成ステップです。詳細は以下で説明します。


解説

カバレッジとは何か

カバレッジとは、「テストによってプログラムのコードがどれだけ実行されたか」を示す指標です。例えば、100行のコードがあって、テストで80行が実行されたら、カバレッジは80%になります。

レストランの例え:

  • レストランのメニューが100品あるとします
  • テスト(試食会)で実際に作ってみた料理が80品なら、カバレッジは80%
  • 残り20品は「作り方は書いてあるけど、実際に作って確認していない」状態

単体テストと統合テストの違い

単体テスト(Unit Test):

  • 個々の関数やメソッドを単独でテストする
  • 小さな部品一つ一つの動作確認
  • レストランで言えば「一つの料理だけを試食する」

統合テスト(Integration Test):

  • 複数の機能を組み合わせた、実際の使用に近いテスト
  • アプリケーション全体を起動して実行する
  • レストランで言えば「コース料理全体を通して試食する」
  • より実際の使用環境に近い

なぜステップ数が違うのか

単体テストの場合(2ステップ):

1. go test -coverprofile=coverage.out
   → テスト実行 + カバレッジデータ収集を同時に行う

2. go tool cover -html=coverage.out
   → 収集したデータからレポート生成

単体テストは go test コマンドがテストの実行とカバレッジ収集を一度に行ってくれるので簡単です。

統合テストの場合(3ステップ):

1. ビルドステップ
   → カバレッジ測定機能を組み込んだバイナリ(実行ファイル)を作成

2. 実行ステップ
   → 作成したバイナリを実際に動かす(何度でも実行可能)
   → 実行するたびにカバレッジデータが蓄積される

3. レポート生成ステップ
   → 蓄積されたカバレッジデータからレポートを作成

なぜ統合テストは3ステップ必要なのか

統合テストでは、実際のアプリケーションを動かす必要があります。そのため:

  1. ビルドとテスト実行を分離する必要がある
    • 単体テスト: go test がテストコードを自動で実行
    • 統合テスト: 自分でアプリケーションを起動して操作する
  2. 複数回の実行をサポートする必要がある
    • 「ログイン → 記事作成 → ログアウト」のような一連の操作
    • それぞれの操作でバイナリを起動・終了する場合がある
    • すべての実行のカバレッジを統合する必要がある

具体例: Webサーバーの統合テスト

# ステップ1: カバレッジ機能付きでビルド
go build -cover -o myserver ./cmd/server

# ステップ2: サーバーを起動して実際にテスト
./myserver &  # バックグラウンドで起動

# 実際のHTTPリクエストを送信してテスト
curl http://localhost:8080/api/users
curl http://localhost:8080/api/posts
curl http://localhost:8080/health

# サーバーを停止(この時点でカバレッジデータが保存される)
kill %1

# ステップ3: レポート生成
go tool covdata textfmt -i=./coverage -o=coverage.txt
go tool cover -html=coverage.txt

Go 1.20の新機能の意義

Go 1.20より前は、統合テストのカバレッジを取るのが非常に困難でした。この機能追加により:

  • ✅ 実際の本番環境に近い形でのテストカバレッジが測定可能に
  • ✅ 複数回の実行にまたがるカバレッジを統合できる
  • ✅ より正確な「実際に使われているコードの割合」が把握できる

まとめ

  • 単体テスト: 軽量、go test だけで完結(2ステップ)
  • 統合テスト: 重厚、ビルド→実行→レポート生成の3ステップ
  • Go 1.20以降で統合テストのカバレッジ測定が標準サポートされた
  • 実際のアプリケーション動作に近い形でカバレッジを測定できる

次のセクションでは、具体的なコマンドの使い方や設定方法について詳しく見ていきます。

おわりに 

本日は、Go言語の統合テストのカバレッジについて解説しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました