如何使用自定义文件夹中的go test为多个包生成coverage?

时间:2018-03-26 10:33:13

标签: go

我们有以下项目结构:

├── Makefile
├── ...
├── src
│   ├── app
│   │   ├── main.go
│   │   ├── models
│   │       ├── ...
│   │       └── dao.go
│   │   ├── ...
│   │   └── controllers
│   │       ├── ...
│   │       └── pingController.go
│   └── test
│       ├── all_test.go
│       ├── ...
│       └── controllers_test.go
└── vendor
    └── src
        ├── github.com
        ├── golang.org
        └── gopkg.in

我想通过src / test中的测试来测量src / app中包的覆盖率。目前通过运行自定义脚本生成覆盖率配置文件,该脚本为应用程序中的每个包运行覆盖,然后将所有覆盖配置文件合并到一个文最近我听说在go1.10中我们可以为多个包生成覆盖范围。

所以我尝试用oneliner替换该脚本,并尝试运行

GOPATH=${PROJECT_DIR}:${PROJECT_DIR}/vendor go test -covermode count -coverprofile cover.out -coverpkg all ./src/test/...

它给了我“ok测试0.475s覆盖率:0.0%的所有陈述”

当我这样做时

cd src/test/
GOPATH=${PROJECT_DIR}:${PROJECT_DIR}/vendor go test -covermode count -coverprofile cover.out -coverpkg all

日志显示规格已经运行且测试成功,但我仍然有“覆盖率:所有语句的0.0%”和空封面。

在测试中通过测试正确计算应用程序中软件包的覆盖范围,我错过了什么?

2 个答案:

答案 0 :(得分:0)

您无法使用go test的当前状态,但始终可以使用第三方脚本。

https://github.com/grosser/go-testcov

答案 1 :(得分:0)

简短回答:

go test -race -coverprofile=coverage.txt -covermode=atomic ./...  # Run all the tests with the race detector enabled
go test -bench=. -benchmem ./... # Run all the benchmark for 3s and print memory information

为了为Go代码创建测试,您必须创建一个与代码名称相同的文件(在根代码的同一文件夹中),并在名称后附加“ _test”。包装也必须相同。

因此,如果我有一个名为strings.go的GO代码,则必须将相对测试套件命名为:strings_test.go

此后,您必须创建一个输入t *testing.T的方法 结构,方法的名称必须以TestBenchmark单词开头。

因此,如果strings.go包含一个名为“ IsUpper”的方法,则相关的测试用例就是一个名为TestIsUpper(t *testing.T)的方法。
如果您需要基准测试,则需要用Test替换Benchmark字,因此方法的名称将为BenchmarkIsUpper,并且该方法接受输入的结构为{ {1}}。

您可以查看以下链接,以查看在GO中执行测试所需的树形结构:https://github.com/alessiosavi/GoGPUtils

您可以在其中找到Benchmark和TestCase。

这是一个树形结构的例子

b *testing.B