go test -v -cover 执行单元测试并计算覆盖率

go test 工具可以用来测试 单元测试的代码覆盖率,示例如下:

$ go test -v -cover
=== RUN   TestSum
--- PASS: TestSum (0.00s)
=== RUN   TestAbs
--- PASS: TestAbs (0.00s)
PASS
coverage: 85.7% of statements
ok  	gotest	0.005s

从覆盖率来看(coverage: 85.7% of statements),测试用例没有覆盖全部的代码,只有 85.7% ,可以通过如下命令将 cover 的详细信息保存到 cover.out 中。

$ go test -cover -coverprofile=cover.out -covermode=count

-cover 允许代码分析 -covermode 代码分析模式(set:是否执行;count:执行次数;atomic:次数,并发执行) -coverprofile 输出结果文件

然后再通过

$ go tool cover -func=cover.out

查看每个方法的覆盖率。

$ go tool cover -func=cover.out
gotest/compute.go:5:	Sum		100.0%
gotest/compute.go:13:	Abs		66.7%
total:					(statements)	85.7%

这里发现是 Abs 方法没有覆盖完全,因为我们的用例只用到了正数的那个分支。

还可以使用 html 的方式查看具体的覆盖情况。

$ go tool cover -html=cover.out

会默认打开浏览器,将覆盖情况显示到页面中:

go-test-cover

可以看出 Abs 方法的负数分支没有覆盖到。将 TestAbs 方法修改如下即可:

func TestAbs(t *testing.T) {
    if Abs(5) != 5 {
        t.Fatal("abs error, except:5, result:", Abs(5))
    }
    if Abs(-4) != 4 {
        t.Fatal("abs error, except:4, result:", Abs(-4))
    }
}

再次运行:

$ go test -cover -coverprofile=cover2.out -covermode=count
$ go tool cover -func=cover2.out

运行结果如下:

$ go test -cover -coverprofile=cover2.out -covermode=count
PASS
coverage: 100.0% of statements
ok  	gotest	0.006s
$go tool cover -func=cover2.out
gotest/compute.go:5:	Sum		100.0%
gotest/compute.go:13:	Abs		100.0%
total:					(statements)	100.0%

这个说明已经达到了 100% 的覆盖率了。

命令汇总:

$ go test -v -cover
$ go test -cover -coverprofile=cover.out -covermode=count
$ go tool cover -func=cover.out