🧪
【Go】Goのテストに入門してみた! ~一部のサブテスト実行編~
はじめに
前回はテーブル駆動テスト(Table Driven Test)について見ていきました。
今回は「一部のサブテストを実行する方法」に入門していきます。
前回の記事はこちら!
この記事でわかること
- 一部のサブテストを実行する方法
- 正規表現を用いたテストケースのパターン
実装してみた
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 got := Length(tt.input); got != tt.want {
t.Errorf("Length = %d, want %d", got, tt.want)
}
})
}
}
ここまでは前回と同じです。
ここから、一部のサブテストだけ実行してみます。
ターミナル
# go test -v -run '^TestLength$/ascii'
=== RUN TestLength
=== RUN TestLength/ascii
--- PASS: TestLength (0.00s)
--- PASS: TestLength/ascii (0.00s)
PASS
ok go-test-practice 0.188s
asciiという名前のテストだけを実行しました。
どのように一部のサブテストを実行するのか、以下で見ていきましょう。
一部のサブテストの実行方法
1. -runフラグをつける
一部のサブテストを実行するには-runフラグをつけ、正規表現にマッチしたテストを実行します。
2. 正規表現を指定する
関数名/サブテスト名が基本形です。
いくつかの正規表現のパターンがあります。
全サブテストを実行
ターミナル
go test -run '^関数名$'
# 入力例
go test -run '^TestLength$'
特定のサブテストのみ実行
ターミナル
go test -run '^関数名$/サブテスト名'
# 入力例
go test -run '^TestLength$/ascii'
エスケープが必要なサブテストを実行
ターミナル
# 例:括弧を含む場合
go test -run '^関数名$/\(サブテスト名\)'
# 入力例
go test -run '^TestLength$/\(ascii\)'
複数のサブテストを実行
ターミナル
go test -run '^関数名$/(サブテスト名1|サブテスト名2)'
# 入力例
go test -run '^TestLength$/(ascii|emoji)'
サブテスト名に部分一致するものを指定
ターミナル
go test -run '^関数名$/.*テスト名の一部'
# 入力例
go test -run '^TestLength$/.*japanese'
複数のテスト関数・サブテストをまたがって実行
ターミナル
go test -run '^関数名の一部.*$/.*サブテスト名の一部'
# 入力例
go test -run '^Test.*$/.*japanese'
# Testから始まるテスト関数の、japaneseという文字列が末尾に含まれるサブテストを実行
全てのテストを実行
ターミナル
go test -run '.'
# go test と同じ
まとめ
今回は一部のサブテストを実行する方法を学びました。
- 一部のサブテストだけを実行したいときは
-runフラグを使う - 関数名/サブテスト名の正規表現で対象を絞る
フラグと正規表現を用いることで、必要なテストだけを簡単に選んで実行できます。
また、複数テストの組み合わせや、部分一致の活用で効率的なテスト実行が可能になります。
次回は、「一部のテストをスキップする方法」に入門していきます!
参考
Discussion