基于这篇文章, 这是我所做的: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)"
go test -c -cover解决方案有一些缺点,例如在生成代码覆盖率配置文件时必须停止被测服务。并且它还会向覆盖的二进制文件中注入一些不必要的标志,例如“-test.v”,这可能会破坏服务的原始启动方式。我们使用goc代替,它帮助我们在运行时轻松收集系统测试(API 测试或 e2e 测试)的代码覆盖率,我认为它更优雅。