当前位置: 首页 > news >正文

go语言实现新增代码单测覆盖率

前言

解释下什么是单元测试

单元测试的最终统计标准就是单测覆盖率,统计单测总体覆盖了多少行代码。一般来说,我们只需要关注增量代码的覆盖率,而非全量代码。增量代码就是本次迭代改动的代码,比如本次迭代改动了100行代码,我们保证单测能覆盖到这 100 行代码就行。

用到的技术点

无论是单测还是自动化框架,在go语言中,比较常用的就是go test
而实现单测覆盖率测试需要用到gocov
而如何实现新增单测覆盖率呢?这个就不得不提到git的diff-cover
OK,接下来说下实现过程,小伙伴们可以无脑直接按照过程直接实现

实现过程

Go语言中,可以使用go test命令结合gocov和gocov-xml工具来生成单元测试覆盖率报告。

第一步:首先,确保你已经安装了gocov和gocov-xml。如果没有安装,可以使用以下命令安装

go get -u github.com/axw/gocov/...
go get -u github.com/AlekSi/gocov-xml

安装后记得将其添加到系统PATH中

export PATH=$PATH:$GOPATH/bin

第二步:使用go test生成测试报告

//常规用法,指定统计example文件夹内报告
go test -coverprofile=cover.out ./example
//统计全部文件夹报告
go test -v -race -p=1 -parallel=1 -json -cover -coverprofile=cover.out ./...

此时生成了cover.out报告,可以转换成html方便查看

go tool cover -html=cover.out -o cover.html

在这里插入图片描述

第三步:生成新增单测覆盖率结果

先使用gocov和gocov-xml来生成xml单测覆盖率报告;
使用上面生成的cover.out来生成xml格式结果

gocov convert coverage.out | gocov-xml > coverage.xml

接下来用diff-cover来实现新增单测覆盖率结果
执行之前需要先安装diff-cover

pip install diff-cover

安装完成后生成结果;
使用上面gocov生成的coverage.xml来进行diff

例如需要对比分支1和分支2,本地代码必须是分支1,–compare-branch参数后面则需要使用分支2,从而生成对比结果的html文件,可以快速清晰的生成增量代码覆盖率报告,包括差异文件行、未覆盖行、未覆盖行数、增量覆盖率情况等

diff-cover coverage.xml --compare-branch=origin/需要对比的分支 --html-report coverage_diff.html
--fail-under=80 # 加入该参数可以表示覆盖率没有达到80报错

生成的结果如下图:
在这里插入图片描述

在这里插入图片描述

生成的覆盖率html报告中各个参数解释:
Total: 7 lines:这表示在两个文件(dirpc.go和http.go)的差异中,总共有7行代码被纳入此次覆盖率分析的考虑范围内。
Missing: 6 lines:这表示在上述的7行代码中,有6行是没有被测试覆盖到的,即这些代码行在执行测试时未被执行。
Coverage: 14%:这是指差异部分的代码覆盖率,具体到这个例子中,是说只有14%的修改后的代码被测试覆盖到了。这是一个相对较低的覆盖率,表明有大量的代码更改没有被测试。
SourceFile:源文件名称,这里是dirpc.go和http.go,表示这些文件中的代码更改是本次覆盖率分析的对象。
DiffCoverage(%):每个文件的差异覆盖率百分比。对于dirpc.go是20.0%,意味着在该文件的修改中,有20%的代码被测试覆盖;而http.go的覆盖率为0.0%,说明该文件的所有修改都没有被测试覆盖。
Missing Lines:这列列出了每个文件中未被测试覆盖到的具体代码行号。例如,dirpc.go中的432, 448, 468, 472行,以及http.go中的940, 945行都是未被覆盖的代码行。
下面还会展示具体都那行没有被覆盖到的代码详细

相关文章:

  • Qt 智能指针
  • 探索 DaPy:Python 中的 AI 数据处理新贵
  • GEE APP:实现在线计算全球任何区域森林年度损失可视化应用
  • 深入探讨AI 神经网络:类型、特点与创新应用
  • Vue3动态导入后端路由
  • EasyExcel全面实战:掌握多样化的Excel导出能力
  • 华为OD真题机试-英文输入法(Java)
  • 滚雪球学MySQL[8.1讲]:MySQL扩展功能
  • centos7.9使用docker容器方式部署jenkins环境
  • HanLP词性标注集
  • 初识ZYNQ——FPGA学习笔记15
  • Spring Boot 实现动态配置导出,同时支持公式和动态下拉框渲染和性能优化案例示范
  • 一起发现CMake太美-02-CMake是什么CMake的运行原理
  • Docker官网新手入门教程:从零开始玩转容器
  • dea插件开发-自定义语言9-Rename Refactoring
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript学习总结——原型
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • leetcode386. Lexicographical Numbers
  • MQ框架的比较
  • PAT A1050
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • SAP云平台里Global Account和Sub Account的关系
  • springMvc学习笔记(2)
  • SQLServer之索引简介
  • webpack4 一点通
  • XML已死 ?
  • 测试如何在敏捷团队中工作?
  • 程序员最讨厌的9句话,你可有补充?
  • 基于HAProxy的高性能缓存服务器nuster
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 简单易用的leetcode开发测试工具(npm)
  • 聊聊hikari连接池的leakDetectionThreshold
  • 深入浅出Node.js
  • 王永庆:技术创新改变教育未来
  • 一个JAVA程序员成长之路分享
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 在weex里面使用chart图表
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​人工智能书单(数学基础篇)
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # linux 中使用 visudo 命令,怎么保存退出?
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (c语言)strcpy函数用法
  • (pycharm)安装python库函数Matplotlib步骤
  • (纯JS)图片裁剪
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (六)软件测试分工
  • (三)c52学习之旅-点亮LED灯
  • (四)Linux Shell编程——输入输出重定向
  • (源码分析)springsecurity认证授权
  • (转)【Hibernate总结系列】使用举例
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .Net 6.0--通用帮助类--FileHelper