1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Go言語入門】Goでテーブル駆動テストを実装する

Last updated at Posted at 2023-03-04

この記事では、Goでテーブル駆動テストを実装する方法について解説します。

1. テーブル駆動テストとは?

テーブル駆動テストとは、テストケースを表形式で表現し、テスト関数内でそのテーブルを反復処理してテストを行う方法です。
テーブル駆動テストを使用することで、以下のメリットがあります。

  • テストの再利用性が高くなる。
  • テストケースを効率的に記述できる。
  • 入力に対し、出力に何を期待するかが簡単に理解できる。

2. テーブルとは?

テーブル駆動テストにおけるテーブルとは、テストデータを表形式で表現するための構造体のことです。

通常、以下のような形式で定義されます。

type Test struct {
	name     string // テスト名
	input    int    // 入力値
	expected int    // 期待値
}

この構造体を用いることで、テストケースを簡単記述することができます。

[]Test{
	{"test case 1", 1, 2},
	{"test case 2", 3, 4},
	{"test case 3", 5, 6},
}

3. テーブル駆動テストの実装方法

テーブル駆動テストの実装方法は以下の通りです。

  1. テスト関数を作成する。
  2. テスト関数内で、テストケースを表す構造体を定義する。
  3. テストケースを配列として定義し、それぞれのテストケースをテーブルとして扱う。
  4. テーブルを反復処理して、テストを実行する。

例として、足し算を行う関数のテストを書いてみましょう。

sum.go
package sum

func Sum(a, b int) int {
	return a + b
}

まず、テスト構造体を作成します。

type Test struct {
	name     string // テスト名
	input1   int    // 引数1
	input2   int    // 引数2
	expected int    // 期待値
}

次に、テスト関数を作成します。

func TestSum(t *testing.T) {
	tests := []Test{
		{"test1", 1, 2, 3},
		{"test2", 0, 0, 0},
		{"test3", -1, 2, 1},
	}
	for _, test := range tests {
		result := Sum(test.input1, test.input2)
		if result != test.expected {
			t.Errorf("got %d, want %d", result, test.expected)
		}
	}
}

このテスト関数は、テストケースを反復処理して、実際の結果が期待値と一致しているかどうかを確認しています。
もし期待値と結果が異なる場合には、t.Errorfを用いてエラーを報告します。

テストに失敗した場合はどうなる?
t.Errorfはアサーションではありません。
そのため、エラーがログに記録された後でも、テストは続行されます。

最後に、すべてのコードを組み合わせて、実際にテストを実行する方法を紹介します。

sum_test.go
package sum

import "testing"

type Test struct {
	name     string
	input1   int
	input2   int
	expected int
}

func TestSum(t *testing.T) {
	tests := []Test{
		{"test1", 1, 2, 3},
		{"test2", 0, 0, 0},
		{"test3", -1, 1, 0},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			result := Sum(test.input1, test.input2)
			if result != test.expected {
				t.Errorf("got %d, want %d", result, test.expected)
			}
		})
	}
}

Go言語におけるテストの基本
テストファイル名は *_test.goとし、テスト関数は Test から始まる関数名を使用します。
テストは標準パッケージのtestingパッケージを使用して実装します。
テスト関数は、t *testing.T型の引数を受け取ります。

以下のコマンドを実行すると、テストが行われます。

$ go test
PASS
ok      /path/to/package    0.042s

すべてのテストが通ると PASS と表示されます。
少なくとも1つのテストが失敗した場合には、FAIL と表示されます。

テストの詳細を見るには?
より詳細なテスト結果を確認したい場合は、 -v オプションを付けて実行することができます。
go test -v コマンドを実行することで、テストの詳細なログが表示されます。

まとめ

最後にもう一度テーブル駆動テストを利用するメリットをあげます。

  • テストの再利用性が高くなる。
  • テストケースを効率的に記述できる。
  • 入力に対し、出力に何を期待するかが簡単に理解できる。

この記事を通して、テーブル駆動テストを実装する方法が少しでも伝われば幸いです。
他にもMapを使用した実装やテストを並行に実行するといったこともできるので、興味がある方はぜひ調べてみてください!

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?