🐥
Go テスト
テスト
テストコードで実行するのは単体テスト。
テストコードは Go で書く。(テスティングフレームワークは使わない。)
テスト実行コマンド
go test
で、*_test.go
ファイルが検索され実行される。
特定のパッケージのみ実行したければgo test [パッケージ名]
。
go test のオプション
- -v : 詳細を表示。
- -cpu : 実行する並列度を指定。複数のコアを使ったテストができる。
- race : データの競合が起きないかテストする。基本的に、このオプションを付けたテストもやっておいたほうがいい。
- -cover : カバレッジを取得。
testing パッケージ
テストコードを書くときに使う。
アサーションは無い。自分で if 文で判定して、t.Error
やt.Fatal
(他のテストがまだでも終了)で失敗理由を出力してテストを終了する。
なので、比較演算子を使って判定するわけだが、それで辛い場合はgoogle/go-cmp
を使うと細かい比較ができる。
テスト例
import "testing"
func TestSample(t *testing.T) {
expect := "a"
actual := getData()
if actual != expect {
t.Errorf(`expect="%s" actual="%s"`, expect, actual)
}
}
テーブル駆動テスト
テスト関数の序盤にテストケースをまとめて書いておき、それらを実行するコードをその下に記述しておくスタイル。
テスタブルなコード
- 個々の機能が疎結合
- 単体テストがしやすい
- 外部との接続部分(DB 接続やネットワーク接続、ファイルアクセス)が抽象化されている
- 抽象化されている部分をモックに差し替えられる
テストデータ
どんな環境でも使用できるテストデータを用意する。
(ネットワークアクセスやテストデータ以外のファイルアクセスを発生させない。)
テストデータはtestdata
というディレクトリに入れる。
(testdata
はパッケージと認識されない。)
Discussion