Go でテストを書く際に vscode の Go extension の単体テストのフォーマットを簡単に生成できる機能があったので利用すると非常に便利でした。
以下の様な main.go ファイルがあるとします。
1 2 3 4 5 6 7 8
| package main
func hello(s string) string { if s == "" { return "world" } return s }
|
関数名をクリックしてポインタを置いて、 Mac だと Command + Shift + p でコマンドパレットが表示されるので
Go: Generate Unit Tests For Function
と打ち込んでエンターを押すと
以下 main_test.go が生成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package main
import "testing"
func Test_hello(t *testing.T) { type args struct { s string } tests := []struct { name string args args want string }{ } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := hello(tt.args.s); got != tt.want { t.Errorf("hello() = %v, want %v", got, tt.want) } }) } }
|
関数がスネークケース (Test_hello) になるのがやや気になりますが、テスト対象の関数名が小文字で始まる場合にこうなる様です。
テストケースに必要な情報を struct で管理し、 for で順次回すというフォーマットです。
TABLE DRIBEN TESTS
func hello(string)
の引数が args で指定されています。
1 2 3
| type args struct { s string }
|
もしテスト対象が func(string, int)
なら以下の様に変わってくれます。
1 2 3 4
| type args struct { s string i int }
|
テストを以下の様に書いて、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package main
import "testing"
func TestHello(t *testing.T) { type args struct { s string } tests := []struct { name string args args want string }{ { name: "return 'hello' if you set 'hello'", args: args{ "hello", }, want: "hello", }, { name: "空文字を指定したら world が返ってくる", args: args{ "", }, want: "world", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := hello(tt.args.s); got != tt.want { t.Errorf("hello() = %v, want %v", got, tt.want) } }) } }
|
テストを実行すると name 毎にテストが PASS しているか確認できます。
半角スペースが _ に変換されます。
1 2 3 4 5 6 7 8 9 10 11
| $ go test -count 1 -v .
$ go test -count 1 -v ./hoge === RUN TestHello === RUN TestHello/return_'hello'_if_you_set_'hello' === RUN TestHello/空文字を指定したら_world_が返ってくる --- PASS: TestHello (0.00s) --- PASS: TestHello/return_'hello'_if_you_set_'hello' (0.00s) --- PASS: TestHello/空文字を指定したら_world_が返ってくる (0.00s) PASS ok github.com/kenzo0107/hoge 0.212s
|
便利です ♪
ちなみに、 Go: Generate
は他にもあります。
vscode で golang のテストを書く際に参考になれば何よりです。
以上です。