首页 > 解决方案 > 无法生成 go 覆盖文件

问题描述

我尝试在本文中运行 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()
    }
}

执行此单元测试时,将执行整个 main 函数

然后我建立一个测试二进制文件:

go test -c -covermode=count -coverpkg ./... -o main.test

并在我的测试环境中执行测试二进制文件

./main.test -systemTest  -test.coverprofile ./coverage.cov

因为程序会监听并等待客户的请求,所以除非我手动退出,否则它不会退出,这意味着不会生成coverprofile

所以我启动了一个计时器在 15 秒后停止程序......但是当程序退出时,封面配置文件仍然没有生成

如果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()
}

我尝试了一些方法来生成覆盖文件,但它不起作用:

  1. 发送客户端请求,告诉测试服务器在程序运行时执行 os.Exit(0)

  2. 在程序运行时发送客户端请求告诉测试服务器执行 panic()

  3. 杀死进程强制退出程序

有什么问题?

如何生成覆盖文件?

标签: gotest-coverage

解决方案


为我解决了这个问题(并在@darkwing 的回答中提到)是标志顺序。

当我放置第-test.coverprofile=coverage.cov一个时,它起作用了,并且创建了coverage.cov 文件。

注意:我必须=在标志名称和值之间添加符号。

此外,我不需要在不同的 go 例程中运行它。


推荐阅读