在 Github Action 管道内集成 Code Coverage Report

news/2024/11/13 11:33:23/文章来源:https://www.cnblogs.com/kklldog/p/18538651

Github Actions

我们的开源项目 Host 在 Github,并且使用它强大的 Actions 功能在做 CICD。单看 Github Actions 可能不知道是啥。其实它就是我们常说的 CICD pipeline 或者叫 workflow。当我们 Push 代码到 Github,它会自动触发这些管道。它会帮我们自动 build 代码,跑 test cases,构建镜像,发布镜像,等等。这一切还都是免费的。
今天我把 AgileConfig 的测试在 Github Actions 上跑通了。原来集成测试在 Actions 上跑一直有点问题,今天终于修好了。既然 test cases 都可以跑通了,那么能不能在 Actions 直接看到 code coverage 呢?答案当然是肯定的。

运行测试并收集结果

在我们每次运行单元测试的时候,微软的工具其实已经可以为我们生成结果描述文件了。请使用以下代码运行测试:

dotnet test --no-build --verbosity normal --collect:"XPlat Code Coverage" --results-directory ./coverage

运行完成后我们可以看到会生成多个 xml 文件,这些文件其实就是用来描述测试内容与结果的文件.

测试运行成功。
测试总数: 123通过数: 123
总时间: 2.6757 分钟1>已完成生成项目“D:\00WORKSPACE\AgileConfig\AgileConfig.sln”(VSTest 个目标)的操作。已成功生成。0 个警告0 个错误已用时间 00:02:43.08附件:D:\00WORKSPACE\AgileConfig\coverage\1a7564b1-aa53-44ad-b34b-9abbb4b97c9f\coverage.cobertura.xmlD:\00WORKSPACE\AgileConfig\coverage\45f571fb-2ec4-445b-b444-6879f784c925\coverage.cobertura.xmlD:\00WORKSPACE\AgileConfig\coverage\ff1d49a5-9663-42f9-813b-2ef81fe5ed3f\coverage.cobertura.xmlD:\00WORKSPACE\AgileConfig\coverage\6b502f8f-a99f-4931-8643-faf79db7273c\coverage.cobertura.xmlD:\00WORKSPACE\AgileConfig\coverage\ff389298-7b68-4e60-a35c-d9c0db8cd640\coverage.cobertura.xml

在本地分析测试结果

有了这几个 xml 文件我们就可以进行分析了。当然用肉眼来分析是看不出来啥的。我们先在本地用插件来分析一波。
在 VS 里安装插件:

Fine Code Coverage

安装完后插件后,再次运行一下所有的测试用例。在 VS 的输出窗口我们选择 FCC
这个窗口内会打印出每个 project 的测试结果。

打开 “视图”>“其他窗口”>“Fine code coverage” ,我们能查看更详细的结果。

使用 CodeCoverageSummary

既然在本地能分析这些文件,那么我们显然只要能在 Github Actions 里面插入一步分析的步骤就可以了。显然已经有大佬实现了这个 Action,我们只要集成到自己的 workflow 文件里就行了。
CodeCoverageSummary:

A GitHub Action that reads Cobertura format code coverage files from your test suite and outputs a text or markdown summary. This summary can be posted as a Pull Request comment or included in Release Notes by other actions to give you an immediate insight into the health of your code without using a third-party site.

CodeCoverageSummary

修改我们的 CI Workflow 文件:

  - name: Buildrun: dotnet build --no-restore- name: Testrun: dotnet test --no-build --verbosity normal --collect:"XPlat Code Coverage" --results-directory ./coverage- name: Code Coverage Reportuses: irongut/CodeCoverageSummary@v1.3.0with:filename: coverage/**/coverage.cobertura.xmlbadge: truefail_below_min: trueformat: markdownhide_branch_rate: falsehide_complexity: trueindicators: trueoutput: boththresholds: '60 80'

使用起来非常简单。并且有非常多的配置项,这里不一一介绍了。有需要的直接看它的文档吧。
下面让我们跑一下这个 workflow 试试看。

Coverage File: /github/workspace/coverage/d497ebaf-5670-41ea-8215-dfb4f3a037d6/coverage.cobertura.xml
Coverage File: /github/workspace/coverage/83632b7c-8df2-4179-b0a8-e6410a71b1b7/coverage.cobertura.xml
Coverage File: /github/workspace/coverage/b434d3bb-7909-4a7d-b0f2-f8620d429cfc/coverage.cobertura.xml
Coverage File: /github/workspace/coverage/af81da37-b5c5-4edd-a409-74984355857e/coverage.cobertura.xml
Coverage File: /github/workspace/coverage/1b159b39-3eb4-4951-936e-afde68925b34/coverage.cobertura.xml![Code Coverage](https://img.shields.io/badge/Code%20Coverage-18%25-critical?style=flat)Package | Line Rate | Branch Rate | Health
-------- | --------- | ----------- | ------
AgileConfig.Server.IService | 41% | 67% | ❌
Agile.Config.Protocol | 0% | 100% | ❌
AgileConfig.Server.Data.Repository.Freesql | 95% | 93% | ✔
AgileConfig.Server.Data.Freesql | 72% | 59% | ➖
AgileConfig.Server.Service | 28% | 21% | ❌
AgileConfig.Server.EventHandler | 0% | 0% | ❌
AgileConfig.Server.Data.Mongodb | 73% | 54% | ➖
AgileConfig.Server.Data.Abstraction | 77% | 50% | ➖
AgileConfig.Server.Event | 0% | 100% | ❌
AgileConfig.Server.Data.Repository.Mongodb | 67% | 88% | ➖
AgileConfig.Server.Data.Entity | 97% | 100% | ✔
AgileConfig.Server.Common | 1% | 0% | ❌
AgileConfig.Server.Data.Repository.Selector | 95% | 67% | ✔
AgileConfig.Server.Data.Freesql | 45% | 31% | ❌
AgileConfig.Server.Data.Abstraction | 80% | 75% | ✔
AgileConfig.Server.Data.Entity | 89% | 100% | ✔
AgileConfig.Server.Common | 1% | 0% | ❌
AgileConfig.Server.Data.Abstraction | 77% | 67% | ➖
AgileConfig.Server.Data.Entity | 0% | 100% | ❌
AgileConfig.Server.Common | 1% | 0% | ❌
AgileConfig.Server.Common | 21% | 25% | ❌
AgileConfig.Server.IService | 27% | 17% | ❌
Agile.Config.Protocol | 0% | 100% | ❌
AgileConfig.Server.Data.Repository.Freesql | 0% | 0% | ❌
AgileConfig.Server.Data.Freesql | 0% | 0% | ❌
AgileConfig.Server.Service | 2% | 2% | ❌
AgileConfig.Server.EventHandler | 0% | 0% | ❌
AgileConfig.Server.Data.Mongodb | 0% | 0% | ❌
AgileConfig.Server.Data.Abstraction | 0% | 0% | ❌
AgileConfig.Server.Event | 3% | 100% | ❌
AgileConfig.Server.Data.Repository.Mongodb | 0% | 0% | ❌
AgileConfig.Server.Data.Entity | 15% | 100% | ❌
AgileConfig.Server.OIDC | 0% | 0% | ❌
AgileConfig.Server.Common | 2% | 3% | ❌
AgileConfig.Server.Data.Repository.Selector | 0% | 0% | ❌
AgileConfig.Server.Apisite | 4% | 2% | ❌
**Summary** | **18%** (2009 / 15061) | **15%** (337 / 3196) | ❌_Minimum allowed line rate is `60%`_FAIL: Overall line rate below minimum threshold of 60%.

我们发现这个 workflow 跑失败了。原因是我们的 coverage 只有 18%。刚才我们配置了最小值是 60%,低于60就会直接跑出异常,中断 workflow。看日志我们也可以看到对每一个项目的统计。有 line rate,branch rate,health 等内容。

总结

这次我们演示了如何在本地使用 VS 插件对单元测试的结果进行分析获得 coverage。以及演示了如何通过 CodeCoverageSummary 在 Github Action 的 workflow 内对测试结果进行分析。还是非常简单的。希望对大家有帮助。
好了不说了,补单元测试去了。。。

关注我的公众号一起玩转技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/830853.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建帮助中心:高新技術行業的内部知识库解决

大家晚上好,这里是ai元启航,今天这篇分享的文章是我这周学习的ai知识之一。在高速发展的高新技术行业中,知识的快速迭代与技术的持续创新是企业保持竞争力的关键。为了有效应对这一挑战,构建一个高效、智能的内部知识库与帮助中心已成为高新技术企业的核心战略。本文将深入…

鸿蒙自定义组件生命周期

在开始之前,我们先明确自定义组件和页面的关系:自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个…

Tomcat 整体架构

Tomcat 是什么 Tomcat 是开源的 Java Web 应用服务器,类似的 Java Web 服务器还有 Jetty,Jboss Tomcat 整体架构Tomcat 核心组件 Tomcat 核心组件主要有以下四个 Server、Service、Connector、Container Server:即为一个 Tomcat 实例,每个主机可以启动多个 Server Service:…

第四章 数据编码与演化

本章中将介绍几种编码数据的格式,包括 JSON,XML,Protocol Buffers,Thrift和Avro。尤其将关注这些格式如何应对模式变化,以及它们如何对新旧代码数据需要共存的系统提供支持。然后将讨论如何使用这些格式进行数据存储和通信:在Web服务中,具象状态传输(REST)和远程过程调…

微调大模型-5-导出GGUF

长风破浪会有时,直挂云帆济沧海! 可通过下方链接找到博主 https://www.cnblogs.com/judes/p/10875138.html

学习笔记(三十一):ArkUi-componentUtils

概述: 提供获取组件绘制区域坐标和大小的能力。 一、导入模块import { componentUtils } from @kit.ArkUI; 二、根据组件id获取组件信息 componentUtils.getRectangleByIdgetRectangleById(id: string): ComponentInfo根据组件ID获取组件实例对象, 通过组件实例对象将获取的坐…

Node.js 构建命令行工具:实现 ls 命令的 -a 和 -l 选项

在日常的前端开发中,我们常常借助各种基于 Node.js 的脚手架工具来加速项目搭建和维护,比如 create-react-app 可以一键初始化一个 React 项目,eslint 则帮助我们保持代码的整洁和一致。而在公司内部,为了更好地满足特定业务的需求,我们往往会构建自己的脚手架工具,如自定…

法律行业内部知识库构建:重要性与实施步骤

这里是ai元启航,最近在学习ai相关知识,所以来分享一些这周学习的一些知识点,今天分享的是涉及法律行业的知识库搭建内容。 在当今信息爆炸的时代,法律行业面临着前所未有的挑战。法规的不断更新、案例的日益复杂以及客户需求的多样化,都要求法律从业者能够快速、准确地获取…

视野修炼第109期 | VSCode主题定制

① VS Code 主题定制生成 ② skellyCSS - 轻量级的CSS骨架屏方案 ③ npmpackage.info ④ create-vue 实现性集成 Oxlint ⑤ 英:从 URL 输入到页面渲染的过程 ⑥ 使用 JS 生成随机迷宫 ⑦ gounfaked - 免费的AI图片欢迎来到第 109 期的【视野修炼 - 技术周刊】,下面是本期的精…

网址封装(带苹果免签/安卓apk/苹果ipa)仿第八区H5APP封装打包分发系统源码

此封装系统可以无限封装,也可以给用户开后台让别人无限封装多个“苹果免签”文件 市面上一个苹果免签封装价格70到150rmb之间,自己拥有一个封装系统还是特别划算 分发网站功能如下: 1、苹果免签封装带绿标签名功能(可设置自己的域名显示) 免签封装时候任意网址/网页,不跳…