Golang的Test coverage配置

Test coverage是作为发现未被测试覆盖的代码的手段。

传统的代码测试覆盖方法有:函数覆盖、语句覆盖、决策覆盖和条件覆盖。函数覆盖和语句覆盖都是指函数或者语句是否执行过。而决策覆盖和条件覆盖就是指测试是否达到所有的决策分支和条件分支。

这里用到的工具是Coveralls.io,它能够很好地追逐代码的Test coverage。

首先在coveralls.io的dashboard导入github上的repo。然后安装go的相关依赖。gover将所有测试的coverprofile收集到一期(默认在工作目录下写入名叫gover.coverprofile的文件。),而goveralls则将profile发送给coverall.io。

go get github.com/modocache/gover  
go get github.com/mattn/goveralls  

modocache的gover有个bug,在多个目录下合并*.coverprofile时,遇到文件没有new line符\n时无正确合并。所以笔者自己修改源码来解决这个问题。

Ginkgo能够执行时生成相应的coverprofile(来自原生go test -cover)。所具体步骤如下,依次执行ginkgo、gover、goveralls命令。

echo -e "\n Unit Testing packages:"  
ginkgo -r -p --cover $base/action $base/api $base/softlayer

echo -e "\n Gathering cover profiles and send to coveralls.io..."  
# Need check env COVERALLS_TOKEN
gover $base $base/gover.coverprofile  
goveralls -coverprofile=gover.coverprofile -service=travis-ci -repotoken=$COVERALLS_TOKEN  

从正确执行命令的结果可以得到Job的详细链接。

coverge_push

我们可以通过这个URL访问到这次UT的Coverage。

stats

还有更具体的。下面列出的是每个文件的coverage。每个文件前面的百分数是统计整个文件内代码的coverage。+代表该文件是新加入的,向上的尖头代表的是index提升。向下的则表示相反,index下降来。

files_inspect

点击每个文件还能够看到每行代码coverage的情况。

file_inspect

通过Test coverage能够很好地发现没有测试到的代码。但是将coverage质量指标的都是没有用处的。coverage只是能够保证程序员写的每行代码的执行都有所预期。