きほん
golangでテストを書く場合は以下のように書く。
main_test.go
package main
import "testing"
func TestHelloWorldを返すか確認するテスト(t *testing.T){
get := foo()
if get != "Hello World" {
t.Errorf("foo() get = %s", get)
}
}
いろいろなテストパターンを試す
これが一番シンプルな方法だが、いろいろなパターンを試したいときもある。
そのときは以下のように書く。
main_test.go
package cli
import (
"testing"
)
func Test入力した英語の単語を日本語に変換できることを確認するテスト(t *testing.T) {
type args struct {
input string
}
tests := []struct {
name string
args args
want string
wantErr bool
}{
{
name: "ユーザーの入力「hello」を「こんにちは」に変換できることを確認する",
args: args{
input: "hello",
},
want: "こんにちは",
},
{
name: "ユーザーの入力「world」を「世界」に変換できることを確認する",
args: args{
input: "world",
},
want: "世界",
},
{
name: "ユーザーの入力「こんにちは」が入力されたときにエラーを返すことを確認する",
args: args{
input: "こんにちは",
},
want: "",
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
get, err := translate(tt.args.input)
if wantErr && err == nil {
t.Errorf("エラーが出力されていません: get = %s err = %v", get, err)
}
if !wantErr && get != tt.want) {
t.Errorf("値が一致していません: get = %v, want = %v", get, tt.want)
}
})
}
処理をまとめる
処理をまとめたいときはHelperを使う
example.go
package example
import (
"testing"
)
//こっちは出力されない
func errorf(tb testing.TB, want, got int) {
tb.Errorf("want = %d, got = %d", want, got)
}
//tb.Helper()を宣言しないと出力されない
func errorfHelper(tb testing.TB, want, got int) {
tb.Helper()
tb.Errorf("want = %d, got = %d", want, got)
}
前後に処理をはさむ
example.go
//テストの前後に処理を挟むにはTestMain(m *testing.M)を使う
func TestMain(m *testing.M) {
func() {
fmt.Println("Prepare test")
}()
//m.Run()前後に処理を書くことでm.Run()を中心に処理が実行される。
ret := m.Run()
func() {
fmt.Println("Teardown test")
}()
os.Exit(ret)
}
間違いなどがあれば指摘していただければと思います!