有赞团队之GO项目的单测、集成、增量覆盖率统计与分析(一)

发表于:2021-9-03 09:50  作者:赵海强   来源:有赞技术

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: 软件测试技术 单元测试

  一、引言
  我是一名中间件 QA,我对应的研发团队是有赞 PaaS,目前我们团队有很多产品是使用 go 语言开发,因此我对 go 语言项目的单测覆盖率、集成以及增量测试覆盖率统计与分析做了探索。

  二、单测覆盖率以及静态代码分析
  2.1 单测覆盖率分析
  Go 语言自身提供了单元测试工具 go test,单元测试文件必须以 *_test.go 形式存在,go test 工具同时也提供了分析单测覆盖率的功能。因为需要将单测覆盖率上传到 sonar 平台展示,所以必须将覆盖率文件转换成能被 sonar 识别的格式,因此,还需要另外一个命令行工具 gocov。
  首先我们使用 go test 生成覆盖率输出文件 cover.out,并通过 gocov 工具来将生成的覆盖率文件 cover.out 转换成可以被 sonar 识别的 Cobertura 格式的 xml 文件。 如下所示:
go test -v ./... -coverprofile=cover.out #生成覆盖率输出  
gocov convert cover.out | gocov-xml > coverage.xml #将覆盖率输出转换成xml格式的报告

  将生成的单测覆盖率报告发送到 sonar 平台上来展示。

  2.2 静态代码分析
  Go 静态代码分析工具有两个,分别是 gometalinter 和 golangci-lint,我们现在使用的是 golangci-lint,因为 gometalinter 已经停止维护,而且作者也推荐去使用 golangci-lint。

  2.2.1 golangci-lint 的安装
  以下是安装 golangci-lint 推荐的两种方法:
  将二进制文件安装在 (go env GOPATH)/bin/golangci-lint 目录下:
curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin vX.Y.Z

  或者将二进制文件安装在 ./bin/ 目录下:
curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s vX.Y.Z

  安装完成之后可以通过使用golangci-lint --version来查看它的版本。

  2.2.2 golangci-lint 的使用
  在需要进行静态代码扫描的目录下执行 golangci-lint run,此命令和 golangci-lint run ./… 命令等效,表示扫描整个项目文件代码,并进行监测,也可以通过指定 go 文件或者文件目录名来对特定的代码文件或者目录进行代码扫描,例如 golangci-lint run dir1 dir2/... dir3/file1.go。
  ps:扫描指定目录的时候是不支持递归扫描的,如果要进行递归扫描需要在目录路径后面追加/…
  默认情况下 golangci-lint 只启用以下的 linters:

  Enabled by default linters:
  deadcode: 发现没有使用的代码
  errcheck: 用于检查 go 程序中有 error 返回的函数,却没有做判断检查
  gosimple: 检测代码是否可以简化
  govet (vet, vetshadow): 检查 go 源代码并报告可疑结构,例如 Printf 调用,其参数与格式字符串不一致
  ineffassign: 检测是否有未使用的代码、变量、常量、类型、结构体、函数、函数参数等
  staticcheck: 提供了巨多的静态检查,检查 bug,分析性能等
  structcheck:发现未使用的结构体字段
  typecheck: 对 go 代码进行解析和类型检查
  unused: 检查未使用的常量,变量,函数和类型
  varcheck: 查找未使用的全局变量和常量

  Disabled by default linters:
  bodyclose: 对 HTTP 响应是否 close 成功检测
  dupl: 代码克隆监测工具
  gochecknoglobals: 检查 go 代码中是否存在全局变量
  goimports: 做所有 gofmt 做的事. 此外还检查未使用的导入
  golint: 打印出 go 代码的格式错误
  gofmt: 检测代码是否都已经格式化, 默认情况下使用 -s 来检查代码是否简化
  …………………………..
  未启用的还有很多工具,可以通过使用 golangci-lint help linters 命令查看还有哪些工具可以使用,如果想要启用没有默认开启的工具,可以在执行命令时使用 -E 参数来启用,比如要启用 golint 的话,只需要执行一下命令 golangci-lint run -E=golint。除了用 -E 来启动参数外,还可以指定最长执行时间 —deadline、跳过要扫描的目录 --skip-dirs 等等。如果要了解更多,请使用 golangci-lint run -h 来查看。
  特别注意 —-exclude-use-default 参数,golangci-lint 对于上面默认的启用 linters 中做了一些过滤措施,比如对于 errcheck ,它不会扫描 ((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv) 这些函数返回的 error 是否被 checked,所以如果代码中使用到这些函数,并且没有接收 error 的话是不会被扫描到的。类似的还有golint、govet、staticcheck、gosec 需要注意。如果想要不过滤这些就需要使用 --exclude-use-default=false 来启用。

  2.3 接入sonar
  go 接入 sonar 需要 sonar-scanner 工具以及 sonar-project.properties 文件。

  2.3.1 sonar-scanner
  sonar-scanner 是 sonar 官方提供的代码扫描器,下载地址是 https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner。下载好之后解压,解压后的目录下有四个文件夹,分别是 bin、conf、jre、lib,然后将 bin 文件夹路径添加到 $PATH 环境变量下,使用 sonar-scanner -v 来查看版本。

  2.3.2 sonar-project.properties
  sonar-project.properties 文件的作用主要是配置 sonar 扫描器扫描哪些类型的文件以及文件目录,最后将报表结果上报到 sonar 服务器,sonar-project.propertie 内容如下:
#sonar安装的服务器地址
sonar.host.url=http://ip:port  
#服务器账号
sonar.login=root  
#服务器密码
sonar.password=root  
#项目使用的语言
sonar.language=go  
#项目的独特关键字,maven 项目是 <groupId>:<artiactId>,go 项目自己定义就可以
sonar.projectKey=projectKey  
#将在web界面上显示的名字
sonar.projectName=demo  
#项目版本
sonar.projectVersion=1.0  
#需要分析的源码目录的路径
sonar.sources=.  
sonar.exclusions=**/*_test.go,**/vendor/**  
sonar.tests=.  
sonar.test.inclusions=**/*_test.go  
sonar.test.exclusions=**/vendor/**  
#golangci-lint 报告路径
sonar.go.golangci-lint.reportPaths=report.xml  
#单测覆盖率报告地址
sonar.go.coverage.reportPaths=cover.out  

  在项目目录下分别执行go test -v ./... -coverprofile=cover.out以及golangci-lint run --out-format checkstyle ./... > report.xml等生产报告,并执行sonar-scan 来将生成的报告上传到服务器。这里默认在使用的是sonar8.1 已经支持了golangci-lint。

  报告主页

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理

评 论

论坛新帖



建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海信义律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2022, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道