🐥

Go テスト

2023/09/06に公開

テスト

テストコードで実行するのは単体テスト。
テストコードは Go で書く。(テスティングフレームワークは使わない。)

テスト実行コマンド

go testで、*_test.go ファイルが検索され実行される。
特定のパッケージのみ実行したければgo test [パッケージ名]

go test のオプション

  • -v : 詳細を表示。
  • -cpu : 実行する並列度を指定。複数のコアを使ったテストができる。
  • race : データの競合が起きないかテストする。基本的に、このオプションを付けたテストやっておいたほうがいい。
  • -cover : カバレッジを取得。

testing パッケージ

テストコードを書くときに使う。

アサーションは無い。自分で if 文で判定して、t.Errort.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)
  }
}

テーブル駆動テスト

テスト関数の序盤にテストケースをまとめて書いておき、それらを実行するコードをその下に記述しておくスタイル。

https://qiita.com/ryo_manba/items/242f629e0b3593879c6d
https://zenn.dev/kimuson13/articles/go_table_driven_test

テスタブルなコード

  • 個々の機能が疎結合
    • 単体テストがしやすい
  • 外部との接続部分(DB 接続やネットワーク接続、ファイルアクセス)が抽象化されている
    • 抽象化されている部分をモックに差し替えられる

テストデータ

どんな環境でも使用できるテストデータを用意する。
(ネットワークアクセスやテストデータ以外のファイルアクセスを発生させない。)

テストデータはtestdataというディレクトリに入れる。
testdataはパッケージと認識されない。)

Discussion