#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言語入門」がおすすめです。

コメント

このブログの人気の投稿

#11 Rustで学ぶエラーハンドリングの基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本