51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4129|回复: 0
打印 上一主题 下一主题

[原创] 5个步骤,轻松获取代码覆盖率报告

[复制链接]
  • TA的每日心情
    无聊
    前天 09:00
  • 签到天数: 1019 天

    连续签到: 3 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-1-8 09:54:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    小编前期所测项目多为go语言研发,为了获取自动化测试代码覆盖率及报告,调研并使用go test进行覆盖率统计。现将实战过程留档,并分享出来以供有需要小伙伴参考。
      获取流程如下:

    各个阶段详细介绍有:
      1、创建main函数的test文件
      想要获取覆盖率,首先要创建main.go文件相应测试文件main_test.go,在main_test.go中使用一个端口,该端口可以控制服务在运行完测试用例后退出并将内存中的覆盖率信息写入文件。端口写在源码中,使得每次修改都要重新编译才生效。此处使用配置文件管理控制端口,修改方便且直观。该控制端口在配置文件main_test_port.toml中管理,配置文件格式举例有:
    1. [common]
    2.   port = 8888
    复制代码
    main_test.go中控制逻辑有监听端口,接收到信号后主动提出应用。写出main_test.go完整内容。
    1. func startServer(){
    2.       go main();
    3.   }
    4.   func TestExternal(t *testing.T){
    5.   // start server need be tested in separate go thread
    6.   go startServer()
    7.   // go test starts a dummy http server, which is used to
    8.   // end the current. go test gracefully when it is accessed
    9.   http.HandleFunc(“/”, testHandler)
    10.   fdir := getExecutePath()
    11.   fpath := fdi+ “/../conf/testing/main_test_port.toml”
    12.   var conf Config
    13.   if _, err := toml.DecodeFile(fpath, &conf); err != nil {
    14.       fmt.Println(“decode config file err”)
    15.   }
    16.   port := conf.Common.Port
    17.   go http.ListenAndServe(“:” + port, nil)
    18.   exitChan = make(chan int)
    19.   sigChan := make(chan os.Signal)
    20.   signal.Notify(sigChan, os.Interrupt)
    21.   select{
    22.   case sig := <-sigChan:
    23.       fmt.Printf(“exit as received signal:%v\n”, sig)
    24.   case val := <-exitChan:
    25.       fmt.Printf(“exit as received http request:%v\n”, val)
    26.   }
    27.   }
    复制代码
    2、插桩方式编译源码
      该阶段通过工具既定命令编译源码,生成打桩了的可执行文件。运行打桩的可执行文件,才能采集到测试用例所覆盖的代码逻辑。我们用到的编译命令有。
    1.  go test –c –covermode=count -coverpkg src –o main.test
    复制代码
    其中,-o main.test指定编译产出的名称为main.test;-covermode指定覆盖模式,count标识记录语句执行;coverpkg 指定统计的源码目录集合,各项之间以英文逗号连接。
      3、运行主服务
      命令行格式运行打桩版本编译产出,并指定生成覆盖率统计数据写入coverage.out中,指定命令如下。

    1. ./main.test –test.coverprofile coverage.out
    复制代码
    服务启动后,占用两个端口:一个为原本可接受http请求的端口;另外一个为步骤1中使用的控制端口。
      4、执行测试用例
      执行项目自动化用例。小编所在团队用例使用robot编写,此处可通过平台或者命令行执行可用用例。
      5、优雅退出主服务,并生成覆盖率报告
      向控制端口发送中断信号后,主服务优雅退出,并生成步骤3中指定命名为coverage.out的覆盖率文件。通过curl命令发送中断信息,命令有
    1. curl ip:port
    复制代码
     其中,ip为服务运行机器的ip地址;port为步骤1中指定的控制端口。
      当前生成的coverage.out文件仅记录各个文件的覆盖行数等信息,可读性差。通过现用工具将coverage.out作为数据源,为每个源码文件生成一个对应的html报告文件,样式见下图。

    其中,各行通过不同颜色标识是否被覆盖,绿色标识被覆盖,红色表示未覆盖。
      为了使得各个服务的各个版本的覆盖率报告可历史遍历,可将数据留档至数据库中,将实现一个前端平台展示。







    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-16 13:44 , Processed in 0.071608 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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