vscode で Go Generate Unit Test が便利だった♪

vscode で Go Generate Unit Test が便利だった♪

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
}{
// TODO: Add test cases.
}
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 のテストを書く際に参考になれば何よりです。
以上です。

vscode で Go Generate Unit Test が便利だった♪

https://kenzo0107.github.io/2020/03/06/2020-03-07-vscode-go/

Author

Kenzo Tanaka

Posted on

2020-03-07

Licensed under

コメント