为了账号安全,请及时绑定邮箱和手机立即绑定

golang 生成功能测试的代码覆盖率

golang 生成功能测试的代码覆盖率

Go
DIEA 2021-12-07 10:47:43
我有一个 go webservices(一个 REST Api),我们有单元测试,并且 go cover 工作正常。现在我们有一个用 python 编写的测试套件,它启动一个服务器实例,运行测试,停止服务器。我想知道是否有一些工具允许我使用特定标志运行我的服务器二进制文件,以便最后打印我的“黑盒”测试执行的测试的覆盖范围?
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

基于这篇文章, 这是我所做的:


main_test.go使用此内容创建了一个:


package main


// code based on technique explained here:

// https://www.elastic.co/blog/code-coverage-for-your-golang-system-tests

// you can look there if you want to see how not to execute this test

// when running unit test etc.


// This file is mandatory as otherwise the packetbeat.test binary is not generated correctly.


import (

    "testing"

)


// Test started when the test binary is started. Only calls main.

func TestSystem(t *testing.T) {

    main()

}

因为它是一个 Web 服务(因此处于无限循环中),所以我需要一种在 SIGTERM 上优雅退出的方法(而不会将其视为失败),所以我使用了该包go get gopkg.in/tylerb/graceful.v1并替换了(我使用go-restful) main.go 中的行


    -       log.Fatal(http.ListenAndServe(":"+port, nil))

    +       graceful.Run(":"+port, 10*time.Second, nil)

然后我会像这样运行测试


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

./foo.test -test.coverprofile coverage.cov & echo $! > /tmp/test.pid

运行我的测试套件

kill "$(cat /tmp/test.pid)"


查看完整回答
反对 回复 2021-12-07
?
繁花如伊

TA贡献2012条经验 获得超12个赞

你可能不想这样做。运行具有覆盖率、竞争检测和/或其他工具的代码会增加二进制文件的大小并使其变慢。在我的计算机上运行竞争检测器和代码覆盖率要慢 25 倍。

go test -cover -race用于测试和go build部署时。这将为您提供您想要的输出,尽管不是您想要的方式。


查看完整回答
反对 回复 2021-12-07
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

go test -c -cover解决方案有一些缺点,例如在生成代码覆盖率配置文件时必须停止被测服务。并且它还会向覆盖的二进制文件中注入一些不必要的标志,例如“-test.v”,这可能会破坏服务的原始启动方式。

我们使用goc代替,它帮助我们在运行时轻松收集系统测试(API 测试或 e2e 测试)的代码覆盖率,我认为它更优雅。


查看完整回答
反对 回复 2021-12-07
  • 3 回答
  • 0 关注
  • 332 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信