Open11
go testのキャッシュ関連の内部実装を見る
テストコマンド
テストの実行
tryCacheWithIDでキャッシュを適用するかを判断している
この関数の返り値がtrueならキャッシュが適用される
キャッシュの無効化条件
フラグチェック
キャッシュの取得処理
実行時間を(cached)
に書き換えてtrueを返す
test inputs IDを計算する処理
[寄り道]
switchのdefaultが最初に書かれているの初めて見た
早期リターン的な書き方ってことなんだな
switch op {
default:
if cache.DebugTest {
fmt.Fprintf(os.Stderr, "testcache: %s: input list malformed (%q)\n", a.Package.ImportPath, line)
}
return cache.ActionID{}, errBadTestInputs
case "getenv":
fmt.Fprintf(h, "env %s %x\n", name, hashGetenv(name))
オペレーションごとのハッシュ値を計算、ファイルの場合はメタデータをハッシュ化する
これが変更されている場合はキャッシュが使われないようになる
Act
関数はパッケージごとに呼ばれる
// runTest関数内(一部抜粋)
for _, p := range pkgs { // pkgs はテスト対象のパッケージのリスト
// ...
buildTest, runTest, printTest, perr, err := builderTest(b, ctx, pkgOpts, p, allImports[p], writeCoverMetaAct)
// ...
runs = append(runs, runTest) // runTest は runTestActor を Actor とするアクション
// ...
}
// ...
b.Do(ctx, root) // runTestActor の Act メソッドがこの中で実行される