MyDocs

# Goのテストを勉強する

今まで VSCode の Generate Unit Tests For Function で作成してなんとなくで書いてたけどちゃんと勉強した。

https://github.com/andmorefine/learn-go-with-tests を使って勉強した。日本語訳が微妙だったので英語版がよかった。

以下メモ。

setup / teardown

テストを行う際に、前処理と後処理を書きたい場合がある。

その場合は、TestMain を実装する。

package main

import (
	"log"
	"os"
	"testing"
)

func TestMain(m *testing.M) {
	log.Println("Before")
	ret := m.Run()
	log.Println("After")
	os.Exit(ret)
}

func Test_A(t *testing.T) {
	log.Println("Test_A running")
}

func Test_B(t *testing.T) {
	log.Println("Test_B running")
}

// 2024/08/14 15:40:10 Before
// 2024/08/14 15:40:10 Test_A running
// 2024/08/14 15:40:10 Test_B running
// PASS
// 2024/08/14 15:40:10 After

TestMain では、testing.M を引数に取る必要がある。

前処理と後処理の最中にエラーが発生した場合には、os.Exit で以上終了したことを伝える必要がある。 終了コード「0」以外で終了する場合は、log.Fatalf を使うと便利。

func TestMain(m *testing.M) {
  if err := setup(); err != nil {
    log.Fatalf("failed to setup: ", err)
  }

	ret := m.Run()

  if err := teardown(); err != nil {
    log.Fatalf("failed to teardown: ", err)
  }

	os.Exit(ret)
}

カバレッジ

テストの進捗を示す指標としてカバレッジがある。

テストを実行した際に、テスト対象のプログラムが、テストによりどれくらいパスしたかを網羅率という数値で表す。

$ go test -cover

また、どこのテストが実施されていないかを知るためには、cover プロファイルというファイルを生成する必要がある。

$ go test -coverprofile=cover.out

このままのファイルでは見にくいので、ブラウザ上で見られるように変換する。

$ go tool cover -html=cover.out -o cover.html