TAKEO

TAKEO

Go 単体テスト - 入門 -

Goにおける単体テストに入門しましょう。

今回はフィボナッチ数列の項を返す関数をテストの対象とします。

fibonacci.go
Copied!!
package fibonacci

func Fibonacci() func() int {
	a := 0
	b := 1
	return func() int {
		ret := a + b
		a = b
		b = ret
		return ret
	}
}

ディレクトリ構成は下記の通りです。Goでは慣習的にテスト対象の実装のファイル名_test.goに単体テストを書きます。

Copied!!
$ tree
├── go.mod
├── go.sum
└── pkg
    └── fibonacci
        ├── fibonacci.go
        └── fibonacci_test.go

テスト

今回はテストに以下2つのパッケージを使用しています

  • testing
    • Goにデフォルトで入っているパッケージです。
    • Testで始まる関数を全てテスト対象として扱います。
  • stretchr/testify/assert
    • 外部パッケージです。
    • 実値と期待値が一致しているかなどをチェックしてくれるツールです。期待通りでないときにテストを失敗に導いてくれます。
fibonacci_test.go
Copied!!
package fibonacci

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestFibonacci(t *testing.T) {
	f := Fibonacci()
	expect := []int{1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946}
	for i := 0; i < 20; i++ {
		actual := f()
		assert.Equal(t, expect[i], actual)
	}
}

テストの実行方法

  • カレントディレクトリ以下の全てのテストを対象にします

    Copied!!
    $ go test ./...
    ok  	go-learning/pkg/fibonacci	(cached)
    
  • 詳細な結果を見たい時はVerboseオプションを使います

    Copied!!
    $ go test -v ./...
    === RUN   TestFibonacci
    --- PASS: TestFibonacci (0.00s)
    PASS
    ok  	go-learning/pkg/fibonacci	(cached)
    
  • 特定の関数を対象にする時は次のように実行します

    Copied!!
    $ go test ./... -run TestFibonacci
    ok  	go-learning/pkg/fibonacci	0.003s