🧪

【Go】Goのテストに入門してみた! ~基本編~

に公開

はじめに

これまでGoでAPIを開発してきましたが、実はテストコードを書いた経験はありませんでした。
(テストの様子をスクショに撮って証跡として残していました)
業務でも積極的にテストコードを書いていこうという方針になりましたので、Goでのテストに入門してみようと思います。

この記事でわかること

  • Goでの基本的なテストの書き方
  • テストを書く上での押さえなければいけないポイント
  • テスト関数がどのように実行・評価されるかの基本的な流れ

テストコード書いてみた

とりあえず、テストコードを書いてみました。
今回はマルチバイトでの文字列カウントのテストにしてみました。

main_test.go
package main

import (
    "testing"
    "unicode/utf8"
)

func Length(s string) int {
    return utf8.RuneCountInString(s)
}

func TestLength(t *testing.T) {
    if got := Length("Hello"); got != 5 {
        t.Errorf("Length(\"Hello\") = %d; want 5", got)
    }
    if got := Length("こんにちは"); got != 5 {
        t.Fatalf("Length(\"こんにちは\") = %d; want 5", got)
    }
}

実行してみると、以下のような結果が得られます。

ターミナル
# go test
PASS
ok      go-test-practice        0.352s

Goのテストで押さえなければいけない3つのポイント

1. ファイル名を_test.goにする

go testは、_test.goというサフィックスが付いたファイルのみをテストファイルとして認識します。
そのため、テストコードを書く場合は必ずこの命名規則に従いましょう。
なお、ビルド時にはテストファイルは含まれません。

2. 関数名をTestからはじめる

必ず大文字のTからはじめるようにしてください。
テスト関数のシグネチャは以下のように書きます。

go
func TestXxx(t *testing.T) {
    // テスト内容
}

(Testという文字列の直後も大文字ではじめる)
関数の引数にはt *testing.Tを渡し、返り値は指定しません。
(Goのテストではtestingパッケージを使うことがほとんどです)

3. テストの失敗を明確にする

テストが失敗した場合は、testing.T 型のメソッドを使って、失敗を記録・制御します。

  • t.Errorまたはt.Errorf: 失敗を記録し、テストを続行
  • t.Fatalまたはt.Fatalf: 失敗を記録し、テストを終了

まとめ

今回は、Goでのテストコードの基本について解説しました。
Goでは、簡潔にテストを書くことができ、標準のgo testを使ってすぐに実行できます。
次回は、より実践的なTable Driven Test(テーブル駆動テスト)について紹介します。

参考

https://pkg.go.dev/testing
https://future-architect.github.io/articles/20250509a/#テストがしたい
https://zenn.dev/kenghaya/articles/1f6935419e0f21

Discussion