#19 Goで学ぶテスト(単体テスト)の基本
Goはシンプルな文法が魅力ですが、書いたコードが正しく動くかどうかは別問題です。この記事では、Goで書いたコードを自動でチェックする「テスト」の基本を解説します。
なぜテストを書くのか
コードを修正するたびに、関連する機能が壊れていないかを手作業で確認するのは大変です。テストを用意しておけば、コマンド一つで動作確認ができ、安心してコードを直せるようになります。
Go標準のテスト機能
Goには追加のライブラリを入れなくても使えるtestingパッケージが標準で備わっています。テスト対象のファイルと同じディレクトリに、名前の末尾が_test.goのファイルを作ります。
// add.go
package main
func add(a int, b int) int {
return a + b
}
// add_test.go
package main
import "testing"
func TestAdd(t *testing.T) {
result := add(2, 3)
if result != 5 {
t.Errorf("add(2, 3) = %d; want 5", result)
}
}
テスト関数の名前はTestから始める決まりです。ターミナルでgo testと実行すると、_test.go内のTestから始まる関数がすべて自動で実行されます。
複数パターンをまとめてテストする
Goでは、複数の入力パターンをスライス(配列のようなもの)にまとめて、まとめてテストする書き方(テーブル駆動テスト)がよく使われます。
func TestAddCases(t *testing.T) {
cases := []struct{ a, b, want int }{
{2, 3, 5},
{0, 0, 0},
{-1, 1, 0},
}
for _, c := range cases {
if got := add(c.a, c.b); got != c.want {
t.Errorf("add(%d, %d) = %d; want %d", c.a, c.b, got, c.want)
}
}
}
Goならではの注意点
Goのテストはエラーメッセージを自分で書く必要があり(t.Errorfの中身)、他の言語のassert系の関数のように自動でメッセージが出ないことが多いです。「どの値が」「何を期待していたか」が分かるメッセージを書いておくと、後で失敗した時に原因を探しやすくなります。
まとめ
Goは標準のtestingパッケージだけで十分にテストが書けます。Testから始まる関数とt.Errorfの使い方を覚えて、テーブル駆動テストにも挑戦してみてください。
関連記事
本ページはプロモーションを含みます。
参考書籍(PR)
Goをもっと学びたい方には「Go言語入門」がおすすめです。
コメント
コメントを投稿