Go言語のテストの基本!testingパッケージを使った単体テスト入門
生徒
「先生、Go言語で作ったプログラムの動きが正しいかどうかを確認する方法ってありますか?」
先生
「はい、Go言語にはtestingというパッケージがあって、単体テストと呼ばれる方法で関数や処理が正しく動くかを確認できます。」
生徒
「単体テストって、どんなことをするんですか?」
先生
「簡単に言えば、プログラムの小さな部分を実際に動かして、期待通りの結果が返ってくるかをチェックする作業です。」
生徒
「なるほど。具体的にはどう書けばいいですか?」
先生
「では、まず基本的なテストの書き方から見ていきましょう。」
1. testingパッケージとは?
Go言語のtestingパッケージは、プログラムの関数や処理が正しく動くかを確認するための標準的なツールです。パッケージとは、機能やコードをまとめたまとまりで、ライブラリのようなものです。testingを使うと、自動でテストを実行でき、手作業で確認する手間が省けます。
2. 単体テストの基本構造
単体テストは、テストしたい関数ごとにテスト関数を作ります。テスト関数の名前はTestで始め、引数にt *testing.Tを受け取る形にします。tを使って、テストの結果を報告します。
package main
import "testing"
func Add(a, b int) int {
return a + b
}
func TestAdd(t *testing.T) {
result := Add(2, 3)
if result != 5 {
t.Errorf("Add(2,3) = %d; want 5", result)
}
}
この例では、Add関数が正しく2+3を計算できるかをチェックしています。期待する結果は5なので、それと違った場合にエラーとして報告されます。
3. t.Errorfの意味と使い方
t.Errorfは、テストが失敗した場合にエラーメッセージを出力するためのメソッドです。t.Failやt.Fatalと違い、テストを途中で止めずに複数のチェックを続けることができます。これにより、一度のテストで複数の確認を行うことが可能です。
4. 複数のケースをまとめてテストする
同じ関数に対して、異なる入力値をテストしたい場合は、テーブル駆動テストという方法を使います。テーブル駆動テストでは、テストケースを配列にまとめてループで回すことで効率的にチェックできます。
func TestAddTable(t *testing.T) {
tests := []struct {
a, b int
want int
}{
{1, 1, 2},
{2, 3, 5},
{10, 5, 15},
}
for _, tt := range tests {
result := Add(tt.a, tt.b)
if result != tt.want {
t.Errorf("Add(%d,%d) = %d; want %d", tt.a, tt.b, result, tt.want)
}
}
}
この方法で、一つ一つ手で書かなくても複数のパターンをテストできます。
5. テストの実行方法
Go言語のテストは、コマンドラインでgo testを使って実行します。テストファイルはxxx_test.goという名前にする必要があります。例えば、上記のAdd関数のテストが書かれたadd_test.goを用意し、ターミナルで次のコマンドを実行します。
go test
テストが全て成功すれば「ok」と表示され、失敗した場合はエラー内容が出力されます。これにより、プログラムが正しく動くかをすぐに確認できます。
6. 初心者向けのテストのコツ
テスト初心者は、まず関数ごとに簡単な入力値と期待値を決めてチェックすることから始めると良いです。また、テストコードも読みやすく書くことが大切です。エラー時のメッセージは、どの入力で失敗したかがわかるように書くと、原因の特定が容易になります。
Go言語の単体テストはシンプルで、テストの作成と実行が非常に簡単です。testingパッケージを使いこなすことで、プログラムの品質を高めることができます。