Java Test: Specification and Structure Testing(line, branch, path coverage)

这篇具有很好参考价值的文章主要介绍了Java Test: Specification and Structure Testing(line, branch, path coverage)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章梳理一下Java软件测试中的Secification test和Structure test。

Specification Test

规范测试(specification test):又称黑盒测试(black-box testing)或需求驱动测试(requirements-driven testing),这种测试方法关注程序的功能和性能,而不关注其内部实现。

Specification(规范)是对软件组件、系统或方法的详细描述,它定义了预期的功能、行为和性能。通常包括以下内容:

  1. 每个参数:描述方法的输入参数,包括数据类型、取值范围和参数的作用。
  2. 返回值:描述方法的输出结果,包括数据类型、取值范围和返回值的含义。
  3. 每个异常(检查和未检查):列出可能抛出的异常,以及在什么情况下会抛出这些异常。
  4. 方法的功能和行为,包括: a. 主要目的:描述方法的核心功能和作用。 b. 副作用:说明方法在执行过程中可能产生的其他影响或结果。 c. 线程安全性问题:描述方法在多线程环境中的表现和潜在问题。 d. 性能问题:阐述方法的性能特点,如时间复杂度、空间复杂度或其他性能指标。

总之就是除了实现细节之外,specification里基本都有了,这样子我们就可以仅通过这个specification来进行测试,不管其内部是如何实现的。比如在下面的例子中,我们只需要对功能前面的Docstring Specification来进行展开测试即可。

class RepeatingCardOrganizer {
 ...
 /**
 * Checks if the provided card has been answered correctly the required 
number of times.
 * @param card The {@link CardStatus} object to check.
 * @return {@code true} if this card has been answered correctly at least 
{@code this.repetitions} times.
 */
 public boolean isComplete(CardStatus card) {
 // IGNORE THIS WHEN SPECIFICATION TESTING!
 }
}

另外,有一个叫边界测试(Boundary Value Testing)在基于规范的测试(Specification Testing)中是非常重要的,比如说有一个文档写着如果我们拥有的金额大于价格我们就购买成功,否则购买失败,那么这个时候要进行specification testing就必须要把这个boundary也就是金额恰等于价格的边界情况考虑进去,因为实际应用中,许多软件缺陷和错误都是由边界条件引起的,在基于规范的测试中进行边界测试是非常有必要的。

Structural Test

结构测试(structure test):又称白盒测试(white-box testing)或逻辑驱动测试(logic-driven testing),这种测试方法关注软件的实现,优化各种代码覆盖率,如行覆盖(line coverage)、语句覆盖(statement coverage)、数据流覆盖(data-flow coverage)等。测试者需要了解代码的实现细节以设计测试用例。

对于各种不同的覆盖指标,如Statement coverage(又叫line coverage), Branch Coverage, Path coverage等,用下面一个代码例子来说明:

public boolean pay(int cost, boolean useCredit) {
 if (useCredit) {
     if (enoughCredit) {
     return true;
     }
 }
 if (enoughCash) {
     return true;
     }
 return false;
}

1. Statement coverage(语句覆盖/行覆盖)

这个其实最好理解,就是写的测试一共能让多少行代码以及哪些语句被执行。根据被执行语句的覆盖程度来判断测试的完成度。在这里我们只需要写3个测试用例就能全部覆盖上面的语句。它们分别是:

1 useCredit : True, enoughCredit: False, enoughCash: anyValue. 

2 useCredit : False, enoughCredit: anyValue, enoughCash: True.

3 useCredit : False, enoughCredit: anyValue, enoughCash: False.

2. Branch Coverage(分支覆盖)

这种覆盖率指标关注代码中的条件结构(如 if-else 语句和 switch 语句)。分支覆盖度量测试用例是否覆盖了代码中所有可能的条件分支。相较于语句覆盖,分支覆盖提供了更全面的测试质量评估,因为它确保了代码中的每个条件分支都得到了测试。比如在上面的Statement coverage中,当进入到了if (useCredit) 分支后,对于 if (enoughCredit) 不成立的情况我们并没有测试到,虽然程序中没有写else语句,但这一分支是实际存在的,我们同样需要测试到,因此我们要在上面的测试用例基础上再加一条: useCredit : True, enoughCredit: False, enoughCash: True. 这样一共4个测试用例就达到了所有分支branches的覆盖。

3. Path coverage(路径覆盖)

然而,分支覆盖仍然不能保证覆盖所有可能的执行路径。Path coverage(路径覆盖)是一种更高级的代码覆盖率指标,用于评估测试用例是否覆盖了代码中所有可能的执行路径。路径覆盖涉及到所有条件、循环和函数调用的组合。理论上,路径覆盖率可以确保对软件进行了最全面的测试,但在实践中,路径覆盖率可能难以实现,因为复杂的代码可能包含大量的执行路径,使得覆盖所有路径变得不切实际。具体Path coverage都需要哪些测试用例呢?用图来表示最简单,我们根据代码的实现细节,知道一共有以下所有情况:

Java Test: Specification and Structure Testing(line, branch, path coverage)

要实现100%的路径覆盖,我们只需要从上往下把所有可能的路径都走一遍,你会发现一共有5条不同的路,也就分别对应了5个不同的测试用例,比刚刚又多加了一条,这样一来就完成了100%的路径覆盖Path coverage了。

基于这个例子,对几种不同的代码覆盖率指标的小结图表:

Java Test: Specification and Structure Testing(line, branch, path coverage)

小结

这篇文章讲了两大类不同的测试方式:specification testing以及structural testing。对于前者讲了一下概念以及当中特别重要的boundary value testing;对于后者也讲了定义外加梳理了一下几种不同的代码覆盖率指标以及例子。文章来源地址https://www.toymoban.com/news/detail-433421.html

到了这里,关于Java Test: Specification and Structure Testing(line, branch, path coverage)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring Boot Testing: 使用springboot-test提供的测试框架来实现自动化测试

    作者:禅与计算机程序设计艺术 软件测试是在开发过程中不可缺少的一环。单元测试、集成测试、功能测试等都是为了保证系统的质量而进行的测试活动。单元测试主要验证各个模块(类、方法)在各种情况下是否正常工作;集成测试则是将不同模块组合起来看是否可以正常

    2024年02月07日
    浏览(10)
  • Testing Angular, VueJS, and React Components with Jest

    作者:禅与计算机程序设计艺术 在过去的几年里,React、Angular和Vue等前端框架都获得了越来越多开发者的青睐,并且取得了不俗的成绩。这些前端框架的出现给前端开发领域带来了许多新鲜的机会。特别是在面对复杂业务需求时,测试驱动开发(TDD)方法对于保证项目质量至

    2024年02月06日
    浏览(5)
  • 单元测试:Testing leads to failure, and failure leads to understanding

    单元测试:Testing leads to failure, and failure leads to understanding

    单元测试的概念可能多数读者都有接触过。作为开发人员,我们编写一个个测试用例,测试框架发现这些测试用例,将它们组装成测试 suite 并运行,收集测试报告,并且提供测试基础设施(断言、mock、setup 和 teardown 等)。Python 当中最主流的单元测试框架有三种,Pytest, nos

    2024年01月17日
    浏览(9)
  • 使用八叉树模拟水和烟雾 Simulating Water and Smoke with an Octree Data Structure 论文阅读笔记

    使用八叉树模拟水和烟雾 Simulating Water and Smoke with an Octree Data Structure 论文阅读笔记

    原文: Losasso, Frank, Frédéric Gibou, and Ron Fedkiw. “Simulating water and smoke with an octree data structure.” Acm siggraph 2004 papers. 2004. 457-462. 这篇文章扩展了 [Popinet 2003] 的工作,拓展到表面自由流,并且使得八叉树不受限制 自适应网格划分的一个缺点是,它的模板不是均匀的,进而导致泊

    2024年02月19日
    浏览(7)
  • 【Git】删除本地分支;报错error: Cannot delete branch ‘wangyunuo-test‘ checked out at ‘XXX‘

    【Git】删除本地分支;报错error: Cannot delete branch ‘wangyunuo-test‘ checked out at ‘XXX‘

    目录 0.环境 1.问题描述 2.解决步骤 1)使用命令切换到其他分支 2)查看当前本地所有分支 3)删除“wangyunuo-test”分支 windows 11 64位 + Git + VScode跑代码 在做项目过程中,想删除一个本地分支“wangyunuo-test”,使用的是以下的命令删除(目前我在这个分支上) 但是删除后会报错

    2024年02月09日
    浏览(10)
  • Python学习-流程图、分支与循环(branch and loop)

    Python学习-流程图、分支与循环(branch and loop)

    1、流程图(Flowchart) 流程图是一种用于表示算法或代码流程的框图组合,它以不同类型的框框代表不同种类的程序步骤,每两个步骤之间以箭头连接起来。 好处: 1)代码的指导文档 2)有助于规划高效率的程序结构 3)便于与他人交流 流程图的思维是至上往下走的,线性逻

    2024年02月21日
    浏览(9)
  • mac os系统升级pycharm报Invalid path to Command Line Tools解决办法

    mac os系统升级pycharm报Invalid path to Command Line Tools解决办法

    问题: mac os系统升级后,pull/push代码时git报错,报错内容: 解决办法: 1、首先检查是否你的机器安装了Git,如果没有安装,则安装 2、执行 xcode-select --install 命令 如果上述两步还不行,则需要修改idea中Git路径的配置,在shell终端输入 which git 查看git的路径: 如图: 3、完成

    2024年02月16日
    浏览(13)
  • 【git报错】The current branch dev has no upstream branch. To push the current branch and set the remote

    【git报错】The current branch dev has no upstream branch. To push the current branch and set the remote

    发现问题 本地新建了一个dev分支,然后把dev分支下的代码push到远程仓库中,使用git push,但是报错了,如下: fatal: The current branch dev has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin dev 翻译 错误:当前分支:dev没有远程对应的dev分支

    2024年02月11日
    浏览(13)
  • 论文阅读《GlueStick: Robust Image Matching by Sticking Points and Lines Together》

    论文阅读《GlueStick: Robust Image Matching by Sticking Points and Lines Together》

    论文地址:https://arxiv.org/abs/2304.02008 源码地址:https://github.com/cvg/GlueStick   针对视角变化时在闭塞、无纹理、重复纹理区域的线段匹配难的问题,本文提出一种新的匹配范式(GlueStick),该方法基于深度图神经网络将点、线的描述符统一到一个框架中,利用点之间的信息将

    2024年02月08日
    浏览(12)
  • Git常见问题记录:git出现“Your branch and ‘origin/master‘ have diverged”的解决方法【详细解释】

    Git常见问题记录:git出现“Your branch and ‘origin/master‘ have diverged”的解决方法【详细解释】

    说明您的本地子分支和master主分支已经分叉, 有冲突 产生! 如果 不需要保留 本地的修改,只要执行下面两步: 命令解析: git fetch :命令用于从远程获取 master 主分支的最新代码库,并没有合并的操作; git reset --hard :命令用于把本地分支代码,强制回退为 master 主分支的

    2024年04月16日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包