post: 2021-12-14
update: 2023-01-05
INDEX ▶
goでtest
メインで使ってるわけでな無いがGoを使う機会があり、ある程度実装はできてるものの、既存コードの見様見真似で書いてる箇所も多く不安が残る状態でした。
であればテストを書いて安心したいと思ってテスト書く作業を進めました。
サンプルコード
この記事ではサンプルとしてmainとmainから呼ばれる関数が1つあるコードを書きます。
関数についてはカバレッジの確認をしたいので分岐あるようにしておきます。
package main
import "fmt"
func main() {
fmt.Println(Greet("hello"))
fmt.Println(Greet("what's up"))
fmt.Println(Greet("aaaaa"))
}
func Greet(name string) string {
if name == "hello" {
return "こんにちは"
} else if name == "what's up" {
return "調子どう"
} else {
return "やあ"
}
}
この関数についてテストを書いていきます。
go testインストール
まずはテストツールをインストールします。
goのテストツールはいくつかありますが今回はgo test
を使います。
go get -u github.com/cweill/gotests/...
テストコード出力
Greet関数についてのみ、ファイル出力します
gotests -only Greet -w .
出力された雛形を確認します
package main
import "testing"
func TestGreet(t *testing.T) {
type args struct {
name 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 := Greet(tt.args.name); got != tt.want {
t.Errorf("Greet() = %v, want %v", got, tt.want)
}
})
}
}
// TODO: Add test cases.
ここにテストケースを書いていきます。
テストデータの型も決まっているので楽です。
今回の場合はここ
type args struct {
name string
}
tests := []struct {
name string
args args
want string
}
name: テストケース名を書く
args: 実際にテストする関数に合わせて型が決まる。今回はname: string。
want: 期待値を書く
上記を踏まえると下記のようなテストケースを書きます。
{
name: "hello",
args: args{
name: "hello",
},
want: "こんにちは",
},
{
name: "what's up",
args: args{
name: "what's up",
},
want: "調子どう",
},
{
name: "else",
args: args{
name: "aaaaaaaa",
},
want: "やあ",
},
go test実行
go test ./sample.go ./sample_test.go
結果が下記の様に出力されます
ok command-line-arguments 0.301s
ちなみにテストケースが間違ってる場合は
{
name: "hello",
args: args{
name: "hello",
},
want: "グーテンモルゲン",
},
このように出力されます。まあまあわかりやすい。
--- FAIL: TestGreet (0.00s)
--- FAIL: TestGreet/hello (0.00s)
sample_test.go:40: Greet() = こんにちは, want グーテンモルゲン
FAIL
FAIL command-line-arguments 0.214s
FAIL
カバレッジ
カバレッジを取りたい場合はオプションをつけます
go test -cover ./sample.go ./sample_test.go ✘ 1
ok command-line-arguments 0.244s coverage: 62.5% of statements
カバレッジ見やすく
具体的にコードのどのパスを通ったか確認したい場合
go test -cover -coverprofile=cover.out ./sample.go ./sample_test.go
出力されたcover.outからhtmlを出力
go tool cover -html=cover.out -o cover.html
これを確認するとhtmlでグラフィカルにテストカバレッジ状況が分かります。
終わり
以上です。
シンプルで使いやすいです!