登录
首页 >  Golang >  Go问答

生成Go代码覆盖率文件失败

来源:stackoverflow

时间:2024-03-25 15:15:39 240浏览 收藏

在执行系统测试时,用户在运行 Go 测试二进制文件后无法生成代码覆盖率文件。测试二进制文件在执行主函数测试任务后,由于其他测试任务被 I/O 事件阻塞,导致主协程无法等待所有任务完成,从而无法生成覆盖文件。

问题内容

我尝试在本文中运行系统测试: 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

因为程序会监听并等待客户端的请求,所以除非我退出manunal,否则它不会退出,这意味着不会生成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. 杀死进程强制退出程序

有什么问题吗?

如何生成覆盖率文件?


解决方案


我找到了无法生成封面配置文件的原因..

主协程由测试二进制文件启动,它将等待所有测试任务完成,最后生成覆盖文件。 main函数测试是任务之一,因此如果main函数执行os.Exit(0),则不会生成覆盖文件。 在我的测试程序中,当主功能测试任务结束后,还有一些其他测试任务需要执行,其中一个被I/O事件阻塞而没有超时,因此与主功能测试任务无关。

以上就是《生成Go代码覆盖率文件失败》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>