導入
Go言語での開発において、テストは品質を守るための要ですが、プロジェクトが大きくなると「たった一つの小さな修正を確認したいだけなのに、全テストが終わるまで数分待たされる」といった状況に陥りがちです。
そんな時、今回紹介する「特定のサブテストのみを実行する方法」を知っていると、開発サイクルが劇的に速くなります。このTipsを活用することで、修正箇所の確認にかかる待ち時間を最小限に抑えることができます。
基礎知識
Goの標準テストツールである「go test」コマンドは、非常に柔軟に動作を指定できます。
特に、t.Run関数を使用することで、一つのテスト関数の中に複数のサブテストを定義できます。
例えば、計算処理のテスト関数の中に「正常系」「異常系」「境界値」といったサブテストを並べる構成が一般的です。
通常通り「go test ./…」を実行すると全テストが走りますが、オプションを組み合わせることで、特定の階層のテストだけをピンポイントで実行することが可能です。
実装/解決策
特定のサブテストを実行するには、-runフラグに「テスト関数名/サブテスト名」の形式で指定します。
スラッシュ(/)を使うことで、親テストと子テストの階層関係を表現できます。これにより、巨大なテストスイートの中から、今まさに修正している箇所だけを即座に再実行できるようになります。
サンプルプログラム
以下のコードを「main_test.go」として保存し、動作を確認してみてください。
package main
import (
“testing”
)
func TestCalculator(t testing.T) {
// t.Runを使ってサブテストを定義
t.Run(“Addition”, func(t testing.T) {
t.Log(“足し算のテストを実行中…”)
})
t.Run(“Subtraction”, func(t testing.T) {
t.Log(“引き算のテストを実行中…”)
})
}
このサブテストを実行するには、ターミナルで以下のコマンドを入力します。
// Subtractionのサブテストのみを実行するコマンド
go test -v -run TestCalculator/Subtraction
このように実行すると、Additionのテストはスキップされ、Subtractionだけが高速に実行されます。
応用・注意点
この機能を使う際のポイントは「命名の一貫性」です。サブテストの名前を分かりやすく付けておくと、コマンドラインからの指定が格段に楽になります。
また、注意点として、サブテストを指定して実行する場合、そのサブテストが依存している「setup処理(親テストの開始部分)」が正しく動作することを確認してください。もし親テスト側で重い初期化処理を行っている場合、サブテスト単体でもその初期化が走るため、そこがボトルネックになることがあります。
現場では、あまりに巨大なテストになりそうな場合は「テーブル駆動テスト」を活用しつつ、今回のコマンドを組み合わせて、効率的にデバッグを行うのがGoエンジニアの定石です。

コメント