GoのバージョンをGo 1.21.0に上げた所、
scenarigoを利用して起動しているE2Eテストにて、
カバレッジを出力するAPIにて、下記エラーが出るようになった。
func (h *Handler) Record(gc *gin.Context) {
err := coverage.WriteCountersDir("./_coverage")
if err != nil {
panic(err)
}
}
2023/12/18 18:36:24 http: panic serving 127.0.0.1:52164: WriteCountersDir invoked for program built with -covermode=set (please use -covermode=atomic)
goroutine 3046 [running]:
net/http.(*conn).serve.func1()
原因
Go 1.21.0から、atomic mode必須に変更されている。
Go 1.20
func WriteCountersDir(dir string) error {
return emitCounterDataToDirectory(dir)
}
Go 1.21.0
func WriteCountersDir(dir string) error {
if cmode != coverage.CtrModeAtomic {
return fmt.Errorf("WriteCountersDir invoked for program built with -covermode=%s (please use -covermode=atomic)", cmode.String())
}
return emitCounterDataToDirectory(dir)
}
issues
commit
対策
E2Eがscenarigoを利用し、外部からAPIを叩く方式になっているため、
go testを利用しておらず、-covermode=atomic
を設定できないと思われたが、
実は、go runやgo buildにも上記モードが設定できた。
そのため、
scenarigoの対象としているE2E用インスタンスでのアプリ起動時に、下記のようにオプションを付ければ解決できた。
Makefile
go run -cover -covermode atomic app.go
参考