今まで VSCode の Generate Unit Tests For Function
で作成してなんとなくで書いてたけどちゃんと勉強した。
https://github.com/andmorefine/learn-go-with-tests を使って勉強した。日本語訳が微妙だったので英語版がよかった。
以下メモ。
t.Helper()
を使えば失敗した行が関数呼び出し側になるgo test -bench=.
を実行するgo test -cover
を実行するreflect.DeepEqual
を使って変数を比較する(型安全ではないので注意)。var m map[string]string
var dictonary = map[string]string{}
もしくは var dictonary = make(map[string]string)
net/http/httptest
があってこれで模擬 HTTP サーバを作れるテストを行う際に、前処理と後処理を書きたい場合がある。
その場合は、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