https://trap.jp/post/1402/#2-vscodeでgoのテスト環境を整える

この記事は夏のブログリレー2021 49日目の記事です。

目次

0. はじめに

こんにちは。20BのRasと申します。はじめましての方は過去の記事をご覧ください。

現在、traPortfolioというプロジェクトでバックエンドを担当しています。このプロジェクトでテストを書く機会があったのでGoのテストについて少し調べました。

なお今回はtesting.Tを使うようなテストについてのみ解説します。testing.Bを使うベンチマークなどの解説は行いません。

1. Goのテストについて

ここではGoのテストに触れたことがない方のために少しだけ解説します。 すでに書いたことがある方は飛ばしてもらって大丈夫です。

Goでは標準機能のみでテストを行うことができ、go test <対象ファイル名>でテストを実行することができます。

ちなみに、テストは証明のように一般的に正しいことを示すものではありません(テストの書き方を知るまではこう思っていました)。実際はいくつかの具体的なケースについてそれぞれが正しいことを示すものです。つまり、既に書かれたケースでテストが通ったとしても、対象の関数の動作を全て検証したとは限らない点に注意です。 後述: Coqといった証明プログラミングもあるようです。気になった方は調べてみてください。

例を見てみます。調べると同じようなのがたくさん出てきます。n番煎じです...

ちなみに、Goでテストを行う場合は関数名をTest~~、引数をt *testing.T、ファイル名を~~_test.goにする必要があります。

go mod init <モジュール名、何でもいいです>でgo.modを作成します。本記事でのモジュール名はtest_trapとします。

// main.go
package main

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

// main_test.go
package main

import "testing"

func TestAdd1(t *testing.T) {
	got := Add(1, 2)
    if got != 3 {
		t.Errorf("Add() = %v, want %v", got, 3)
	}
}

$ go test ./...
ok      test_trap       0.001s

1+2が3であることを示しています。 しかし、上記のコードはAdd関数の特別な場合を示しただけであり、一般的に正しいことを示してはいません。この問題を改善する方法は後述の「小噺」に書きます。

なお、Go公式ではTable Driven Testというテストの形式を推奨しています。以下のようにケースをまとめて書く形式です。