🧪
【Go】Goのテストに入門してみた! ~一部のテストをスキップ編~
はじめに
前回は「一部のサブテストを実行する方法」を見ていきました。
今回は「一部のテストをスキップする方法」に入門していきます!
前回の記事はこちら!
この記事でわかること
-
t.Skip()やt.Skipf()を使ってテストをスキップする方法 -
testing.Short()と-shortフラグを活用して重い処理を避ける方法 - サブテスト単位で条件に応じてテストをスキップする方法
基本的なスキップの方法
main_test.go
package main
import (
"testing"
"time"
"unicode/utf8"
)
func Length(s string) int {
// 擬似的に高負荷処理を実行
time.Sleep(30 * time.Second)
return utf8.RuneCountInString(s)
}
func TestLength(t *testing.T) {
if testing.Short() {
t.Skip("スキップ")
}
if got := Length("Hello"); got != 5 {
t.Errorf("Length(\"Hello\") = %d; want 5", got)
}
}
以下のように実行すると、テストをスキップすることができます。
ターミナル
# go test -v -short
=== RUN TestLength
main_test.go:17: スキップ
--- SKIP: TestLength (0.00s)
PASS
ok go-test-practice 0.349s
1. t.Skip()またはt.Skipf()でスキップする
テストをスキップするには t.Skip() または t.Skipf() を指定します。
2. testing.Short()の利用
テストの実行時間が長くなる場合、testing.Short() を用いることができます。
-shortフラグ を使うことで testing.Short() がtrueを返し、後続の処理(主にスキップ処理)を実行することができます。
3. その他の活用例
テストによっては特定のOSでは実行できないものもあります。
その場合も t.Skip() または t.Skipf() を使ってスキップすることができます。
サブテストでのスキップ
main_test.go
package main
import (
"testing"
"unicode/utf8"
)
func Length(s string) int {
return utf8.RuneCountInString(s)
}
func TestLength(t *testing.T) {
tests := []struct {
name string
input string
want int
}{
{"ascii", "Hello", 5},
{"full-width-japanese", "こんにちは", 5},
{"half-width-japanese", "コンニチハ", 5},
{"emoji", "😃😃😃", 3},
{"empty", "", 0},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.name == "emoji" {
t.Skip("emojiをスキップ")
}
if got := Length(tt.input); got != tt.want {
t.Errorf("Length = %d, want %d", got, tt.want)
}
})
}
}
ターミナル
=== RUN TestLength
=== RUN TestLength/ascii
=== RUN TestLength/full-width-japanese
=== RUN TestLength/half-width-japanese
=== RUN TestLength/emoji
main_test.go:27: emojiをスキップ
=== RUN TestLength/empty
--- PASS: TestLength (0.00s)
--- PASS: TestLength/ascii (0.00s)
--- PASS: TestLength/full-width-japanese (0.00s)
--- PASS: TestLength/half-width-japanese (0.00s)
--- SKIP: TestLength/emoji (0.00s)
--- PASS: TestLength/empty (0.00s)
PASS
ok go-test-practice 0.190s
# 「emoji」というサブテストが「SKIP」されていることがわかる
まとめ
今回は「一部のテストをスキップする方法」について学びました。
-
t.Skip()やt.Skipf()を使うことで、特定の条件下でテストの実行を制御できる -
testing.Short()と-shortフラグを組み合わせることで、負荷の高い処理を省略できる - テーブル駆動テストと組み合わせれば、サブテスト単位で柔軟にスキップ処理が書ける
次回は、「テストの前処理・後処理」に入門します!
参考
Discussion