Goのテストをマスターする
Ethan Miller
Product Engineer · Leapcell

テストファイルの構成
Goでは、テストファイルは通常、テスト対象のソースファイルと同じパッケージに配置され、次の命名規則に従います。
- ソースファイル: xxx.go
- テストファイル: xxx_test.go
テストファイル名は、Goツールチェーンがテストファイルとして認識し、扱うことができるように、_test.go
で終わる必要があります。
テスト関数のシグネチャ
テスト関数は、次のシグネチャを持つ必要があります。
func TestXxx(t *testing.T) { ... }
- 関数名は
Test
で始まり、その後にテスト対象の関数または機能の名前が続きます(通常は大文字で始まります)。 - テストの失敗を報告し、情報をログに記録するために使用される単一のパラメータ
*testing.T
を取ります。
テスト関数の作成
基本的な例
math.go
ファイルに簡単な加算関数Add
があるとします。
// math.go package mathutil func Add(a, b int) int { return a + b }
対応するテストファイルmath_test.go
は、次のように記述できます。
// math_test.go package mathutil import ( "testing" ) func TestAdd(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, } for _, tt := range tests { result := Add(tt.a, tt.b) if result != tt.expected { t.Errorf("Add(%d, %d) = %d; expected %d", tt.a, tt.b, result, tt.expected) } } }
サブテストの使用
Go 1.7ではサブテストが導入され、同じテスト関数内で複数の関連テストをより便利に実行できるようになりました。
func TestAdd(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, } for _, tt := range tests { t.Run(fmt.Sprintf("%d+%d", tt.a, tt.b), func(t *testing.T) { result := Add(tt.a, tt.b) if result != tt.expected { t.Errorf("Add(%d, %d) = %d; expected %d", tt.a, tt.b, result, tt.expected) } }) } }
テーブル駆動テストの使用
テーブル駆動テストは、関数の動作をテストするために入力と期待される出力のセットが定義される一般的なパターンです。
func TestMultiply(t *testing.T) { tests := []struct { a, b, expected int }{ {2, 3, 6}, {0, 5, 0}, {-2, 4, -8}, } for _, tt := range tests { t.Run(fmt.Sprintf("%d*%d", tt.a, tt.b), func(t *testing.T) { result := Multiply(tt.a, tt.b) if result != tt.expected { t.Errorf("Multiply(%d, %d) = %d; expected %d", tt.a, tt.b, result, tt.expected) } }) } }
テストの実行
go test
コマンドの使用
テストファイルを含むパッケージディレクトリで、次のコマンドを実行してすべてのテストを実行します。
go test
特定のテストの実行
特定のテスト関数を実行するには、正規表現をサポートする-run
パラメータを使用できます。
go test -run TestAdd
詳細な出力の表示
-v
フラグを使用して、各テスト関数の詳細な出力を表示します。
go test -v
テストを並行して実行する
t.Parallel()
を使用してテスト関数を同時に実行し、テスト効率を向上させます。
func TestSomething(t *testing.T) { t.Parallel() // test code }
テストを実行するときは、-parallel
を使用して並行して実行するテストの数を指定できます。
go test -parallel 4
テストカバレッジ
go test -cover
を使用して、テストカバレッジを確認します。
カバレッジファイルを生成します。
go test -coverprofile=coverage.out go tool cover -html=coverage.out
go test -cover
を使用して、テストカバレッジを確認します。
カバレッジファイルを生成します。
go test -coverprofile=coverage.out go tool cover -html=coverage.out
例:完全なテストワークフロー
テストカバレッジを作成、実行、および確認する方法を示す包括的な例を次に示します。
ソースコード
// mathutil/math.go package mathutil func Add(a, b int) int { return a + b } func Multiply(a, b int) int { return a * b }
テストコード
// mathutil/math_test.go package mathutil import ( "testing" ) func TestAdd(t *testing.T) { tests := []struct { a, b, expected int }{ {1, 2, 3}, {0, 0, 0}, {-1, 1, 0}, } for _, tt := range tests { t.Run(fmt.Sprintf("%d+%d", tt.a, tt.b), func(t *testing.T) { result := Add(tt.a, tt.b) if result != tt.expected { t.Errorf("Add(%d, %d) = %d; expected %d", tt.a, tt.b, result, tt.expected) } }) } }
テストとカバレッジの実行
go test -v -coverprofile=coverage.out go tool cover -html=coverage.out
Goは強力で簡潔なテストツールを提供し、テストの作成と保守を非常に便利にします。テストファイルを適切に整理し、テスト可能なコードを作成し、テストカバレッジを定期的にチェックすることで、開発者はコードの品質と信頼性を確保できます。継続的インテグレーションと組み合わせることで、自動テストはプロジェクトの安定性を確保するための重要な手段になります。
Leapcellは、Goプロジェクトをホストするための最良の選択肢です。
Leapcellは、Webホスティング、非同期タスク、およびRedis向けの次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ料金が発生します — リクエストも料金もかかりません。
比類のない費用対効果
- アイドル料金なしの従量課金制。
- 例:25ドルで、平均応答時間60msで694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI / CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムメトリックとロギング。
簡単なスケーラビリティと高性能
- 高い並行性を容易に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中するだけです。
ドキュメントで詳細をご覧ください。
Xでフォローしてください:@LeapcellHQ