継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

初めて Go のテーブル駆動テストを書いたので学んだことメモ✍

タダです.

先日会社のブログを書きました.この取り組みの記事で ALTER TABLE 文に ALGORITHM 句を明示しないとエラーを返す CI について書いたのですが,SQL 解析のコードと合わせてテストコードを一緒に書きました.その際にテーブル駆動テストを初めてやったので振り返りで学んだことをまとめます.

テーブル駆動テストとは

テーブル駆動テストは複数のテストケースを効率的に記述し実行するための手法です.この手法ではテストケースを構造体やスライスで定義し,それを反復処理してテストを行います.例えば,以下は数値を加算するだけの関数とそれをテストするコードです.標準パッケージで当該関数に対するテストデータを明示して,テストが実行できるためどんなケースでコードが動作するのかの確認がしやすいと感じました.

テスト対象コード

package main

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

テストコード

package main

import "testing"

func TestSum(t *testing.T) {
    testCases := map[string]struct {
        caseName string
        input1   int
        input2   int
        expected int
    }{
        "1 + 2 = 3": {caseName: "1 + 2 = 3", input1: 1, input2: 2, expected: 3},
        "0 + 0 = 0": {caseName: "0 + 0 = 0", input1: 0, input2: 0, expected: 0},
    }

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

テストコードの実行

$ go test -v
=== RUN   TestSum
=== RUN   TestSum/1_+_2_=_3
=== RUN   TestSum/0_+_0_=_0
--- PASS: TestSum (0.00s)
    --- PASS: TestSum/1_+_2_=_3 (0.00s)
    --- PASS: TestSum/0_+_0_=_0 (0.00s)
PASS
ok      xxx/xxx/xxx/sample   0.454s

まとめ

Go のテーブル駆動テストにはじめて触れたので備忘録でまとめました.初めて取り組んでみてもどんなテストケースなのか,どんな挙動になるのかがわかりやすくなるなと感じました.