编写软件时,代码中必然会出现错误。 这可以是语法错误、逻辑错误、运行时错误、性能错误、数据错误或更糟的形式。
编写软件时几乎无处不在的错误使得软件测试成为软件开发中的一个重要步骤。 正确有效的测试不仅会产生满足用户需求的高质量软件,而且会产生符合法规且几乎没有或没有可被攻击者利用的漏洞的软件。
软件测试可以采用自动化测试、单元测试、集成测试或通过系统测试来测试整个软件的形式。
然而,在软件过程中出现的一个重要问题是您如何确定您的软件是否已经过全面测试。 您在软件上运行的测试是否足够?
您是否对软件的所有部分进行了全面测试,或者是否有一些代码根本没有经过测试?
做软件测试的时候肯定会出现这样的问题,这也是代码覆盖率如此重要的原因。
代码覆盖率是一种软件测试指标,它告诉您有多少代码已被执行,并因此通过在您正在测试的软件上运行的测试进行了测试。 代码覆盖率结果以百分比表示。
此百分比显示您对代码运行的测试覆盖了多少代码。 例如,如果您运行测试并返回 60% 的代码覆盖率,这意味着您编写的测试未覆盖 40% 的代码,因此未经测试的代码中可能存在错误和漏洞。
出于这个原因,代码覆盖率允许您分析您在软件上运行的测试的有效性和完整性。 这样做的好处是可以确保软件在发布之前经过适当和全面的测试。 这减少了生产软件中可能影响用户使用软件体验的软件错误。
尽管 100% 的代码覆盖率并不一定意味着您编写的软件完全没有错误,但您希望以高代码覆盖率为目标,以确保对软件进行高效测试。
在航空航天和医药等关键行业,软件错误可能导致死亡,法规要求在测试期间 100% 的软件覆盖率。
代码覆盖率指标的类型
在测试软件时可以测量多种类型的代码覆盖率指标。 他们包括:
- 语句覆盖率——测量源代码中已在测试期间执行的可执行语句的百分比。
- 函数覆盖率——测量在测试期间调用的已定义函数的百分比。
- 分支覆盖率——测量从源代码中的所有决策点执行的分支或可能路径的百分比。 它用于确保由决策控制结构(如 if、switch 语句和 if else 语句)产生的所有分支都经过全面测试。
- 条件覆盖率——测量已针对真值和假值进行测试的布尔表达式的百分比。
- 循环覆盖率——测量在测试期间执行的源代码中循环的百分比。
- 路径覆盖率——衡量源代码中所有可能的执行路径已被测试的百分比。
上述指标通常包含在代码覆盖率报告中。
代码覆盖最佳实践
在进行代码覆盖时,推荐了某些最佳实践,以确保代码覆盖的有效性和质量。 他们包括:
有明确的覆盖目标
在进行的任何软件测试中,为每个适当的测试覆盖率指标设置目标覆盖率百分比。 这不仅有利于提供明确的测试目标,而且还可以通过指导团队努力增加代码覆盖率来帮助减少软件中的缺陷。 它还有助于确保软件测试在软件开发过程中得到应有的重视。
关注测试质量
需要注意的是,代码覆盖率仅显示已测试代码的百分比,并不显示代码是否已正确测试或软件是否无错误。 因此,与其简单地专注于使代码覆盖率接近 100%,不如将重点放在编写质量和有效的测试上,以正确测试软件并增加价值。
在频繁更改的代码中增加代码覆盖率
虽然在大型项目中实现高代码覆盖率数字可能很困难,但可以努力确保代码覆盖率随着时间的推移变得更好。
做到这一点的一个好方法是要求对项目代码库进行的每次新提交都具有超过 90% 的高代码覆盖率。
强制执行提交级别的代码覆盖率不仅现实可行,而且可以确保对软件所做的任何新更改都具有出色的代码覆盖率。
测量和分析代码覆盖率数据
利用从代码覆盖率中获得的结果来确定仍然需要测试的区域,并指导未来的测试工作,优先考虑代码覆盖率低的区域。
分析代码覆盖率数据以识别应用程序中尚未测试的关键区域,并指导您全面测试未测试的关键区域。 使用代码覆盖率数据来改进软件并确定软件的优先级,可以生成经过更好测试且缺陷更少的软件。
代码覆盖率与测试覆盖率
虽然两者都用于确定测试的有效性,但代码覆盖率和测试覆盖率在它们的使用和它们测量的内容上是根本不同的。
测试覆盖率是一种度量标准,用于确定书面测试覆盖软件需求的程度。 它涉及测试每个软件需求,它有助于确定软件在满足其需求方面的测试情况。
测试覆盖率结果显示已测试的软件需求的百分比。 测试范围通常由质量保证专业人员完成。
另一方面,代码覆盖率是一种软件测试指标,用于确定已由书面测试执行的源代码的百分比。
代码覆盖率的结果显示了编写的单元测试执行了源代码中的语句、函数、路径、循环、分支和条件的程度。 代码覆盖率用于评估编写的测试覆盖源代码的程度,通常由软件开发人员完成。
代码覆盖率是进行软件测试时要衡量的重要指标。 以下是一些可帮助您提高代码覆盖率的工具:
三叶草
Clover 是一个开源代码覆盖工具,最初由 Atlassian 开发,Atlassian 是一家为软件开发团队开发产品的澳大利亚软件公司。 该工具完全用 Java 编写,可以在满足 Java 运行时环境要求的任何操作系统上运行。
Clover 可用于对用 Java、Groovy 或 AspectJ 编程语言编写的代码执行代码覆盖。 支持JUnit、TestNG、Spock等测试框架,也可与IntelliJ IDEA、Eclipse等IDE集成。
Clover 可用于测量代码覆盖率指标,例如方法、语句、分支、全局和每次测试的覆盖率。
从代码覆盖率练习中,它可以生成高度可配置的 HTML 报告,显示代码覆盖率结果以及软件中的最高风险区域,并可用于测试优化。
还可以生成 PDF、XML、JSON 或纯文本格式的报告。 clover 的主要优点是它可以与许多不同的工具集成,并且正在积极开发和改进。
雅可可
JaCoCo 是由 EclEmma 团队开发的 Java 编程语言的免费代码覆盖率库。 该库在 EclEmma 中实现,EclEmma 是用于 Eclipse IDE 的免费 Java 代码覆盖工具。
JaCoCo 提供了丰富的覆盖率分析,其结果会立即在 Java 源代码编辑器中进行总结和突出显示,并允许用户将覆盖率结果向下钻取到方法级别。
结果使用可自定义的颜色代码显示,突出显示已完全、部分或尚未被源代码上运行的测试覆盖的代码行。 它允许合并和考虑不同的测试运行,以达到源代码的总代码覆盖率。
JaCoCo 是一种轻量级工具,不需要修改您的项目或执行任何其他设置即可用于代码覆盖率分析。
科贝图拉
Cobertura 是一个免费的开源 Java 代码覆盖工具,它基于 Jcoverage,可以单独使用,也可以通过 Ant 脚本或 Maven 插件使用。 通过 Maven 插件使用它是使用 Cobertura 进行代码覆盖的最常见方式。
Cobertura 测量在 Java 源代码上运行的测试所执行的行或分支的百分比。 它提供了一些指标,例如显示测试期间执行的语句百分比的行覆盖率,以及显示测试期间覆盖的分支百分比的分支覆盖率。
它还显示了随着 Java 代码中分支数量的增加而增加的复杂性因素。
代码覆盖率结果以 HTML 或 XML 格式显示,显示源代码的哪些部分没有经过测试。 除了显示测试覆盖率结果外,Cobertura 还可用于定位未测试的代码和错误,以及识别无法访问的代码。
伊斯坦布尔
Istanbul 是一个支持 ES6+ 的 JavaScript 代码覆盖率工具。 这个工具可以使用节点包管理器作为开发依赖项安装在任何 Javascript 项目中。
Istanbul 提供代码覆盖率指标,例如语句、分支、函数和行覆盖率。 它还显示源代码中未被测试覆盖的行。 它通过向您的 JavaScript 代码添加行计数器来实现这一点,以便它可以跟踪您的单元测试执行源代码的程度。
Istanbul 的代码覆盖率结果可以在终端或以 HTML 的形式输出。 此外,伊斯坦布尔还支持生成子流程的应用程序、Babel 和 TypeScript 项目的源映射覆盖。
Pytest-cov
Pytest-cov 是一个免费的 Python 插件,用于为 Python 代码生成代码覆盖率报告。 它使用 Python 的包安装程序 Pip 安装,并通过命令行操作。
它的代码覆盖率报告显示了您的 Python 项目中的语句,那些未被测试覆盖的语句,并且它提供了一个测试覆盖率百分比,显示了您的 Python 代码被测试覆盖的百分比。
Pytest-cov 提供子进程支持、xdist 支持和一致的 pytest 行为。 Pytest-cov 在进行测试时的默认行为是删除现有的覆盖率数据文件,以确保为每个新测试运行提供新的和干净的数据。 但是,它还允许用户结合之前测试运行的代码覆盖率测试结果。
覆盖率.py
Coverage.py是Python程序的代码覆盖工具,使用pip安装在项目中。
默认情况下,它测量行或语句覆盖率并提供显示程序中的语句数、测试遗漏的语句数以及测试覆盖率的百分比的结果,它还显示 Python 源代码中遗漏的行数测试。 但是,它仍然可以配置为测量 Python 程序中的分支覆盖率。
Coverage.py 也可用于判断哪些测试运行了源代码中的哪些行。 它的代码覆盖率报告可以在终端中呈现,也可以以 HTML、XML、JSON 和 LCOV 格式呈现。
简单冠状病毒
SimpleCov 是 Ruby 编程语言的强大代码覆盖工具。 它利用 Ruby 的内置覆盖率库收集相关数据,用于在运行测试后确定代码覆盖率。
SimpleCov 最好的地方在于它对代码覆盖率结果的呈现。 它还合并了不同类型测试的结果,以便生成的报告显示所有已完成测试的结果,从而可以轻松识别代码中未测试的部分。
它还使用颜色代码格式化源代码,这些颜色代码可以很容易地用于识别代码的测试和未测试部分。 默认情况下,SimpleCov 测量并报告测试的线路覆盖率。 但是,它可以配置为测量和报告所执行测试的分支覆盖率。
隐藏的很好
Deep Cover 是用于 Ruby 代码的准确代码覆盖工具。 它通过确保一条线路仅在完全执行而不是部分执行时才被视为被覆盖,从而提供更准确的线路覆盖报告。
此外,它还提供对节点和分支覆盖的支持,可以选择使用这些覆盖来查明是否有一些分支未被测试采用。
Deep Cover 不仅易于使用且无需配置,而且可以使用其他代码覆盖工具(例如 Ruby 内置的代码覆盖库或 SimpleCov)将其集成到项目中。 在这种情况下,Deep Cover 仅在代码行中的所有内容都已完全执行时才将行标记为已执行,从而使工具更加严格。
结论
尽管更高的代码覆盖率不一定会产生无错误的软件,但它是测试软件时需要考虑的一个关键指标。 代码覆盖率对于评估编写的测试实际测试软件源代码的程度很重要。
此外,在测试过程中致力于提高代码覆盖率会产生经过更好测试的软件,这些软件在生产中更不容易出错。 要在测试软件时执行代码覆盖,请考虑使用本文中建议的工具。
您还可以探索基于云的负载测试工具。