NU:LOGiC Logo

【Go言語】ユニットテストの作成と運用:Go言語でのテスト駆動開発の進め方

【Go言語】ユニットテストの作成と運用:Go言語でのテスト駆動開発の進め方

Go言語で、大きな規模の開発を継続的に行うためは、コードの品質を維持し向上させるためのユニットテストが欠かせません。ユニットテストを活用することで、コードの動作を保証し、変更やリファクタリングを行う際に役立ちます。

3行で要約すると

  • Go言語のSumDigits関数は文字列内の数字を合計します。
  • テーブル駆動テストを利用して複数のテストケースを一度に確認。
  • t.Runを使用し、各テストケースに名前を付け、エラーがあればどのテストケースで問題が発生したのか特定しやすくしています。

Go言語のテストの特徴

Go言語のテストは、testing パッケージを使用して行います。このパッケージは、Go言語に標準で含まれているため、追加のインストールなどは不要です。テスト関数は、Test で始まる名前を持ち、引数として *testing.T を取ります。

func TestExample(t *testing.T) {
    // ここにテストの内容を書きます。
}

実際のユニットテストの例

ユニットテストを書く際のポイントは、関数が期待する動作を正確に捉え、その動作を検証することです。以下に、より複雑な関数とそのテストの例を示します。

関数の例:文字列内の数字を合計する

// SumDigits は文字列内の数字を合計します。
func SumDigits(s string) int {
    sum := 0
    for _, r := range s {
        if '0' <= r && r <= '9' {
            sum += int(r - '0')
        }
    }
    return sum
}

この関数は文字列を受け取り、その中の数字を全て合計して返します。

ユニットテストの例

func TestSumDigits(t *testing.T) {
    tests := []struct {
        input    string
        expected int
    }{
        {"hello123", 6},
        {"42 is the answer", 6},
        {"no numbers", 0},
        {"", 0},
    }

    for _, test := range tests {
        t.Run(test.input, func(t *testing.T) {
            result := SumDigits(test.input)
            if result != test.expected {
                t.Errorf("For %s, expected %d but got %d", test.input, test.expected, result)
            }
        })
    }
}

このテストは以下のポイントを取り入れています:

  1. 複数のテストケースを同時に走らせるためのテーブル駆動テストを使用しています。これにより、様々な入力に対する関数の動作を一度に確認できます。
  2. t.Run を使用して、各テストケースに名前をつけています。これにより、どのテストケースが失敗したのかを容易に特定することができます。
  3. テストが失敗した際のエラーメッセージで、どの入力に対して予期しない結果が得られたのかを明確にします。

このようなテストの書き方を採用することで、関数の変更や拡張を行った際に、迅速に問題を特定し、修正を行うことができます。

テストを実行する

Go言語のテストは、go test コマンドを使用して実行できます。特定のテスト関数だけを実行したい場合は、-run フラグにテスト関数の名前を指定します。

$ go test -run TestAdd

このコマンドを実行すると、テスト結果が表示されます。すべてのテストが成功すると、何も出力されずに終了します。一方、テストが失敗するとエラーメッセージとともに詳細が表示されます。

まとめ

Go言語でのユニットテストは、コードの品質を確保するための重要なツールです。testing パッケージを活用することで、簡単にテストを作成し実行することができます。コードの変更や拡張を行う際に、ユニットテストがあるとその動作を確認しやすく、安心して開発を進めることができます。ユニットテストの導入と運用を積極的に進め、品質の高いソフトウェア開発を目指しましょう。