🐦

Goでのテストコード作成、カバレッジ計測について

2024/03/29に公開

はじめに

Goで簡単なアプリケーションを作成しています。
その際にテストコードを作成しましたので、作成手順などをここに備忘録として残します。

環境

OS:macOS Ventura 13.2.1
Go:1.18
エディター: Visual Studio Code 1.66.0

テスト対象のコード

今回のテスト対象のコードはこちらです。

22行目のRegistUserはユーザー情報をテーブルに登録するメソッドです。
登録時にエラーが発生したらエラーを呼び出し元に返し、登録成功しエラーが発生しない場合はnilを返します。
今回はこちらメソッドのテストコードを作成していきます。

テストコードの生成

キャプチャーのように右クリックをし「Go:Generate Unit Tests For Function」を押します。

押下後、同じパッケージ内でテストコードが出力されます。

出力されたテストコードは以下のようになっています。

このままではテストができませんので、赤枠のところにテストケースを実装します。

テストケースの実装

以下が実装したテストケースです。

テストケースの項目について下記の通りです。

項目 説明 備考
name テストケース名などを記入
fields コンストラクタの引数 今回はDBのコネクションを引数に設定
args テスト対象のメソッドの引数
wantErr エラーの期待値 期待値としてエラーが返却される場合はtrue、返却されない場合はfalse

続いて、作成したテストケースについて説明します。

  • テストケース1
    nameには「テストケース1」、fieldsにはDBのコネクション、argesには名前が「ツバクロー」、メールアドレスが「swallows@test.com」、パスワード「swallows」のユーザー型の構造体、wantErrはエラーが返却されない想定のためfalseを設定します。
  • テストケース2
    nameには「テストケース2」、wantErrは今回は一意制約違反でエラーが返却される想定のためtrueを設定しています。他の項目はテストケース1と同じです。

テストコードの実行

Vscodeの「run test」、「debug test」を押すとテストコードが実行されます。

コマンドでは以下の様に実行できます。

  • パッケージ単位
    go test ./パッケージ名

    go test ./repository

  • ファイル単位
    go test テストコード テスト対象のファイル

    go test user_reopsitory_test.go user_reopsitory.go

  • メソッド単位
    go test -run テストコードのメソッド

    go test -run Test_userRepository_RegistUser

以下のオプションをつけることも可能です。

オプション 説明
-v 詳細な結果
-cover カバレッジ出力

今回はメソッド単位でカバレッジ出力させます。
go test -cover -run Test_userRepository_RegistUser

テスト結果に問題なければ、以下の様に表示されます。

結果の内容としてはテストケース2で発生した一意制約違反のエラーが出力されるていることがわかります。
そして、カバレッジの網羅率が44.4%、テスト結果がOKと出力されています。

テスト結果がNGの場合は以下の通りになります。

エラーログが出力されテスト結果がFAILとなっています。

カバレッジ出力

テストコードを実行するコマンドに以下のオプションを付けることでカバレッジを計測したファイルが出力されます。
-coverprofile=./出力ファイル名
実際に出力させてみます。
go test -cover -coverprofile=./coverage.txt -run Test_userRepository_RegistUser

coverage.txtが出力されました。

では、出力内容を確認してみます。

これでは処理がどこを通過したのかが分かりにくいですね。

そこで以下のコマンドを実行してカバレッジを見やすくします。
go tool cover -html=coverage.txt -o coverage.html
-html=にはインプットとなるファイルを指定し、-oにはアウトプットのファイル名を指定します。

出力されました。

こちらのファイルをブラウザで見てみましょう。

赤色は処理が通っていない箇所、緑色は処理が通った箇所です。
これで処理がどこを通過したが確認できますね。

終わりに

今回はテストコード作成から実行、カバレッジ出力をしました。
これ以外にもGoではモックの自動生成も可能です。
次回はモックについて説明ができたらと思います。

参考資料

Go言語でテストコードを書いてみた!
Go言語でテストコードを書いてみよう
Goでテストカバレッジを測定する

Discussion