go test におけるキャッシュの消し方
知っておくと便利
go test のキャッシュを消すのは簡単
$ go clean -testcache
以上です!
$ go test ./...
ok github.com/oxequa/realize (cached)
ok github.com/oxequa/realize/realize (cached)
このように (cached)
となっていたものが、、、
$ go clean -testcache
$ go test ./...
ok github.com/oxequa/realize 0.086s
ok github.com/oxequa/realize/realize 0.389s
このように、実行時間が表示されており、キャッシュが消えていることが分かりますね。
ちなみに、キャッシュを無視する方法はもうひとつあり、
以下のように -count=1
をつけてやればOKです。
$ go test ./... -count=1
ok github.com/oxequa/realize 0.076s
ok github.com/oxequa/realize/realize 0.384s
ここからは上記コマンドが一体なにをしてくれたのか、
もう少し詳細に話していきます。
go clean とは
こちら にドキュメントがあります。
Clean removes object files from package source directories.
go clean
は上記のとおりファイルを消してくれるわけですね。
-testcache
オプションをつけると、
テストに関するキャッシュファイルのみを消してくれます。
では、次にキャッシュファイルがどこにあるのか見ていきます。
キャッシュはどこに保存されている?
環境変数 GOCACHE
で指定されている場所に保存されます。
参考:公式ドキュメント
count オプションについて
最後に$ go test ./... -count=1
によって、
キャッシュを無効化できた理由についてです。
この話は公式ドキュメント
にて、
「本来意図した使い方ではないが、そういう使い方もできる」
ぐらいのニュアンスで紹介されています(以下参照)
The idiomatic way to disable test caching explicitly is to use -count=1.
そもそも、countオプションはその名前のとおり、 キャッシュ無効化のためのものではないです。
countオプションはテストを指定回数実行し、
そのベンチマークを取るためのオプションです(以下参照)
-count n
Run each test and benchmark n times (default 1). If -cpu is set, run n times for each GOMAXPROCS value. Examples are always run once.
ベンチマークを取るのにあたってキャッシュは不要であるため、
countオプションがつくとキャッシュが無効化されます。
このルールを応用して、-count=1
とすることで、
テスト自体は1回しか実行されず、かつ、キャッシュも無効化して、
テストを走らせることができるわけです。
なるほど