猿问

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

我有一个 go webservices(一个 REST Api),我们有单元测试,并且 go cover 工作正常。

现在我们有一个用 python 编写的测试套件,它启动一个服务器实例,运行测试,停止服务器。

我想知道是否有一些工具允许我使用特定标志运行我的服务器二进制文件,以便最后打印我的“黑盒”测试执行的测试的覆盖范围?


DIEA
浏览 333回答 3
3回答

千巷猫影

基于这篇文章, 这是我所做的: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)"

繁花如伊

你可能不想这样做。运行具有覆盖率、竞争检测和/或其他工具的代码会增加二进制文件的大小并使其变慢。在我的计算机上运行竞争检测器和代码覆盖率要慢 25 倍。仅go test -cover -race用于测试和go build部署时。这将为您提供您想要的输出,尽管不是您想要的方式。

叮当猫咪

go test -c -cover解决方案有一些缺点,例如在生成代码覆盖率配置文件时必须停止被测服务。并且它还会向覆盖的二进制文件中注入一些不必要的标志,例如“-test.v”,这可能会破坏服务的原始启动方式。我们使用goc代替,它帮助我们在运行时轻松收集系统测试(API 测试或 e2e 测试)的代码覆盖率,我认为它更优雅。
随时随地看视频慕课网APP

相关分类

Go
我要回答