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

news2024/12/23 19:03:47

目录

🌞前言

🏞️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】

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

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

相关文章

【自然语言处理】InstructGPT、GPT-4 概述

InstructGPT官方论文地址:https://arxiv.org/pdf/2203.02155.pdf GPT-4 Technical Report:https://arxiv.org/pdf/2303.08774.pdf GPT-4:GPT-4 目录 1 InstructGPT 2 GPT-4 1 InstructGPT 在了解ChatGPT之前,我们先看看Instr…

线性代数-行列式-p1 矩阵的秩

目录 1.定义 2. 计算矩阵的秩 3. 矩阵的秩性质 1.定义 2. 计算矩阵的秩 3. 矩阵的秩性质

Apache Doris 2.x 版本【保姆级】安装+使用教程

Doris简介 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。基于…

数据挖掘实验一

一、实验环境及背景 使用软件: Anaconda3 Jupyter Notebook 实验内容: 1.使用Tushare或者其他手段获取任意两支股票近三个月的交易数据。做出收盘价的变动图像。2.使用Pandas_datareader获取世界银行数据库中美国(USA)、瑞典&…

Linux系统安全与应用【一】

目录 1.账号安全控制 1.1 系统账号清理 1.2 密码安全控制 1.3 命令历史限制 1.4 命令总结 2.系统引导和登录控制 2.1 使用su命令切换用户 2.2 限制使用su命令的用户 3.可插拔式认证模块PAM 3.1 linux中的PAM安全认证 3.2 PAM认证原理​编辑 3.3 PAM认证的构成 3.4 P…

UEFI安全启动模式下安装Ubuntu的NVIDIA显卡驱动

UEFI安全启动模式下安装ubuntu的nvidia显卡驱动 实践设备:华硕FX-PRO(NVIDIA GeForce GTX 960M) 一、NVIDIA官网下载驱动 1.1在浏览器地址栏输入https://www.nvidia.cn/drivers/lookup/进入网站,接着手动驱动搜索,并…

GPB | RegVar:基于深度神经网络的非编码区突变功能预测新方法

Genomics, Proteomics & Bioinformatics (GPB)发表了由军事医学研究院辐射医学研究所张成岗研究员、周钢桥研究员和卢一鸣副研究员团队完成的题为“RegVar: Tissue-specific Prioritization of Noncoding Regulatory Variants”的方法文章。我们的“…

Linux常用监控命令(笔试面试常考)

1.、free命令 [rootRocky8-node1 ~]# free -htotal used free shared buff/cache available Mem: 1.7Gi 1.1Gi 69Mi 31Mi 554Mi 436Mi Swap: 2.0Gi 258Mi 1.7Gi free命令是Linux系统中用…

paddle ocr v4 微调训练文字识别模型实践

识别步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/recognition.md 微调步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/finetune.md 训练必要性 原始模型标点符号和括号容易识别不到 数据准备…

【C++】---STL之list的模拟实现

【C】---STL之list的模拟实现 一、list模拟实现思路二、结点类的实现三、list迭代器的实现1、ListIterator类2、构造函数3、operator*运算符重载5、operator->运算符重载6、operator!运算符重载7、operator运算符重载8、前置9、后置10、前置--11、后置-- 四、lis…

JavaScript云LIS系统概述 前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS(云实验室信息管理系统)是一种结合了计算机网络化信息系统的技术,它无缝嵌入到云HIS(医院信息系统)中,用于连…

uniapp H5实现签名

第一种&#xff1a;跳转签名页面 1、创建审核页面audit.vue <template><view><uni-section title""><view class"auditClass"><uni-forms :model"baseFormData" ref"baseFormRef" :rules"rules&quo…

Docker镜像的创建 和 Dockerfile

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

第12章 最佳的UI体验——Material Design实战

第12章 最佳的UI体验——Material Design实战 其实长久以来&#xff0c;大多数人都认为Android系统的UI并不算美观&#xff0c;至少没有iOS系统的美观。以至于很多IT公司在进行应用界面设计的时候&#xff0c;为了保证双平台的统一性&#xff0c;强制要求Android端的界面风格必…

区块链技术与应用学习笔记(8-9节)——北大肖臻课程

目录 8.挖矿 对于全节点和轻节点思考问题&#xff1f; ①全节点在比特币的主要作用&#xff1f; ②挖矿时当监听到别人已经挖出区块并且延申了最长合法链此时应该立刻放弃当前区块在 本地重新组装一个指向最后这个新合法区块的候选区块&#xff0c;重新开始挖矿。节点这么做…

AbstractRoutingDataSource实现多数据源切换以及事务中无法切换问题

一、AbstractRoutingDataSource实现多数据源切换 为了实现数据源的动态切换&#xff0c;我们采用了AbstractRoutingDataSource结合AOP反射来自定义注解。通过这种机制&#xff0c;我们可以在运行时根据自定义注解来选择不同的数据源&#xff0c;从而实现灵活高效的数据访问策略…

Linux文件/目录高级管理一(头歌实训)

目录 任务描述 相关知识 Linux修改文件权限命令 Linux修改所有者权限 Linux修改同组用户权限 Linux修改其他用户权限 编程要求 任务描述 相关知识 Linux修改目录权限命令 Linux修改所有者权限 Linux修改同组用户权限 Linux修改其他用户权限 编程要求 任务描述 相…

Linux(Centos)服务器探索ffmpeg笔记 (命令行、Nvidia硬件加速、GPU、CPU、CUDA、h264_nvenc、过滤器、加水印)

目录 前言内容简介为什么会有这篇文章 1、服务器上怎么使用ffmpeg1.1 使用编译好的&#xff08;需要root权限&#xff09;1.2 自己怎么编译&#xff08;需要root权限&#xff09; 2 、非Root用户要怎么安装和使用3、ffmpeg命令的一些使用引导和参数介绍3.1 编译参数3.2 查询支持…

labview中TDMS读写波形图

TDMS与二进制读写速度区别不大&#xff0c;但是它具备关系型数据库的一些优点&#xff0c;经常用于存取波形数据。

数据库工程师的工作职责(合集)

数据库工程师的工作职责1 职责&#xff1a; 1. 日常数据库的基本安装&#xff0c;维护&#xff0c;升级&#xff0c;监控的; 2. 配合研发部门进行数据库设计支持&#xff0c;协助开发、设计和进行SQL语言优化; 3. 配合相关部门数据库相关的任务&#xff0c;比如数据导入导出&am…