この記事は DENSO アドベントカレンダー 2021 の 18 日目の記事です。
Go で実装する際に使用している便利スクリプトを紹介します。
ファイルの編集保存の度にテストを自動実行し、色付けしたテスト結果を出力します。テストコマンド入力の煩わしさがなく、表示色で結果を判断できログを読む認知負荷が軽減します。コード編集に集中できるため、リファクタリング作業で重宝しています。
動作デモ
デモではアサーションの期待する結果を編集して保存しています。ターミナルでスクリプトを一度実行した後は、エディタ内に留まったまま随時テスト結果を確認できます。
準備
reflex (ファイル差分が生じたことを検知)と、gotest (テスト結果に色付け)をインストールします。
$ go install github.com/cespare/reflex@latest
$ go install github.com/rakyll/gotest@latest
スクリプト
シェルスクリプトと Makefile の2種類を紹介します。お好みで選んでください。
シェルスクリプト
プロジェクトのルートディレクトリにスクリプトを用意します。
#!/bin/bash
cd "$(dirname "$0")" || exit 1
if [ -z "$1" ]; then
reflex -r '\.go$' -- gotest ./... -v
else
reflex -r '\.go$' -- gotest -run "$1" ./... -v
fi
chmod +x test.sh
で実行権限をつけておきます。
処理の内容は、拡張子.go
ファイルに差分が生じたら、その都度gotest ./... -v
を実行します。特定のテスト関数のみテストするときは、引数にテスト関数名を渡すと-run
つきで実行します。
$ ./test.sh
特定のテスト関数のみテストします。
$ ./test.sh TestDoSomething
Makefile
複数のスクリプトを1つのファイルで管理できるのでおすすめです。インデントがタブであることに注意。
.PHONY: test
FUNC=
test:
ifndef FUNC
reflex -r '\.go$$' -- gotest ./... -v
else
reflex -r '\.go$$' -- gotest -run $(FUNC) ./... -v
endif
全件テストします。
$ make test
特定のテスト関数のみテストします。
$ make test FUNC=TestDoSomething
終わりに
このツールのおかげでリファクタリングが楽しくて、ついつい時間が経つのを忘れそうになります。