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

news2024/9/25 17:15:20

这篇文章梳理一下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都需要哪些测试用例呢?用图来表示最简单,我们根据代码的实现细节,知道一共有以下所有情况:

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

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

小结

这篇文章讲了两大类不同的测试方式:specification testing以及structural testing。对于前者讲了一下概念以及当中特别重要的boundary value testing;对于后者也讲了定义外加梳理了一下几种不同的代码覆盖率指标以及例子。

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

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

相关文章

B树(B-tree、B-树)理论详解

文章目录 基本概念n阶B树的性质(n>2)B树的搜索B树元素的添加上溢出解决 删除删除叶子节点删除非叶子节点删除——导致下溢出删除——解决下溢出方法一删除——解决下溢出方法二 MongoDB 基本概念 B树是为磁盘或其他直接存取的辅助存储设备而设计的一…

Gitlab on k8s最佳实践

文章目录 gitlab on k8sGitLab部署helm 安装 postgresqlhelm 安装 redis 集群gitlab manifest 部署gitlab如何上传项目?gitlab监控metricsgitlab runner helm 部署helm部署问题k8s中gitlab exector架构图what is Gitlab Runner Helper?gitlab如何连接上k8s&#xf…

【Windows】关闭Windows Update自动更新

目录 一 服务中关闭Win10自动更新及关联服务 二 注册表中关闭Win10自动更新 三 组策略中关闭Win10自动更新 四 计划任务中关闭Win10自动更新 电脑系统盘不够用了,为此准备关闭Windows Update自动更新,以节省空间。为保证关闭之后不死灰复燃&#xff…

Ajax入门

在B/S架构中,浏览器端发送请求的传统方式如下: 1.直接在浏览器地址栏上输入url 2.超链接 3.from表单 4.在JavaScript代码中发送请求 1)window.open(url) 2)document.location.href url 3)window.location.href url ……

优思学院|精益生产在制药行业的应用情况如何?

精益生产作为一项优化生产过程、提高效率的方法论,精益生产在制药行业得到了广泛应用。其核心理念是通过消除浪费,不断改进生产流程,实现资源的最大化利用和生产成本的最小化,从而提高企业的竞争力和市场占有率。 在制药行业&…

Java语言----LinkedList 和 链表的实现

目录 一.链表概念 二.链表的分类 三.无头单向非循环链表的实现 3.1创建简单链表 3.2 链表基本方法实现 3.3四大基本功能 3.3.1.增加元素结点 3.3.2.查找元素结点 3.3.3.删除元素结点 3.3.4.结点信息修改 四.LinkedList是什么? 五.LinkedList使用方法 总结 …

蓝牙耳机哪款性价比高?2023蓝牙耳机性价比排行

随着蓝牙耳机的使用愈发频繁,蓝牙耳机产品也越来越多,蓝牙耳机的功能、价格、外观设计等都不尽相同。接下来,我来给大家推荐几款性价比高的蓝牙耳机,感兴趣的朋友一起来看看吧。 一、南卡小音舱Lite2蓝牙耳机 参考价&#xff1a…

unity,如何让当前物体获取鼠标位置,转向鼠标在屏幕中的位置?

介绍 unity,如何让当前物体获取鼠标位置,转向鼠标在屏幕中的位置? 方法 void Update() {// 获取鼠标在屏幕上的位置Vector3 mousePos Input.mousePosition;// 将鼠标在屏幕上的位置转换为世界空间中的位置Vector3 worldPos Camera.main.S…

C++11多线程join()和detach()的理解

简介 每一个程序至少拥有一个线程,那就是执行main()函数的主线程,而多线程则是出现两个或两个以上的线程并行运行,即主线程和子线程在同一时间段同时运行。而在这个过程中会出现几种情况: 主线程先运行结束子线程先运行结束主子…

NLP实战:基于Pytorch的文本分类入门实战

目录 一、前期准备 1.环境准备 2.加载数据 二、代码实战 1.构建词典 2.生成数据批次和迭代器 3. 定义模型 4. 定义实例 5.定义训练函数与评估函数 6.拆分数据集并运行模型 三、使用测试数据集评估模型 四、总结 这是一个使用PyTorch实现的简单文本分类实战案例。在…

MySQL_1 数据库的基本操作

目录 一、拾枝杂谈 1.cmd验证MySQL服务 : 2.cmd连接MySQL服务 : 3.MySQL服务 : 二、数据库介绍 1.定义 : 2.SQL语句分类 : 三、数据库操作 1.数据库的创建 : 1 基本语法 2 演示 2.数据库的删除 : 1 基本语法 2 演示 3. 数据库的查询 : 1 基本语法 2 演示 4.数据库的…

【youcans 的 OpenCV 学习课】21. Haar 小波变换

专栏地址:『youcans 的图像处理学习课』 文章目录:『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】21. Haar 小波变换 1. 小波变换1.1 小波变换基本概念例程 17_1:常用小波族的图像 1.2 连续小波变换1.3 离散小波变换&a…

《通过十几轮数据进行模型训练,实现精确的无创血糖测量的演绎学习》阅读笔记

目录 0 演绎学习 1 论文摘要 2 论文十问 3 论文亮点与不足之处 4 与其他研究的比较 5 实际应用与影响 6 个人思考与启示 参考文献 0 演绎学习 在本文中,DL指的是Deduction Learning,即演绎学习方法。该方法是一种机器学习方法,通过使…

ServerPapers 开源轻量级服务器监控工具

ServerPapers 开源轻量级服务器监控工具 起因 之前用过一些服务器监控工具,但是有些配置复杂不够方便。也有些配置简单,但没有我想要显示的一些信息。所以我就花了三天时间自己写了一个开源的轻量级服务器监控工具。 项目 介绍 ServerPapers是一个基…

聚观早报|苹果版余额宝四天吸金69亿;​微软拟推出私有版ChatGPT

今日要闻:苹果版余额宝四天吸金69亿元;称微软拟推出私有版ChatGPT;特斯拉上调Model 3、Model Y售价;好莱坞编剧将举行15年来首次罢工;字节跳动要在美国卖书了 苹果版余额宝四天吸金69亿元 早些时候,苹果推…

自动驾驶TPM技术杂谈 ———— I-vista验收标准(试验规程)

文章目录 术语介绍试验准备场地要求环境要求精度要求边界车辆&路沿石 试验方法能力试验双边界车辆平行车位白色标线平行车位双边界车辆垂直车位白色标线垂直车位方柱垂直车位双边界车辆斜向车位白色标线斜向车位 新功能评价平行车位远程操控泊入泊出试验垂直车位远程操控泊…

用户界面对象的线程亲缘性第二篇: 设备上下文

在上一篇文章中,我们简单地介绍了控制窗口句柄的线程亲缘性规则。 今天,我们来讲讲设备上下文(Device Context, 简称 DC) 。 设备上下文也有一定程度的线程亲缘性。调用 DC 相关函数,例如 GetDC 的线程,必须在同一个线程中调用其…

VC++判断Windows系统是Win7、Win8,还是Win10系统(附源码)

有时候我们需要获取操作系统版本,比如win7、win8、win8.1、win10等,对不同版本的系统做特殊处理。有时我们还需要分辨当前系统是64位的,还是32位的。 1、系统API函数GetVersionEx已经被废弃,不能再使用了 以前我们一般使用系统API函数GetVersionEx去获取操作系统版本,但从…

B016_单行函数篇

2022年4月14日08:25:25 通过本章学习,您将可以: SQL中不同类型的函数 在 SELECT 语句中使用字符,数字,日期和转换函数 使用条件表达式术语 函数-预定义的接受参数的代码块单行函数-为每条记录返回一行结果多行函数-返回一个结果,每组数据处理什么是SQL函数 多行函数也叫…

【Redis—主从复制】

概念 如果把数据都存储到一台服务器上,当服务器出现宕机后,数据会丢失。而把数据备份到多台服务器上,那么当一台服务器发生故障后,其他服务器仍然可以继续提供服务。由于是多台服务器,所以服务器之间的数据要保持一致…