【白盒测试】单元测试的理论基础及用例设计技术(6种)详解

目录

🌞前言

🏞️1. 单元测试的理论基础

🌊1.1 单元测试是什么

🌊1.2 单元测试的好处

🌊1.3 单元测试的要求

🌊1.4 测试框架-Junit4的介绍

🌊1.5 单元测试为什么要mock

🏞️2. 单元测试用例设计技术(6种)

🌊2.1 语句覆盖

🌊2.2 判定覆盖【也称分支覆盖】

🌊2.3 条件覆盖

🌊2.4 判定条件覆盖

🌊2.5 组合覆盖

🌊2.6 路径覆盖


🌞前言

白盒测试【也称透明盒测试、结构测试或逻辑驱动测试

  • 定义: 白盒测试是把测试对象看作一个透明白色的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。
  • 目的: 白盒测试旨在验证程序的内部逻辑是否正确,检查代码覆盖率,并找出可能存在的编程错误、逻辑错误和性能问题。
  • 测试对象: 白盒测试通常由开发人员或专业的测试工程师执行,他们具有编程和软件设计方面的专业知识。
  • 测试方法: 白盒测试通常使用技术性的测试方法,如语句覆盖、分支覆盖、路径覆盖等,以确保对代码的各个部分进行了充分的测试。

黑盒测试【也称功能测试或规格驱动测试

  • 定义: 黑盒测试是把测试对象看作一个黑色不透明的盒子,在不考虑程序内部结构和实现细节的情况下设计和执行测试用例的过程。测试者只关注输入和输出之间的关系,而不考虑内部工作原理
  • 目的: 黑盒测试旨在验证软件的功能是否符合规格说明和用户需求,检查系统的功能完整性和正确性。
  • 测试对象: 黑盒测试通常由测试人员执行,不用了解系统的内部实现细节,只根据需求文档和功能规格进行测试。
  • 测试方法: 黑盒测试通常使用功能性测试方法,如等价类划分、边界值分析、场景测试等,以验证系统的功能是否符合预期。

综上,白盒测试和黑盒测试的主要区别在于测试者对系统内部结构的了解程度。白盒测试关注程序内部逻辑和代码覆盖率,而黑盒测试则关注系统的功能和用户体验。


🏞️1. 单元测试的理论基础

🌊1.1 单元测试是什么

单元测试是软件开发中的一种测试方法(由开发者编写),对程序中的最小可测试单元(通常是函数、方法或类)进行检查和验证。通常一个单元测试是由于判断每个特定条件(或场景)下某个特定函数的行为。


🌊1.2 单元测试的好处

  • 测试更充分:单元测试属于白盒测试
  • bug修复代价最少
  • 代码自review
  • 代码功能更具易用性
  • 回归测试
  • 快速定位bug

🌊1.3 单元测试的要求

  • 全自动执行
  • 独立
  • 可重复执行
  • 需要维护

🌊1.4 测试框架-Junit4的介绍

JUnit 4 中常用的注解包括:

  • @Test: 用于标识测试方法。
  • @Before: 标识在每个测试方法之前需要执行的方法。
  • @After: 标识在每个测试方法之后需要执行的方法。
  • @BeforeClass: 标识在测试类加载时需要执行的方法。
  • @AfterClass: 标识在测试类销毁时需要执行的方法。
  • @Ignore@Ignore("reason"): 标识忽略测试方法,可以附带原因说明。
  • @RunWith: 指定测试运行器,如 @RunWith(Parameterized.class) 用于参数化测试。
  • @Rule: 用于创建测试规则,如 @Rule public ExpectedException exception = ExpectedException.none() 用于测试异常。

Junit4的单元测试用例的执行顺序

@BeforeClass->@Before->@Test->@After->@AfterClass

每个测试方法的调用顺序

@Before->@Test->@After


🌊1.5 单元测试为什么要mock

单元测试中使用 Mock 的主要目的是解决测试环境的依赖性和复杂性。

  1. 提高测试用例的速度: 在单元测试中,有时无法直接访问外部依赖,或者外部依赖的操作会耗费较长时间。通过 Mocking,可以避免真实的外部调用,从而提高测试的速度。

  2. 解除外部依赖:从而将测试的焦点放在被测试组件本身,而不受外部依赖的影响。比如数据库、第三方接口等,使测试用例可以独立运行。

  3. 减少工作量:减少编写测试用例的工作量,提高效率。

综上,使用 Mock 是为了更好地隔离测试目标、消除测试环境的不确定性、提高测试速度、模拟异常情况以及降低测试成本,从而使单元测试更加简单、可靠和高效。


🏞️2. 单元测试用例设计技术(6种)

单元测试用例设计技术可分成大致6种,由弱至强,工作量由低到高:

  • 语句覆盖:程序中每条语句至少被执行一次。
  • 判定覆盖【也称分支覆盖:确保每个分支的两个可能的结果都被至少一次执行。即每个判断的取真、取假至少执行一次。
  • 条件覆盖:每一个判断中的每个子句的不同true  false都要取一次。
  • 判定条件覆盖:确保每个分支的两个可能的结果以及每个条件的每个可能的结果都被至少一次执行(即满足条件覆盖+判定覆盖)。
  • 组合覆盖【也称条件组合覆盖】:确保每个条件的每个可能的组合结果都被至少一次执行(比如x>=80 and y>=80,这个判断可拆分成如x>=80、y>=80,那么测试用例需要让其分别满足 T T、T F、F T、F F)。
  • 路径覆盖:覆盖程序的所有可能的路径。

🌊2.1 语句覆盖

语句覆盖:程序中每条语句至少被执行一次。

【案例】语句覆盖

语句覆盖的测试用例

用例序号XY路径
15050OBDE
210040OBCE
39090OAE

说明:上述示例覆盖了所有语句【1 ->T、2 ->T、3 ->T】。

  • x=50 y=50:覆盖了语句【3 ->T】
  • x=100 y=40:覆盖了语句【2 ->T】
  • x=90 y=90:覆盖了语句【1 ->T】

🌊2.2 判定覆盖【也称分支覆盖

判定覆盖:确保每个分支的两个可能的结果都被至少一次执行。即每个判断的取真、取假至少执行一次。

 【案例】评定覆盖(也称分支覆盖)

判定覆盖的测试用例

用例序号XY路径
15050OBDE
210040OBCE
39090OAE

说明:上述示例覆盖了所有分支。

  • x=50 y=50:覆盖了分支【No-No】
  • x=100 y=40:覆盖了分支【No-Yes】
  • x=90 y=90:覆盖了分支【Yes】

🌊2.3 条件覆盖

条件覆盖:每一个判断中的每个子句的不同true  false都要取一次。

 【案例】条件覆盖

条件覆盖的测试用例

这里其实有四个判断子句,分别是:x>=80、y>=80、x+y=140、(x>90 or y>90).

可以这样设计条件覆盖的测试用例:

x取值y取值x>=80y>=80x+y=140(x>90 or y>90)
6085FTFF
10040TFTT

说明:上述示例覆盖了所有判断子句。

  • x=60 y=85 与 x=100 y=40 覆盖了四个判断子句为 true 和 false 的情况。

🌊2.4 判定条件覆盖

判定条件覆盖:确保每个分支的两个可能的结果以及每个条件的每个可能的结果都被至少一次执行(即满足条件覆盖+判定覆盖)。

 【案例】判定条件覆盖

判定条件覆盖的测试用例

XY路径x>=80y>=80x+y=140(x>90 or y>90)覆盖分支
9090OAETTFFYes
5050OBDEFFFFNo-No
10040OBCETFTTNo-Yes

说明:上述示例覆盖了所有判断子句+分支。


🌊2.5 组合覆盖

组合覆盖【也称条件组合覆盖】:确保每个条件的每个可能的组合结果都被至少一次执行(比如x>=80 and y>=80,这个判断可拆分成如x>=80、y>=80,那么测试用例需要让其分别满足 T T、T F、F T、F F)。

 【案例】组合覆盖

组合覆盖的测试用例

组合覆盖需要拆分判断子句

对于第一个判断 x>=80 and y>=80 ,由于不是原子的可进一步拆分成 x>=80 和 y>=80 。

那么测试用例需要让第一个判断分别满足下面的条件:

对于第二个判断x+y=140 and (x>90 or y >90) ,由于不是原子的可进一步拆分成x+y=140 、x>90 和y >90。那么测试用例需要让第二个判断分别满足下面的条件:

说明:测试示例需要覆盖上面所有的条件。


🌊2.6 路径覆盖

路径覆盖:覆盖程序的所有可能的路径。

 【案例】路径覆盖

路径覆盖的测试用例

用例序号XY路径
15050OBDE
210040OBCE
39090OAE

说明:上述示例覆盖了所有路径。

  • x=50 y=50:覆盖了路径【OBDE】
  • x=100 y=40:覆盖了路径【OBCE】
  • x=90 y=90:覆盖了路径【OAE】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Transformer step by step--Positional Embedding 和 Word Embedding

Transformer step by step往期文章: Transformer step by step--层归一化和批量归一化 要把Transformer中的Embedding说清楚,那就要说清楚Positional Embedding和Word Embedding。至于为什么有这两个Embedding,我们不妨看一眼Transformer的…

7.MyBatis 操作数据库(初阶)

文章目录 1.什么是MyBatis2.为什么要学习 MyBatis?3.通过spring框架创建MyBatis项目3.1使用MyBatis查询数据库3.2 mysql连接不上报错解决方法 4.MyBatis的基础操作4.1企业建表规范:4.2MyBatis基本实现4.3单元测试4.4使用MyBatis可能遇到的问题4.5配置MyB…

Docker镜像的创建 和 Dockerfile

一. Docker 镜像的创建 创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于 Dockerfile 创建。 1 基于现有镜像创建 (1)首先启动一个镜像,在容器里做修改docker run -it --name web3 centos:7 /bin/bash …

CentOS8/RHEL8 root密码破解

我们知道root是CentOS8/RHEL8系统的管理员用户,一般情况下,我们是不会把其密码忘记的,如果万一忘记了,如果破解root密码呢,今天就为大家详细讲讲。 1.CentOS8/RHEL8 root密码破解 1.默认安装及默认配置情况下&#x…

如何申请免费SSL证书,把网站升级成HTTPS

HTTPS(Hyper Text Transfer Protocol Secure)是一种用于安全数据传输的网络协议,它可以有效地保护网站和用户之间的通信安全。然而,要使一个网站从HTTP升级到HTTPS,就需要一个SSL证书。那么,如何申请免费的…

批量归一化(部分理解)

目的与疑惑 在深度学习中,每层输入数据的分布可能因为前一层参数的微小变动而有较大变化, 这种现象称为内部协变量偏移(Internal Covariate Shift)。 批量归一化通过规范化层输入来减少内部协变量偏移,使网络更稳定&a…

Java集成结巴中文分词器、Springboot项目整合jieba分词,实现语句最精确的切分、自定义拆词

文章目录 一、jieba介绍二、集成三、原理四、自定义拆词4.1、方式一:在源码的dict.txt中修改然后重新打包(推荐)4.2、新建文件自定义拆词 五、其他问题 一、jieba介绍 jieba是一个分词器,可以实现智能拆词,最早是提供了python包,…

【产品经理修炼之道】- 如何从0到1搭建B端产品

随着数字化转型的不断深化,B端产品也面临着升级。本文总结分析了如何从0到1搭建B端产品,希望对你有所帮助。 背景 随着公司数字化转型的不断的推进和实施,数字化转型成功越来越明显的体现在财务报上,这也增强了管理层对数字转型的信心,在推进中我们也发现几年建设的系统的…

Aigtek:介电弹性体高压放大器在软体机器人研究中的应用

近年来软体机器人的研究成为目前机器人研究领域的热点,由于软体材料的自由度可以根据需求自由变化,因此软体机器人有着极高的灵活性,而且软体机器人因其材料的柔软性有着很好的人机交互性能和安全性。它的出现成功解决了传统的刚性机器人人机…

Django与mysqlclient链接不成功

先检查自己的python是什么版本,是64位还是32位,这个自己去网上查。 我的是32位的,因为直接pip下载不了,网上也没有32位的whl,所以卸载重装一个64位的3.9.6的python 网上直接搜mysqlclient,找到对应py39也…

「 网络安全常用术语解读 」SBOM主流格式SPDX详解

SPDX(System Package Data Exchange)格式是一种用于描述软件组件(如源代码)的规范,它提供了一种标准化的方法来描述软件组件的元数据,包括其许可证、依赖项和其他属性。SPDX最初由Linux基金会于2010年发起&…

家庭环境如何异地组网装修?

家庭异地组网装修是如今越来越受到人们关注的问题。在现代社会中,家庭成员经常因为各种原因而分散在不同的地区。这种情况下,如何实现家庭网络的高效通信变得尤为重要。本文将介绍一款异地组网产品——【天联】组网,它能够帮助家庭解决异地组…

STM32中断系统详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 中断基本概念 2. STM32中断 3. NVIC的基本组件 3.1 NVIC的基本组件 3.2 NVIC的优先级 4. EXTI外部中断 4.1 基本概念 4.2 基本结构 5. AFIO 1. 中断基本概念 中断(Interrupt&…

测试的分类(3)

目录 按照测试阶段测试 系统测试 冒烟测试和回归测试的区别 验收测试 单元测试, 集成测试, 系统测试, 回归测试之间的关系 是否按手工进行测试 手工测试 自动化测试 自动化测试和手工测试的优缺点 自动化测试优点 自动化测试缺点 手工测试优点 手工测试缺点 按照…

Oracle导出导入dmp等文件类型的多表数据的常用方法、遇见的常见问题和解决办法(exp无效sql???)

使用PLSQL执行导出表数据的时候有两种方法 1、使用Oracle命令【imp--exp】【impdp--expdp】 但是如果你的本机没有安装有Oracle数据库,使用的instant client远程连接服务器上的Oracle数据库时候,你没有Oracle数据库带有的exp.exe、imp.exe等扩展文件&a…

详解23种设计模式——工厂模式

工厂模式 | CoderMast编程桅杆工厂模式 设计思想 工厂模式是最常用的设计模式之一,属于创建型模式,将创建对象的权利交给了一个工厂类,从而提供了一种不使用构造方法的情况下创建对象的途径,无需指定要创建的具体类,将…

重仓比特币

作者:Arthur Hayes Co-Founder of 100x. 编译:liam ccvalue (下文中表达的任何观点均为作者的个人观点,不应作为投资决策的依据,也不应被视为参与投资交易的建议或意见)。 我们中断牛市常规节目,为您播报这…

Android14之修改编译vendor.img(二百零七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

HTML列表、表格、表单

1.列表 列表分类&#xff1a;无序、有序、定义 2.无序列表&#xff08;unordered list&#xff09; ul嵌套li&#xff0c;ul是无序列表。li是列表条目。 ur标签里面只能包含li标签。 li里面可以包含任何内容。 3.有序列表&#xff08;ordered list&#xff09; <ol>…

OpenMesh 计算封闭网格体积

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 思路很是简单,就是计算一些四面体的有向体积(这些四面体均是基于网格中的三角形与原点组成的) ,至于体积的符号则来自于三角形是否指向原点方向来确定,即面片的法线方向(其中三角形的法线本身取决于顶点的顺序…