zoukankan      html  css  js  c++  java
  • golang代码覆盖率

    写了自动化,就得统计代码覆盖率= =

    原链接: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,大功告成啦

  • 相关阅读:
    Service Name Port Number Transport Protocol tcp udp 端口号16bit
    linux linux 互传文件 win 不通过 ftp sftp 往linux 传文件(文件夹)
    soft deletion Google SRE 保障数据完整性的手段
    Taylor series
    Taylor's theorem
    Moving average
    REQUEST
    Unix file types
    mysqld.sock
    Tunneling protocol
  • 原文地址:https://www.cnblogs.com/zhaoxd07/p/8028847.html
Copyright © 2011-2022 走看看