Go でテストを書いてみる
今まで Go で色々やってきたがテストを書いてこなかったのでテストを書く方法について調べた。
開発環境
- go version go1.16.5 linux/amd64
本文
Go のテストについて誰かがまとめた情報はたくさん出てくるのだが公式サイトのどこに書いてあるか調べたところ、普通に公式チュートリアルに書いてあった。
Go ではテストフレームワークが同梱されているので特にインストール作業は必要ない。
もっとも基本的なテストとしては、単にテストしたいファイルと同じディレクトリに、テストしたいファイル名に _test をつけたファイルを作って、そこにテストを書いていけばいい。
題材として今禁則処理を考慮した文字列改行を行うプログラムを書いているので、それのテストを書くことにした。
コードの抜粋が以下のとおりである。
|
|
このコードは <プロジェクトルート>/internal/pkg/kinsoku/kinsoku.go なので、テストを書くために <プロジェクトルート>/internal/pkg/kinsoku/kinsoku_test.go というファイルを作成する。
テスト用の関数の名前は Test+テストしたい関数 となる。
よって上記の ExecKinsoku をテストする場合、TestExecKinsoku という関数を作る。
公式チュートリアルを参考に入力値と結果を構造体で定義し、ループでテストを回してみた。
|
|
※元のコードがまだ行頭禁則文字しか考慮できていないので変なところで改行される結果になっている
これをテストするには、プロジェクトルートでコマンドを打つなら
go test ./internal/pkg/kinsoku/kinsoku.go ./internal/pkg/kinsoku/kinsoku_test.go
<プロジェクトルート>/internal/pkg/kinsoku でコマンドを打つなら単に
go test
でいい。
結果は OK の場合は
PASS
ok github.com/k1350/ogpgen/internal/pkg/kinsoku 0.002s
のようになる。
入力値を変更してわざと失敗させると下記のようになる。
--- FAIL: TestExecKinsoku (0.00s)
kinsoku_test.go:29: got:
aあ
お、〕:,゠
ㇷ!.。かき
くけこ
want:
あ
お、〕:,゠
ㇷ!.。かき
くけこ
FAIL
exit status 1
FAIL github.com/k1350/ogpgen/internal/pkg/kinsoku 0.002s
この他にもベンチマーク用の関数が書けたりするが、詳しくは testing パッケージのドキュメント参照。
感想
特にフレームワークを追加で入れなくてもテストが書けるのは便利だし、(PHP と比べたら)新しい言語だなという感触だった。
テストフレームワークの特徴としてはアサーションが無いところ。
ただ個人的には元々「アサーションいるか?」と思ってたところがあるので、無いほうがいいと思う。ただ値を比較して違ったら記録したいだけなのにアサーション用の関数を覚えるほうが面倒なので……。
あとテスト対象と同じパッケージにテストコードを置くのももしかしたら特徴的かもしれない。(別に置くことも可能。)
今回はプライベート関数のテストは書いていないが、Go では元々同一パッケージ内ならファイルが違ってもプライベート関数を呼び出せるため、プライベート関数をテストするために特殊なことはしなくていいというメリットがある。
他の言語だとプライベート関数のテストが面倒くさいところがあるので、この点はいいなと思った。
以上。