ReadMeFirst

こんにちは @marnie_ms4 です。
筆不精で、今まではブログを書いては放置したりばかりだったのですが、
業務でgoを使っているので、golangについて記事を書き溜めていこうと思います。
(主に自分の備忘的なところもありますが)

さて、golangでは自動テストを標準でサポートしています。
なにはなくとも言語を使う上でテストコードは必須ですよね。
ということで、この記事ではテストの実行や作り方について記載します。

テストの作り方

testファイルは ****_test.go という命名で作成します。

  • example.go
package main

import (
    "errors"
)

func example(code string) (int,err) {
  if code == "hoge" {
       return 1,nil
  }
  return 0,errors.New("code must be hoge")
}
  • example_test.go

testing packageの以下に従って作成します。

To write a new test suite, create a file whose name ends _test.go that contains the TestXxx functions as described here. 
package main

import (
    "testing" // テストで使える関数・構造体が用意されているパッケージをimport
)

func TestExampleSuccess(t *testing.T) {
    result, err := example("hoge")
    if err != nil {
        t.Fatalf("failed test %#v", err)
    }
    if result != 1 {
        t.Fatal("failed test")
    }
}

func TestExampleFailed(t *testing.T) {
    result, err := example("fuga")
    if err == nil {
        t.Fatal("failed test")
    }
    if result != 0 {
        t.Fatal("failed test")
    }
}

実行

go test go test -run でテストが行えます。

go test packagePath  # cf. go test github.com/hoge/moge パッケージを指定
go test -run ''      # カレントディレクトリ内の全てのテストを実行
go test -run Foo     # Fooを含むテスト関数を実行

testing package より。
go test -helpでオプションを確認可能。

再帰的に行いたい場合は以下など便利。

go test -v hoge/... # hoge/以下のテストを実行
go test ... # GOPATH以下全てテストしようとするので終わらないので注意

実行すると

$ go test -run ""
PASS
ok      playground_/moge    0.794s

まとめ

こんな感じでテストを書いたり、実行する事ができます。
他に

  • BenchMark用のテストユーティリティやパッケージも用意されている
  • 標準でassertionがない
  • subTest,tableDrivenTest
  • -parallel nによる並列実行

など書きたいことがありますので、別記事でtesting packageの説明も交えつつ、
より実践的な内容を書きたいと思います。

参考