代码覆盖生态系统的库和软件包

2023-11-11

如果您已经编写了测试驱动的代码已有一段时间了,那么您将了解代码覆盖率(也称为测试覆盖率)。 如果您不熟悉该术语,则有两个简短定义。 维基百科将其定义为

一种度量,用于描述特定测试套件运行时程序源代码的执行程度。

根据Martin Fowler的说法 ,代码覆盖范围…

…帮助您找到未测试代码的哪些位。 值得经常运行覆盖工具并查看这些未经测试的代码。

如果您还不熟悉代码覆盖率并将其作为测试过程或持续开发流程的一部分来使用,我强烈建议您学习一下。 话虽如此,今天我将开始一个分为两部分的系列,介绍代码覆盖率工具。

在第一部分中,我将逐步介绍针对当今可用的五种最受欢迎​​的软件开发语言的工具。 这些是PHPPythonGoJavaRuby

在第二部分中,我将逐步介绍四个在线服务,涵盖它们提供的功能,其工作方式的概述以及各自方法的一些差异。

为了使工具的涵盖范围变得有意义,我为每种语言创建了一个小型存储库,其中包含一个适度的用户实体以及相应的五种语言的实体测试套件。 这样,您将看到的测试输出应该更有意义。 我要强调的是,代码不会改变世界,但是足以让每个工具都有基本的感觉。

这是到五个存储库的快速链接:

的PHP

我将从PHP开始,因为这是我目前花费最多时间开发的语言。 如果您花了很多时间在PHP上,那么您将知道提供代码覆盖率候选人是PHPUnit

PHP的资深测试框架已经存在了很长时间。 PHPUnit通过其PHP_CodeCoverage组件提供了代码覆盖支持,并利用了PHP的XDebug扩展 。 可以将代码覆盖率报告生成为HTML和XML文件,支持的报告格式为CloverCrap4J和PHPUnit。

报告本身支持以下指标:

  • 线,函数和方法,类和特性,操作码,分支和路径覆盖
  • 变更风险反模式(CRAP)指数

CRAP指数

基于圈复杂度和一个代码单元的代码覆盖率计算。 不太复杂并且具有足够测试覆盖率的代码将具有较低的CRAP索引。 通过编写测试和重构代码以降低其复杂性,可以降低CRAP索引。

另外,借助docblock批注,PHPUnit支持忽略特定代码块的功能,例如无法测试的代码块或要从代码覆盖率分析中忽略的代码块。

例如,可以使用@codeCoverageIgnore批注指示应忽略类,函数或行。 另外,您可以使用@codeCoverageIgnoreStart@codeCoverageIgnoreEnd忽略一段代码。

您还可以使用批注指示功能与一种或多种方法有关。

例如,假设我们在PHP User实体中有另一个名为getUserDetails ,该方法返回所有User的详细信息。 当然,它们的名称将成为其详细信息的一部分。 鉴于此, getName与该方法有关。 因此,我们可以添加注释@covers User::getUserDetails以显示测试getName与测试getUserDetails

因此,您可以看到PHP的代码覆盖面非常广泛,可以准确指示测试中包括哪些内容。

运行报告

假设可以将PHPUnit作为项目依赖项并安装了XDebug扩展,则可以通过以下两种方式之一生成代码覆盖率报告。

  • 可以在命令行上将选项传递给PHPUnit的调用,例如通过运行:
phpunit --coverage-html tests/coverage
  • 可以在日志记录部分中配置PHPUnit的配置文件phpunit.xml.dist,以指定必要的选项,如以下示例所示:
<logging>
    <log type="coverage-html" target="test/coverage/report" lowUpperBound="35"
         highLowerBound="70"/>
    <log type="coverage-clover" target="/tmp/coverage.xml"/>
    <log type="coverage-php" target="test/coverage/coverage.serialized"/>
    <log type="coverage-text" target="php://stdout" showUncoveredFiles="false"/>
    <log type="junit" target="test/coverage/logfile.xml" logIncompleteSkipped="false"/>
    <log type="testdox-html" target="test/coverage/testdox.html"/>
    <log type="testdox-text" target="test/coverage/testdox.txt"/>
</logging>

报告范例

在下图中,您可以看到HTML报告的示例。 在顶部,您可以看到表格报告,其中显示了有关文件(或文件夹)的可用覆盖范围指标; 在这种情况下,为SimpleEntities/src/User.php

类级别的PHPUnit代码覆盖率

您可以看到它涵盖了特征函数方法 。 您可以看到类构造函数和两个方法setNamegetName具有100%的覆盖率。

作为进一步的验证,在表格报告下,您可以看到突出显示的代码。 除一行外,其余所有行均为绿色,这意味着该行代码的执行已通过测试。 黄色表示最后的代码行。 另外,还有红色,表示该行尚未测试。

Python

为了在Python中生成代码覆盖率报告,可以将多个Python测试库与Coverage.py结合使用。

简要说明一下文档 ,Coverage.py首先运行一个或多个代码文件来了解代码中执行了哪些行。 在此阶段,它运行一个跟踪函数,该函数在执行时记录每个文件和行号。

执行完成后,它将检查执行的代码以确定可以运行哪些行。 完成这两个步骤后,根据检索到的信息,它会生成一个报告,以可视化方式显示运行的内容和未运行的内容。

与许多Python库一样,如果您使用的是Linux发行版,则可以使用包管理器进行安装,也可以通过pip进行安装。 与大多数其他库相似,C​​overage.py可以生成HTML和XML文件格式的报告。

由于它使用跟踪功能提取信息以生成报告,因此将其与任何其他测试库一起使用非常简单。

安装和运行报告

示例存储库中 ,我使用了Python的UnitTest库来创建一组简单的单元测试。 要运行测试套件,我将使用命令python setup.py test

要生成代码覆盖率报告,首先必须调用coverage run并将您要分析的python代码传递给它。 为此,我将运行coverage run setup.py test ,它将使Coverage.py执行并分析我的测试套件。 之后,覆盖率信息将可用,因此我现在可以运行coverage report ,该报告将覆盖率报告打印到STDOUT中。

这是一个看起来像的例子:

[simple-entity] coverage report                                                                                                                                                                     
Name                          Stmts   Miss  Cover
-------------------------------------------------
entities/__init__.py              0      0   100%
entities/tests/__init__.py        0      0   100%
entities/tests/test_user.py      12      1    92%
entities/user.py                  9      0   100%
-------------------------------------------------
TOTAL                            21      1    95%

您可以看到报告中包含四个文件。 总共有95%的代码覆盖率,因为entities/tests/test_user.py仅具有92%的代码覆盖率。 该测试适合与文本扫描工具一起使用,但不如HTML报告灵活。 这是HTML报告的示例:

如您所见,类似于PHPUnit报告,它显示了类中的语句数,测试运行了多少,未运行了多少,以及排除了多少。

Java

使用Java开发代码时,可以使用JUnitJaCoCo代码覆盖库等

该项目的文档指出JaCoCo是Java的免费代码覆盖库,由EclEmma团队创建。 JaCoCo应该为基于Java VM的环境中的代码覆盖率分析提供标准技术。 重点是提供一个轻量级,灵活且文档齐全的库,以与各种构建和开发工具集成。

JaCoCo支持以下方面的报告:

  • 指令范围
  • 分行覆盖
  • 圈复杂度
  • 单独的行(对于已使用调试信息编译的类文件)
  • 包含至少一条指令的非抽象方法
  • 课堂报道

而且,它可以与各种构建和开发工具集成在一起,包括Ant,Maven, EclipseNetBeansIntelliJ

JaCoCo支持以XMLHTMLCSV格式创建报告。 由于Java比大多数语言要复杂得多,而且比动态语言要复杂得多,因此有很多方法可以将JaCoCo与所选的应用程序结合使用。

相反,我将介绍如何使用Apache Maven运行测试套件。

安装Maven并在pom.xml中创建新项目之后,如果添加以下插件配置,则在从命令行调用man test时可以生成报告。

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>4.12</version>
    <executions>
        <execution>
            <id>prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
        <execution>
            <id>post-unit-test</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <!-- Sets the path to the file which contains the execution data. -->

                <dataFile>target/jacoco.exec</dataFile>
                <!-- Sets the output directory for the code coverage report. -->
                <outputDirectory>target/jacoco-ut</outputDirectory>
            </configuration>
        </execution>
    </executions>
    <configuration>
        <systemPropertyVariables>
            <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
        </systemPropertyVariables>
    </configuration>
</plugin>

此配置将JoCoCo 4.12作为项目插件加载,并将target/jacoco-ut为生成报告的目录。

如果打开target/jacoco-ut/index.html ,那么您将看到一个顶级报告,如下图所示,与其他语言HTML报告非常相似。

Java JoCoCo –顶层视图

这显示了顶级实体和文件夹的覆盖范围,报告了覆盖范围百分比,行,方法和类。 如果您深入研究类,则可以在该类中看到与该方法相同的信息,如下面的屏幕截图所示。

Java JoCoCo –功能级视图

而且,如果您深入研究一种方法,则可以看到其中涵盖的内容和未涵盖的内容,如下面的屏幕截图所示。

Java JoCoCo –文件可视化

就个人而言,我发现报告的结构没有像为其他许多软件包生成的报告那样经过深思熟虑。 但是,您会得到相同的信息。

Ruby

接下来,让我们看一下Ruby。 对于Ruby,有SimpleCov 。 要引用软件包的存储库,它是…

…Ruby的代码覆盖率分析工具。 它使用Ruby的内置Coverage库来收集代码覆盖率数据,但是通过提供干净的API来过滤,分组,合并,格式化和显示这些结果,使处理结果更加容易,从而为您提供了一个完整的代码覆盖率套件只需设置几行代码即可。

考虑到它使用Ruby的内置Coverage库,该库可与许多Ruby测试包一起使用,包括Test :: Unit / ShouldaCucumberRailsRSpec

但是,据我所知,与其他所涵盖语言的代码覆盖率不同,Ruby的内置覆盖率库功能并不丰富。 但是,它仍然提供LineFunctionMethodClassBranchPath覆盖范围的分析。

第二,它不会像其他格式那样以XML格式输出报告。 但是,它同时支持HTMLJSON 。 但是,您很快就会看到,HTML报告几乎具有与其他报告一样丰富的功能,并且JSON格式既轻巧又可扫描。

安装及使用

与Ruby中的大多数库和软件包一样,SimpleCov易于安装。 为此,您只需将gem 'simplecov', :require => false, :group => :test到您的Gemfile中,然后运行bundle install 。 要使用它,只需将以下两行添加到首选测试框架的配置文件中:

require 'simplecov'
SimpleCov.start

在开发本文的Ruby存储库的过程中,我将其与RSpec结合使用。 因此,我将其包含在RSpec生成的spec/spec_helper.rb文件的顶部。

报告范例

在运行bundle exec rspecbin/rspec —init ,SimpleCov会生成一组报告(与其他coverage库非常相似),并将它们存储在项目的coverage目录中。

SimpleCov HTML顶级覆盖率报告

您可以在上面的屏幕截图中看到,基于HTML的报告的输出与其他报告非常相似。 它列出了总体覆盖率水平,并显示了如何生成覆盖率百分比的细分。 对于报告中的每个文件,它都会列出其覆盖率,测试覆盖的行,未覆盖的行,等等。

SimpleCov HTML文件级覆盖率报告

同样,与其他HTML报表一样,您可以单击报表中的任何文件,以直观的方式查看测试覆盖了哪些行,而哪些行没有漏掉,或者用SimpleCov术语来说,漏掉了哪些行。

让我们看一下Go中的代码覆盖范围。 像Go中的许多内容一样,代码覆盖支持由其内置工具之一Go Cover本身提供。 作为Go 1.2的一部分发布,Cover工作于……

…在编译之前重写软件包的源代码,以添加工具,编译和运行修改后的源代码并转储统计信息。

Rob Pike在一篇有关Cover的出色文章中解释说,这是与许多报道工具所采用的方法不同的原因,因为…

…(标准方法)难以实施,因为对二进制执行的分析具有挑战性。 它还需要可靠的方式将执行跟踪绑定回源代码,这也可能很困难。 问题包括调试信息不​​正确,以及内联函数等使分析复杂化的问题。 最重要的是,这种方法是非常不可移植的。 由于调试支持在系统之间存在很大差异,因此需要针对每种体系结构以及在某种程度上针对每种操作系统重新进行此操作。

Cover以您期望的方式分析文件,并按LineFunctionMethodClassBranchPath覆盖范围进行分析。

安装及使用

由于Go Cover随Go 1.2一起提供,因此如果您安装了最新版本,它就已经可用。 要运行最基本的覆盖率分析,请在开发的程序包中运行以下命令:

go test -cover

对于为本文开发的示例Go存储库 ,它将以下输出呈现给STDOUT:

PASS
coverage: 100.0% of statements
ok      github.com/settermjd/simple-entity      0.010s

您可以看到它具有100%的覆盖率。 增加复杂性,我们可以通过运行以下命令生成覆盖率配置文件:

go test -coverprofile=coverage.out

此命令生成收集的统计信息并将其存储在coverage.out 。 然后我们可以通过运行以下命令分析输出:

go tool cover -func=coverage.out

对于存储库中的代码,将生成以下输出:

github.com/settermjd/simple-entity/user.go:7:   setName         100.0%
github.com/settermjd/simple-entity/user.go:11:  getName         100.0%
total:                                          (statements)    100.0%

在这里,您可以看到构成代码覆盖率的行和方法以及归因于它们的覆盖率的百分比。 最初打印到STDOUT时,该报告还可以通过运行以下命令以HTML格式获得:

go tool cover -html=coverage.out

您可以在下图中看到生成的报告。 与其他图书馆HTML报告一样,它显示的内容用绿色覆盖,而没有用红色覆盖。 布局略有不同,但最终结果是相同的。

转到Cover HTML文件级别覆盖率报告

结论

因此,这是对当今可用的五种最受欢迎​​的软件开发语言的代码覆盖范围的高级观察: GoPythonRubyPHPJava 。 无论是在分析的深度还是在报告功能上,某些库都具有比其他库更多的功能。 而且,有些比其他更容易入手。

但是,无论使用哪种语言进行开发,您都拥有足够多的代码覆盖支持来帮助您评估和提高测试质量。

我强烈建议您开始使用代码覆盖率分析(如果尚未开始的话),并将其集成到持续的集成和开发管道中。

您是否使用其他库? 是否有我未涵盖的功能? 在评论中分享您的反馈。

翻译自: https://www.javacodegeeks.com/2017/11/libraries-packages-code-coverage-ecosystem.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码覆盖生态系统的库和软件包 的相关文章

随机推荐

  • 与MySQL的零距离接触(三.函数、存储过程、引擎、图形化管理工具)

    金山竹影几千秋 云索高飞水自流 万里长江飘玉带 一轮银月滚金球 远自湖北三千里 近到江南十六州 美景一时观不透 天缘有分画中游 祝大家小年快乐 2018福气生财 一 运算符和函数 准备 连接数据库 mysql uroot proot P33
  • 专才or 通才

    前言 不知道大家有没有这样的感觉 现在的工作专业化程度越来越高 而且是细分方向越来越小 IT领域分到你是计算里面的数据库或者了流式计算引擎 或者是协议存储还是KV存储引擎 专业化的优势 专业化的程度带来了一个好处就是你在这个领域的深入程度越
  • Windows Server 2016虚拟机从零开始安装(超详细)

    目录 一 VMware Workstation虚拟机软件的下载 二 镜像文件的下载 三 Windows Server 2016虚拟机的创建 四 虚拟机系统安装 五 最后 一 VMware Workstation虚拟机软件的下载 官网下载入口
  • SpringData JPA 利用Case实现非规则排序

    开发时候客户需要将巡检单按照状态和开始时间排序 客户需求 但是在数据库中state的值不是正常排序的 审核不通过 5 待处理 0 处理中 1 待审核 3 完成 9 所以总结以下就是需要对象非规则排序 排序是先按照state属性以 5 0 1
  • 基于MATLAB的阔叶树叶片智能识别

    基于MATLAB的阔叶树叶片智能识别 根据叶片的形状 椭圆长轴短轴比 可以初步判断树种 为智能识别打下基础 本文方法是基于MATLAB的图像处理工具和数值计算功能 1 叶片照片的预处理 利用PS去掉背景 2 图像处理 彩色图像转灰度图像
  • 不使用任何框架实现CNN网络

    文章目录 一 问题描述 二 设计简要描述 三 程序清单 四 结果分析 五 调试报告 六 实验小结 一 问题描述 基于Numpy和函数im2col与col2im来实现一个简单的卷积神经网络 将其用于手写体识别 二 设计简要描述 机器学习的三个
  • 硬件入门之什么是mos管

    硬件入门之什么是mos管 文章目录 硬件入门之什么是mos管 一 mos管是什么 MOS管常用于 驱动大功率电路中 MOS选型参数 mos管调参数 二 实际应用场景 1 防反接保护电路 2 防过压保护电路 3 防反接防过压电路一体电路 4
  • Nginx的异步非阻塞

    1 同步与异步 同步与异步的重点在消息通知的方式上 也就是调用结果通知的方式 同步 当一个同步调用发出去后 调用者要一直等待调用结果的通知后 才能进行后续的执行 异步 当一个异步调用发出去后 调用者不能立即得到调用结果的返回 异步调用 要想
  • Druid(Druid.io)简单使用

    Druid简单使用 一 Druid服务进程 Historical进程 Historical进程用于处理历史数据的存储和查询 历史数据包括所以已经被committed的流数据 Historical进程从深度存储 Deep Storage 中下
  • [2020-11-30 ]国产化操作系统调研

    近期 因为公司业务需要 服务器更换为国产操作系统 所以对国产系统的发展进行了一些调研 首先是我国第一款国产操作系统 红旗 2000年成立北京中科红旗软件技术有限公司 2001年的时候 在北京市政府的采购招标中 微软被踢出局 红旗和金山成为了
  • yolo中 LoadImages, LoadScreenshots, LoadStreams

    LoadImages 功能 读取本地图片 视频 摄像头数据 参数说明 path 路径地址 图片文件夹 文件 视频文件夹 文件 或者两者混合都可以 img size resize 或者letterbox转换后的大小 stride letter
  • 基于Matlab的多目标生产调度问题求解方法

    基于Matlab的多目标生产调度问题求解方法 在生产过程中 为了提高生产效率和降低成本 常常需要将多个任务进行合理的安排 而多目标生产调度问题就是要在满足生产需求的前提下 同时最小化生产成本和生产时间等多个目标指标 针对这个问题 我们可以利
  • 鲍春健:从“走进客户”奔向“成为客户”

    站在当下来看 小鹅通的服务力的特殊性在于其可以穿透三层 即以自身的服务力赋能客户的服务力 其中 一层是客户 一层是客户的服务 一层是客户的客户 作者 斗斗 出品 产业家 累计终端用户数达8 2亿 最高日活1400万 累计创造的知识商品数达4
  • 5g网络架构_5G之核心网技术一-核心网网络架构及网元功能介绍

    本文的学习内容 包含前两节 5G总体情况 5G核心网网络架构及网元功能 5G核心网关键技术 5G核心网演进思路 5G网络畅想 采用通用硬件 一张网络满足多样化业务需求 网络平台级运营 灵活适配业务需求 满足能力开放 用户面部署下沉 减小业务
  • hadoop (1.0.4) Path 详解

    Path 对路径进行解析 将参数转换为标准的URI格式 对Path的参数作判断 标准化 字符化等操作 为了便于理解Path 各位可以先参看URI的详解 链接http www cnblogs com springside5 archive 2
  • Hbase 单机环境搭建

    大数据处理场景 比如我要想对十几亿数据进行排序 肯定不能放在关系型数据库排序 首当其冲就要想到一个能高效存储与高效读取的数据库 这里我想到了分布式数据库Hbase 今天我们就只讲下Hbase安装 后面会讲到数据读取出来了如何高效进行排序 H
  • LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置

    LeetCode 34 在排序数组中查找元素的第一个和最后一个位置 解题思路 这里先使用二分法寻找到第一个位置 在从第一个位置开始挨个 循环 寻找最后一个位置 当然 最后一个位置也可以使用二分的方法完成 代码实现 class Solutio
  • Echarts中国地图的china.js下载

    今天用到了Echarts的中国地图map 但Echarts官网的地图js已经停止提供下载了 找了下其他的链接放到这里 一些其他会用到的js文件也在里面可以找到 省的下次用现找 https github com apache incubato
  • Linux 搭建Redis 哨兵集群

    目录 1 安装环境 2 下载安装包 3 安装依赖环境和编译 4 启动 5 集群搭建 6 启动哨兵 7 设置开机自启动 8 redis卸载 1 安装环境 阿里云centos7 9版本 2 下载安装包 地址 Index of releases
  • 代码覆盖生态系统的库和软件包

    如果您已经编写了测试驱动的代码已有一段时间了 那么您将了解代码覆盖率 也称为测试覆盖率 如果您不熟悉该术语 则有两个简短定义 维基百科将其定义为 一种度量 用于描述特定测试套件运行时程序源代码的执行程度 根据Martin Fowler的说法