第十六章 品质保证:发布覆盖率测试报告

news2024/11/15 4:38:43

代码覆盖率才是评价一个项目品质的标准。在挑选一个项目的时候,有经验的使用者都会根据代码覆盖率来确定代码的可靠性。

虽然自动化测试工具可以自动验证代码的正确性,但是如果只有部分代码经过了测试,或者只是简单地跑通了代码,也不能说是一个合格的代码。比如组件库只测试一部分的组件,或者每个组件只测试了默认设置。譬如,按钮中某个属性或者某几个属性间的排列组合并没有得到测试,这样的测试还不能保证组件库的功能完全正确。

那么如何来客观评价这个测试的完备程度呢?答案就是代码覆盖率。

在这里插入图片描述


JavaScript 是前端应用主要语言,相较于其他平台编程语言,JS资源多数情况下要通过网络进行加载,那么代码的体积直接影响了页面加载执行时间。“无效的代码”的多寡直接影响到了我们的代码质量,所以度量代码的执行覆盖率是一项重要的优化前置工作。

Dead code

Dead code 也叫无用代码,这个概念应是在编译时静态分析出的对执行无影响的代码,举个例子:

// a.js
const a = 1;
const b = 2; /* dead code */
export default a;

// index.js
import a from './a.js';
export default function() {
  console.log(a);
}

通常我们用 Tree Shaking 在编译时移除这些 dead code以减小代码体积。


冗余代码

而代码覆盖率里所提到的冗余代码 和 Dead Code 又略有不同,简单来说Dead code适用于编译时,而 Code coverage 适用于运行时。

Dead code 是任何情况下都不会执行的代码,所以可以再编译阶段将其剔除。

冗余代码 是某些特定的业务逻辑之下并不会执行到这些代码逻辑(比如:在首屏加载时,某个前端组件完全不会加载,那么对于“首屏”这个业务逻辑用例来讲,该前端代码就是冗余的)。


覆盖率概念

代码覆盖率(Code coverage)是软件测试中的一种度量指标,描述测试过程中(运行时)被执行的源代码占全部源代码的比例。

只是简单地做到行级覆盖还远远不够,可以看看下面的例子

function getStr(a, b) {
    if(a && b) {
        return 'both'
    }else {
        return 'other'
    }
}

以上代码只需要两个 Case,就可以将所有语句都跑一遍:

  • Case 01: a = true ; b = true; 期待结果:‘both’
  • Case 02: a =false ; b= true; 期待结果:‘other’

但是,显然这样测试甚至不能确定代码中 b 是否参与条件判断。比如下面代码可能也会出现相同的结果。

function getStr(a, b) {
    if( a ) {
        return 'both'
    }else {
        return 'other'
    }
}

所以覆盖率只有简单的代码行覆盖还远远不够。


覆盖率种类

在软件工程理论中会把覆盖率分为:

  • 语句覆盖(statement coverage)
  • 判定覆盖(decision coverage)
  • 条件覆盖(condition coverage)
  • 条件判定组合覆盖(condition decision coverage)
  • 路径覆盖(path coverage)
  • 多条件覆盖(multi-condition coverage)
  • 修正条件判定覆盖(modified condition / decision coverage)

覆盖深度的提高显然会让代码功能验证更加全面,但是相应的实施成本也会明显提高。

理论的覆盖虽然全面但是实际生产很多指标的指导价值并不是很大。在实际生产中会将它进行简化。

在 Javascript 语言中,代码覆盖率通常会分为四级覆盖。

  • Function coverage 函数覆盖 - 每个函数是否被执行;
  • Line coverage 行覆盖 – 每行是否被执行;
  • Statement coverage 语句覆盖 - 每个语句是否被执行;
  • Branch coverage 分支覆盖 - 每个 if 节点是否都被执行。

这是结合了函数式语言的特点和指标的实用程度的经验之谈,也是 JavaScript 世界比较受认可的标准。


Istanbul 代码覆盖率工具

代码覆盖率需要专用的工具生成。在 JavaScript 程序中的代码覆盖率通常都是通过 Istanbul 生成的。Istanbul 的来历是伊斯坦布尔的地毯,覆盖率报告其实就是用颜色来表示代码的运行情况,好像给代码铺上了地毯。

我们熟悉的 Jest 和组件库使用的 Vitest 测试框架,都是使用的 Istanbul。Istanbul 的实现原理是通过编译期代码插桩方式实现的。有兴趣的同学可以研究一下。咱们这里面只讲如何使用。

覆盖率原理介绍:http://www.alloyteam.com


生成覆盖率报告

在 Vitest 只需要在命令行中添加参数 --coverage 就可以生成覆盖率报告了。

文件名:package.json

"scripts": {
    "coverage": "vitest run --coverage"
  },

还需要安装依赖@vitest/coverage-c8

pnpm i @vitest/coverage-c8 -D

执行命令

pnpm coverage

执行完命令后会生成一个coverage目录,且控制台有相应结果

在这里插入图片描述

浏览器查看coverage目录的index.html

在这里插入图片描述

默认报告形式是一个静态网站。

如果想对报告进行进一步调整,可以在 vite.config.ts 中进行。

test: {
    coverage: {
      provider: "istanbul", // or 'c8',
      reporter: ["text", "json", "html"],
    },
  },

调整的两项是:

  • 指定覆盖率引擎 istanbul;
  • 指定输出格式,默认是没有 json 格式的。这个和后面的覆盖率展示有关,务必要加。

安装依赖

pnpm i @vitest/coverage-istanbul -D

执行命令

pnpm coverage

在这里插入图片描述


公布覆盖率报告

覆盖率报告放在本地只能给自己的单元测试提供依据,更大的用途在于将覆盖率报告公布展示出来,让使用者可以看到。通常会选用覆盖率展示平台,常用的有 Codecov 和 Coveralls。

Codecov 是一个开源的测试结果展示平台,将测试结果可视化。Github 上许多开源项目都使用了 Codecov 来展示单测结果。Codecov 跟 Travis CI 一样都支持 Github 账号登录,同样会同步 Github 中的项目。

还会自动的生成徽章。这个徽章是会根据报告结果动态变化的,属于客观的第三方数据,具有公信力。

首先需要登录Codecov 官网:https://about.codecov.io/

在这里插入图片描述

一定要使用 Github 账号进行登录,这样它可以直接读取你的 Github 中的项目。

然后是添加访问授权,如果你的项目在你名下的组织下,也需要访问授权

在这里插入图片描述

这时候你就可以在网站上找到所有 Github 中的项目。选择 【Not yet setup 】,选择需要展示覆盖率报告的网站后的【 setup repo】链接,就可以看到安装指南。

在这里插入图片描述

它这个安装指南是针对所有语言项目的。这里面我们只需要得到它的上传 Token 就好了。


持续集成自动更新覆盖率报告

覆盖率报告最好能够自动按照最新版本持续更新,而不是自己手动上传。所以这个时候就需要使用 CI 工具来帮忙了。首先需要编写一个 Action。

文件名:.github/wokflows/codecov.yml

# .github/workflows/main.yml
# This is a basic workflow to help you get started with Actions

name: Coverage

# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
  push:
    branches: [master]
  pull_request:
    branches: [master]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  CodeCov:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      - uses: actions/checkout@v2
      - uses: pnpm/action-setup@v2.1.0
        with:
          version: 7.2.1
      - name: Install modules
        run: pnpm install
      - name: Run Test Coverage
        run: cd packages/smarty-ui-vite && pnpm coverage
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v3
        with:
          directory: packages/smarty-ui-vite/coverage
          token: ${{ secrets.CODECOV_TOKEN }}

上传报告环节同样使用现成的 Action 。这里面需要添加 Token,把上面 codecov 安装指南中得到的 Token 放入 Secrets 中。

在这里插入图片描述

提交代码就可以自动生成覆盖率报告了。

在这里插入图片描述

在这里插入图片描述

Codecov Action 会自动识别语言与测试框架的覆盖率报告种类,然后上传相应的数据。这里面要特别说明,对于 Vitest ,是上传的 json 格式的报告,所以需要确定你确实生成了 json 报告。如何生成可以看上文介绍。

在这里插入图片描述


添加覆盖率徽章

最后就是富有仪式感的一步。Codecov 网站可以将测试结果生成为徽章。你可以把徽章直接放到 Github 中展示出来。

在项目的【 Settings 】中找到对应的徽章。

在这里插入图片描述

在这里插入图片描述

覆盖率报告是项目品质的重要指标,成熟的项目都会把项目展示在显眼的位置,大家通常都会拿代码覆盖率指标评价开源代码的成熟度。当然过高的覆盖率也会带来成本的提高,和拉低项目进步速率。

品质、进度、成本是每一个项目管理中都需要均衡的东西。所以一味追求代码覆盖率也未必是好事。这个大家要客观看待。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BlockingQueue二

接着上篇BlockingQueue没讲完的 LinkedTransferQueue LinkedTransferQueue是一个由链表结构组成的无界阻塞队列,相对于其它阻塞队列,LinkedBlockingQueue可以算是LinkedBlockingQueue与SynhronoousQueue结合,LinkedtransferQueue是一种无界…

Unity学习笔记--详细介绍CacheServer、部署方法、以及在Unity中的位置

目录前言CacheServer是什么?解决了什么问题?其他知识点在哪里找到Cache Server?怎么部署CacheServer?Unity什么时候需要生成内部文件?CacheServer缓存的是什么?随着越来越多的资源被导入和存储,…

实战-COVID-19-KSH(html+ python +django +爬虫 +pyecharts 实时疫情动态)内附MySQL详细安装配置教程

GitHub代码 Windows10 python3.7 一、MySQL配置 1.官网下载地址 2.配置初始化文件my.ini 解压后在根目录下创建my.ini文件(建立.txt-修改扩展名为.int即可) 打开my.ini文件,输入以下内容(注意需要改动2处)&#x…

求一个网页设计作业——个人博客(HTML+CSS)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

9.Springboot整合Security很全

1.什么是Security SpringSecurity是基于Spring AOP和Servlet过滤器的安全框架。 它提供全面的安全性解决方案,同时在Web 请求级和方法调用级处理身份确认和授权。 2.Spring Security核心功能? (1)认证(你是谁&…

薪资25k,从华为外包测试“跳”入字节,说说我转行做测试的这5年...

转行测试5年了 当时因为家里催促就业,在其中一个室友的内推下进入了一家英语教培机构,前期上班和工资都还算满意,甚至觉得自己找到了一份很稳定的工作了,可是好景不长,“双减政策”的到来,让公司的经济遭受…

Linux进程间通讯技术

Linux进程间通讯 文章目录Linux进程间通讯1.进程通讯基本认知1.1 进程通讯的概念1.2 进程通讯的目的1.3 进程通讯的本质1.4 进程通讯的分类2.管道技术基本认知2.1 管道的概念2.2 为什么需要管道2.3 管道的四个特点2.4 管道的四种情况2.5 管道的大小获取2.6 命名管道与匿名管道的…

MyBatis-Plus条件构造器[常用的模糊查询、排序查询、逻辑查询和指定字段查询案例]

系列文章目录 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus中的更新操作&#x…

2.2 反相放大器、高输入电阻反相放大器、反相高压放大器

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事硬件研发,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验&a…

【cocos源码学习】解决cocos2d-x-4.0 Android Demo构建遇到的问题

环境 硬件:macbook pro 四核Intel Core i7系统:macOS Big Sur 11.4.2、 xcode Version 13.1 、cmake 3.20.5软件:iterm2 Build 3.4.8、zsh 5.8、Android Studio Dolphin | 2021.3.1cocos2d-x v4 : 官方下载压缩包 http://cocos2d…

目标检测算法——YOLOv5/YOLOv7改进之结合特征提取网络RFBNet(涨点明显)

>>>深度学习Tricks,第一时间送达<<< 🚀🚀🚀NEW!!!魔改YOLOv5/v7目标检测算法来啦 ~ 计算机视觉——致力于目标检测领域科研Tricks改进与推荐 | 主要包括Backbone、Neck、Head、普通注意力机制、自注意力机制Transformer、Swin Transformer v2,各…

Java中Set集合的使用和底层原理

文章目录Set系列集合介绍Set集合概述HashSet无序原理Set集合对象去重LinkedHashSetTreeSet排序规则Set系列集合介绍 Set集合概述 Set系列集合特点: 无序&#xff1a;存取数据的顺序是不一定的, 当数据存入后, 集合的顺序就固定下来了 不重复&#xff1a;可以去除重复 无索引&…

HTML期末学生大作业:中华传统文化【苏绣手工艺】带psd设计图(15页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

线程的基本操作以及线程的状态

目录 &#x1f433;今日良言:得之坦然&#xff0c;失之淡然&#xff0c;争取必然&#xff0c;顺其自然。 &#x1f42f;一、线程的基本操作 &#x1f42d;1.线程的创建 &#x1f42d;2.线程的中断 &#x1f42d;3.线程的等待 &#x1f42d;4.获取线程实例 &#x1f42d;…

[附源码]计算机毕业设计学分制环境下本科生学业预警帮扶系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【POJ No. 3264】区间最值差 Balanced Lineup

【POJ No. 3264】区间最值差 Balanced Lineup 北大OJ 题目地址 其实这道题 之前也做过一次了 http://t.csdn.cn/0YZgC 不过上次是用ST 做的。这次换做 分块来实现。 【题意】 每天挤奶时&#xff0c;约翰的N 头奶牛&#xff08;1≤N≤50,000&#xff09;都以相同的顺序排队…

【网络工程】7、实操-万达酒店综合项目(一)

接上篇《6、防火墙介绍及配置实操》 之前我们讲解了防火墙的基础知识以及相应的实操案例&#xff0c;本篇我们结合之前的交换机、路由器及防火墙的知识&#xff0c;进行一个酒店网络项目的实战。 本篇主要介绍一下酒店网络项目的整体需求文档。 一、项目背景 为规范万达美华…

tensorflow fashion_mnist数据集模型训练及预测

✨ 博客主页&#xff1a;小小马车夫的主页 ✨ 所属专栏&#xff1a;Tensorflow 文章目录前言一、环境二、fashion_mnist数据集介绍三、fashion_mnist数据集下载和展示四、数据预处理五、构建模型和训练模型六、模型预测总结前言 前面介绍mnist手写数字集训练&#xff0c;本文对…

自制肥鲨HDO2电源降压延长线,支持3S~6S动力电池

自制肥鲨HDO2电源降压延长线&#xff0c;支持3S~6S动力电池1. 问题源由2. 破题思路2.1 10元大钞搞定2.2 两个毛爷爷搞定3. 解决方案4. 最终延长线产出4.1 裸照4.2 成品5. 花絮1. 问题源由 源由&#xff1a; 电池盒电源线接触不良。 肥鲨眼镜的电源盒问题由来已久&#xff0c;…

SecureCRT隧道,跳板机+端口转发,内网穿透

背景 ServerA(Linux系统)&#xff1a; 内网&#xff1a;192.168.111.201 公网&#xff1a;10.121.8.88&#xff08;虚构的ip方便理解&#xff09; ServerB&#xff1a; 内网&#xff1a;192.168.111.202 本机&#xff1a; 安装有SecureCRT软件 注意上图中的箭头。箭头指向可…