设为首页 收藏本站
查看: 1110|回复: 0

[经验分享] golang代码覆盖率

[复制链接]

尚未签到

发表于 2018-9-20 08:36:35 | 显示全部楼层 |阅读模式
  写了自动化,就得统计代码覆盖率= =
  原链接:https://www.elastic.co/blog/code-coverage-for-your-golang-system-tests
  其实看了原链接我并没有能成功统计出来,还是看了同事的笔记才成功的。
  操作步骤 -- 按我实际操作的步骤写的
  1 创建main函数的test文件
  2 编译代码,生成可执行文件
  3 统计覆盖率

一  Main函数的test文件
  

package main  

// This file is mandatory as otherwise the filebeat.test binary is not generated correctly.  
import (
  "testing"
  "flag"
  
)
  
var systemTest *bool
  
func init() {
  systemTest = flag.Bool("systemTest", false, "Set to true when running system tests")
  
}
  
// Test started when the test binary is started. Only calls main.
  
func TestSystem(t *testing.T) {
  if *systemTest {
  main()
  }
  
}
  

  注意:
  1 命名:看一下自己代码的main()函数所在的go文件名称,直接命名为*_test.go文件即可;  比如,代码文件名 main_server.go,可直接命名为main_server_test.go
  2 目录:放在与被测文件同目录下 @1

二  编译代码
  1  查看main函数,将其中的os.Exit()更改为return (根据实际情况分别为return/return 0/return 255...)
  2 原编译命令为go build
  此处使用命令go test -c -covermode=count -ldflags "-X main._VERSION_=$VERSION.${reversion}"  -coverpkg  ./gopath/src/mvdsp/module/,./gopath/src/mvdsp/extractor/,./gopath/src/mvdsp/mvutil/,./gopath/src/mvdsp/protocol/ -o dsp_server.test
  ① -c 表示 生成测试二进制文件
  ② -covermode=count 表示 生成的二进制中包含覆盖率计数信息
  ③ -ldflags 用来将版本信息写入二进制文件,而不使用额外的version文件
  ④ -coverpkg 后面是要统计覆盖率的文件源码
  ⑤ -o 后面是输出的二进制文件名
  ⑥ ......可能还有更多的可用参数,我就不知道了
  3 执行命令,生成一个可执行的二进制文件,拷贝到部署目录下
  4 启动服务,在启动命令后加参数: -systemTest -test.coverprofile coverage/coverage.cov
  ① -systemTest 用来启动前面说过的main test
  ②  -test.coverprofile 用来指定覆盖率信息写入到哪个文件

三  统计覆盖率
  1 执行自动化
  2 执行如下命令,生成覆盖率文件coverage.cov
  

pid_server=`ps -ef | grep "my_server -systemTest" | grep -v "grep" | awk '{print $2}'`  
kill $pid_server
  

  覆盖率产生的条件是程序需要正常退出/结束, 因此当自动化运行完毕后,我们需要给程序发送消息表示结束才可以得到覆盖率文件
  对此:go是需要return,即可以kill server_pid(若服务使用supervisor启动,还会自己拉起来,不会影响后续调用)
  c/c++ 是需要exit?,发送p __gcov_flush(),见http://www.cnblogs.com/zhaoxd07/p/5608177.html
  python需要触发atexit模块注册一个回调函数,可使用CTRL+C或者kill -2
  3 生成测试报告
  

go tool cover -html=./coverage/coverage.cov -o /data/reports/coverage.html  
./coverage/gocover-cobertura < coverage.cov > /data/reports/coverage.xml  
  

  生成xml报告时需要安装一个小插件:go get github.com/t-yuki/gocover-cobertura
  将bin下的gocover-cobertura放到方便执行的目录下即可使用
  4 将测试报告集成到jenkins,大功告成啦
DSC0000.png DSC0001.png




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-598550-1-1.html 上篇帖子: [goa]golang微服务框架学习(二) 下篇帖子: Golang的交互模式进阶
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表