【发布时间】:2018-12-30 18:05:55
【问题描述】:
我尝试在本文中运行 sytemTest: https://www.elastic.co/blog/code-coverage-for-your-golang-system-tests
所以请遵循提示 首先,我创建一个名为 main_test.go 的系统测试文件,如下所示:
func TestSystem(t *testing.T) {
t.Logf("systemtest mod=%v", *SystemTest)
if *SystemTest {
t.Log("runing system test....")
main()
}
}
当这个单元测试被执行时,整个主函数都会被执行
然后我构建一个测试二进制文件:
go test -c -covermode=count -coverpkg ./... -o main.test
并在我的测试环境中执行测试二进制文件
./main.test -systemTest -test.coverprofile ./coverage.cov
因为程序会监听并等待客户的请求,所以除非我手动退出,否则它不会退出,这意味着不会生成coverprofile
所以我启动了一个计时器以在 15 秒后停止程序... 但是当程序退出时,仍然没有生成coverprofile
如果test不调用main,则coverprofile可以正常生成
查看主函数
var mkrtExitWait sync.WaitGroup
var mkrtExitCode int
var mkrtRunning bool = false
func MKrtRun() int {
mkrtExitWait.Add(1)
mkrtRunning = true
mkrtExitWait.Wait()
return mkrtExitCode
}
func MKrtExit(code int) {
if !mkrtRunning {
os.Exit(code)
} else {
mkrtRunning = false
mkrtExitCode = code
mkrtExitWait.Done()
}
}
func main() {
// listen and serve code
......
if *SystemTest { // a command flag
go func(){
time.Sleep(time.Second * 10)
MKrtExit(0)
}()
}
MKrtRun()
}
我尝试了一些方法来生成覆盖率文件,但它不起作用:
发送客户端请求告诉测试服务器在程序运行时执行os.Exit(0)
发送客户端请求告诉测试服务器在程序运行时执行panic()
杀死进程强制退出程序
有什么问题?
如何生成覆盖率文件?
【问题讨论】:
-
不要运行已编译的测试二进制文件,而是让
go test -cover完成工作。 -
@Volker 我的编译环境和测试环境在两台不同的机器上,测试二进制文件是在本地机器上编译的,但是在另一个远程服务器上运行
-
为什么你会认为封面配置文件从一台机器到另一台机器不同?
-
只是导致测试程序甚至无法在编译机上运行,运行测试依赖的微服务太多,编译机无法提供
标签: go test-coverage