软件测试用例(2)
具体的设计方法 -- 黑盒测试
因果图
因果图是一种简化的逻辑图, 能直观地表明程序的输入条件(原因)和输出动作(结果)之间的相互关系. 因果图法是借助图形来设计测试用例的一种系统方法, 特别适用于被测试程序具有多种输入条件, 程序的输出又依赖于输入条件的各种情况.
因果图需要掌握的基本知识
恒等: 如果原因为真, 那么结果必为真.

与: 只有所有原因都为真, 那么结果为真.

或: 有一个原因为真时, 结果就为真.

非: 只有原因为假, 结果才为真.

因果图设计测试用例的步骤如下:
(1)分析所有可能的输入和输出.
(2)找出输入和输出之间的因果关系.
(3)画出因果图.
(4)把因果图转换成判定表.
(5)把判定表对应到每一个测试用例.
案例:
假设业务单据的处理规则为: "淘宝618活动, 订单已提交, 订单合计金额大于300元或有红包,则进优惠".
1.对于这条业务规则, 首先通过分析所有的输入和输出, 可得到如下结果:
输入: 订单已提交, 金额大于300元, 有红包
输出: 优惠, 不优惠
2.然后, 第二步, 找出输入和输出之间的因果关系.
(1)订单已提交, 金额大于300元, 有红包 -> 优惠
(2)订单已提交, 金额大于300元, 无红包 -> 优惠
(3)订单已提交, 金额小于300元, 有红包 -> 优惠
(4)订单已提交, 金额小于300元, 无红包 -> 不优惠
(5)订单未提交 -> 不优惠
3.画出因果图
4.其实一般情况下, 当业务逻辑十分复杂时, 因果图会很恶心, 所以我们一般会使用下面的判定表. 这里有三个条件, 两个取值, 所以表的列数为2*2*2 = 8
5.转换成最终的测试用例
案例二:
以注册的需求为例:
姓名, 邮箱, 密码, 确认密码, 验证码必须全部输入, 才能进行注册.
这时就需要设计2 * 2 * 2 * 2 * 2 = 32条测试用例
因果法设计测试用例可以帮助测试人员理清输入和输出之间的关系, 但对于比较复杂的输入和输出, 会耗费大量的时间.
正交排列
正交法的目的是为了减少测试用例的数目. 用尽可能少的用例覆盖输入的两两组合.
正交试验设计是研究多因素多水平的一种设计方法, 它根据正交性, 因试验因素的全部水平组合中挑选出部分有代表性的具有实验, 通过对这部分实验结果的分析了解全面试验的情况, 找出最优的水平组合. 正交试验设计是一种基于正交表的, 高效率, 快速, 经济的试验.
因素: 在一项实验中, 凡欲考察的变量称为因素(变量).
水平: 在试验范围内, 因素被考察的值称为水品(变量的取值).
正交表的构成:
行数: 正交表中行的个数, 即试验的次数, 用N代表.
因素数: 正交表中列的个数, 用C代表.
水平数: 任何单个因素能够取得的值的最大个数, 用T代表.
正交表的表示形式: L = 行数(水平数 * 因素数) L= N(TC) 行数 = 因素数 * (水平数 - 1) + 1
正交表的两条性质: (1)每一列中各数字出现次数都一样多.
(2)任何两列中各有序数对出现的次数都一样多. (比如挑出任何两列, 其序列为 1, 2, 则在其它行中, 该两列不会再出现为1, 2的序列).
正交法设计测试用例的步骤:
1. 有哪些因素(变量)
2. 每个因素有哪几个水平(变量的取值).
3.选择一个合适的正交表.
4.把变量的值映射到表中.
5.把每一行的各因素水平的组合作为一个测试用例.
6.加上你认为可以且没有在表出现的用例集合.
案例: 继续以注册为例:
1.因素: 姓名, 邮箱, 密码, 确认密码, 验证码.
2.水平: 填写, 不填写
3. 表中的因素数 = 5;
表中至每个因素数的水平数 = 2.
行数 = (2 - 1) * 5 + 1 -> L = 6(25)
选择正交表, 这里选择了L6_2_5.
4.生成测试用例(这里使用工具allpairs)直接生成正交表即可.
注: ~可以表示填写或者不填写
5.增补测试用例
姓名, 邮箱, 密码, 确认密码, 验证码都不填写.
具体的设计方法 -- 白盒测试
介绍
定义: 白盒测试也叫逻辑驱动测试, 它是对程序的逻辑结构进行检查, 从中获取测试数据.
核心: 对程序的逻辑结构进行检查, 从中获取测试数据.
判定标准: "穷举路径测试" -> 使用测试用例执行了程序流中所有可能的执行流路径, 程序可以得到完全测试.
穷举路径测试可能出现的问题:
1.不同逻辑路径的数量可能达到天文数字.
2.虽然可以测试到程序中的所有路径, 但是程序中可能存在着错误.
原因:(1)即使是穷举路径测试也不能保证程序符合其设计规范. eg: 升序排序写成降序排序.
(2)程序可能会因为缺少某些路径而出现问题. 穷举路径测试当然不能发现缺少了哪些问题.
(3)可能不会暴露敏感问题.
以下所有的测试用例都将使用一个栗子来说, 如下:
public void foo(int a, int b, int x) {if(A > 1 && B == 0) {X = X / A;}if(A == 2 || X > 1) {X = X + 1;}
}
先给出逻辑运行图:

语句覆盖
语句覆盖就是指将程序中的每个语句都至少执行一次. 遗憾地是, 这恰是合理的白盒测试中较弱的准则.
通过编写单个测试用例遍历程序路径ace,可以执行到每一条语句, 也就是说, 通过在a点设置A = 2, B = 0, X = 3. 每条语句都将被执行一次(这里X可以取任意值).
遗憾的是, 这个准则相当不足. 举例来说, 也许第一个判断应是"或", 而不是"与"(比如或后面情况对X或者A,B两个值有影响, 那么就不好说了), 如果这样这个错误, 就发不现.
因此, 语句覆盖这条准则有很大的不足, 以至于它通常没有什么用处.
判定覆盖/分支覆盖
定义: 判定覆盖/分支覆盖是较强一些的逻辑准则. 要求编写足够的测试用例, 使得每一个判断至少有一个为真/为假的输出结果.(每条分支路径至少应该遍历一次). 分支或判定语句的栗子包括switch, do-while和if-else语句.
判定覆盖通常可以满足语句覆盖. 由于每条语句都是在要么从分支语句开始, 要么从程序入口点开始的某条子路径上, 如果每条分支路径都被执行到了, 那么每条语句也应该执行到了. 但仍然有三种例外的情况.
程序中不存在判断.
程序或子程序/方法有着多重入口点. 只有从程序特定入口点进入时, 某条特定的语句才能执行到.
在ON单元里的语句. 遍历每条分支路径并不一定能确保所有的ON单元被执行到.
在逻辑运行图中, 两个覆盖了路径ace和abd, 或涵盖了路径acd和abe的测试用例就可以满足判定覆盖的要求. eg: A = 3, B = 0, X = 3和A = 2, B = 1, X = 1.
判定覆盖是一种比语句覆盖更强的准则, 但仍然有所不足. 举例来说, 我们仅有50%的可能性遍历到那条X未发生变化的路径. 比如说第二个判断出现错误(X > 1 写成 X < 1),那么前面的测试用例都无法找出这个错误.
条件覆盖
在条件覆盖的情况下, 要编写足够多的测试用例以确保将判断中的每个条件的所有可能结果至少执行一次. 因为就如同判定覆盖的情况一样, 这并不总是能让每条语句都执行到, 因此作为对这条准则的补充就是对程序或者子程序, 包括ON单元的每一个入口点都至少调用一次.
在本条案例中就是指, 起码要走到判定条件的最后一个, 即前面的判定条件都不能判定为真.
eg: 1. A = 3, B = 0, X = 4 -> ace 2. A = 1, B = 1, X = 1 -> adb.
虽然条件覆盖准则乍看上去似乎满足了判定覆盖准则, 但并不总是如此. 如果正在测试判断条件IF(A&B), 条件覆盖准则将要求编写的测试用例: A为真, B为假并不能使得If语句中的then被执行到.
判定/条件覆盖
显然, 解决条件覆盖的问题的方案就是所谓的判定/条件覆盖准则. 这准则要求设计出充足的测试用例, 将一个判断中的每个条件的所有可能结果都至少执行一次(每个条件都要有Y/N两种判断), 将每个入口点都至少调用一次.
但是我们之前也学过 && 和 || , 它们的"短路"性质可能会屏蔽掉或阻碍其它的条件. 就比如在 && 中, 如果一个为假, 后面的语句都将不再执行. 在 || 中, 如果一个条件为真, 则后面的语句都不再执行. 因此, 条件覆盖或判定/条件覆盖准则不一定能发现逻辑表达式中的错误.
多重条件覆盖准则
所谓的多重条件覆盖准则能够部分解决这个问题. 该准则要求编写足够多的测试用例, 将每个判定中的所有可能的条件组合, 以及所有的入口点都执行一次. 并且, 很容易发现, 满足多重条件覆盖准则的测试用例集, 同样满足判定覆盖原则, 条件覆盖准则以及判定/条件覆盖准则.
如果是多重条件覆盖准则, 那么它又将之前的执行流程图进一步细化了:

再次回到测试用例设计中, 它必须覆盖一下8种组合(但是测试用例不一定非得设计八种):
1.A > 1, B = 0
2.A > 1, B <> 0
3.A <= 1, B = 0
4.A <= 1, B <> 0
5.A = 2, X > 1
6.A = 2, X <= 1
7.A <> 2, X > 1
8.A <> 2, X <= 1
总的说来, 对于包含每个判断只存在一种条件的程序, 最简单的测试准则就是设计出足够数量的测试用例, 实现: (1)将每个判断的所有结果都至少执行一次; (2) 将所有的程序入口(例如入口点和ON单元)都至少执行一次. 而对于包含多重条件判断的程序, 最简单的测试准则是设计出足够数量的测试用例, 将每个判断的所有可能的条件结果组合, 以及所有的入口点都至少执行一次.
相关文章:
软件测试用例(2)
具体的设计方法 -- 黑盒测试 因果图 因果图是一种简化的逻辑图, 能直观地表明程序的输入条件(原因)和输出动作(结果)之间的相互关系. 因果图法是借助图形来设计测试用例的一种系统方法, 特别适用于被测试程序具有多种输入条件, 程序的输出又依赖于输入条件的各种情况. 因果图…...
集群式无人机仿真环境和数据集
仿真环境和数据集 Quick StartAcknowledgementsSwarmSim Quick Start Compiling tests passed on 20.04 with ros installed. You can just execute the following commands one by one. # Download the Simulator and run it wget https://cloud.tsinghua.edu.cn/library/34…...
IPSec VPN
IP Security,IP安全 1、特点 L3的VPN 缺:不支持组播、配置复杂、延迟增加、资源消耗较多 优:具备访问控制、密码学四个维度、抗重放打击 2、组件 ①安全协议 1)验证头技术(AH) IP协议号51 提供数据完整性检查,身份验证,抗重放攻击 无法做数据的机密性 AH的完…...
docker部署nacos,单例模式(standalone),使用内置的derby数据库,简易安装
文章目录 前言安装创建文件夹docker指令安装docker指令安装-瘦身版 制作docker-compose.yaml文件查看页面 前言 nacos作为主流的服务发现中心和配置中心,广泛应用于springcloud框架中,现在就让我们一起简易的部署一个单例模式的nacos,版本可…...
systemd监听服务配置文件更新自动重启服务
背景&需求 需要频繁更改一个服务的配置文件进行测试 实现 配置服务的systemd文件 vim /lib/systemd/system/xxx.service [Unit] Descriptionxxx daemon, A rule-based proxy in Go.[Service] Typesimple ExecStart/opt/xxx/xxx-d /etc/xxx/ Restartalways[Install] Wan…...
【yy讲解PostCSS是如何安装和使用】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
YOLO电动车检测识别数据集:12617张图像,yolo标注完整
YOLO电动车检测识别数据集:12617张图像,电动车一类,yolo标注完整,部分图像应用增强。 适用于CV项目,毕设,科研,实验等 需要此数据集或其他任何数据集请私信...
从汇编看函数调用
文章目录 函数调用流程栈相关寄存器及的作用简介寄存器功能指令功能 栈函数的括号{}正括号反括号 参数传递传值,变量不可改传指针,变量可改C 传引用 函数调用实例 函数调用流程 目标:函数调用前后栈保持不变 保存main函数的寄存器上下文移…...
node.js的错误处理
当我打开一个不存在的文件时,错误如下: 在读取文件里面写入console.log(err),在控制台中可以看到我的错误代码类型:文件不存在的错误代码 ENOENT。见更多错误代码---打开node.js官方API文档Error 错误 | N…...
shell的编写
文章目录 1.框架2.命令行3.获取用户命令字符串4.命令行字符串分割5.执行命令和内建命令6.完整代码: 1.框架 我们知道shell是一直存在的,所以首先我们第一步就是要搭建一个框架,使其一直存在。 那么也很简单,一个while循环就可以完…...
css心跳动画
图标引入 <img class"icon" src"heart.svg" alt"" srcset""> CSS代码 <style>.icon {animation:bpm 1s linear,pulse 0.75s 1s linear infinite;}keyframes pulse {from,75%,to {transform: scale(1);}25% {transform:…...
在 Amazon Timestream 上通过时序数据机器学习进行预测分析
由于不断变化的需求和现代化基础设施的动态性质,为大型应用程序规划容量可能会非常困难。例如,传统的反应式方法依赖于某些 DevOps 指标(如 CPU 和内存)的静态阈值,而这些指标在这样的环境中并不足以解决问题。在这篇文…...
【智能排班系统】快速消费线程池
文章目录 线程池介绍线程池核心参数核心线程数(Core Pool Size)最大线程数(Maximum Pool Size)队列(Queue)线程空闲超时时间(KeepAliveTime)拒绝策略(RejectedExecutionH…...
C语言——内存函数
前言: C语言中除了字符串函数和字符函数外,还有一些函数可以直接对内存进行操作,这些函数被称为内存函数,这些函数与字符串函数都属于<string.h>这个头文件中。 一.memcpy()函数 memcpy是C语言中的…...
ideaSSM图书借阅管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目
一、源码特点 SSM 图书借阅管理系统是一套完善的信息管理系统,结合SSM框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码 和数据库,系统主…...
普联一面4.2面试记录
普联一面4.2面试记录 文章目录 普联一面4.2面试记录1.jdk和jre的区别2.java的容器有哪些3.list set map的区别4.get和post的区别5.哪个更安全6.java哪些集合类是线程安全的7.创建线程有哪几种方式8.线程的状态有哪几种9.线程的run和start的区别10.什么是java序列化11.redis的优…...
SQLite的架构(十一)
返回:SQLite—系列文章目录 上一篇:SQLite下一代查询规划器(十) 下一篇:SQLite—系列文章目录 介绍 本文档介绍SQLite库的架构。 这里的信息对那些想要了解或 修改SQLite的内部工作原理。 接口SQL 命令处理器虚拟机B-树…...
Vue2电商前台项目(一):项目前的初始化及搭建
一、项目初始化 创建项目:sudo vue create app 1.项目配置 (1)浏览器自动打开 在package.json文件中,serve后面加上 --open "scripts": {"serve": "vue-cli-service serve --open","buil…...
4.6 offset指令,jmp short指令,far,dword ptr各种跳转指令
4.6 offset指令,jmp short指令,far,dword ptr各种跳转指令 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令 1. 转移指令 1.1 8086CPU的转移行为有以…...
【WEEK5】 【DAY5】DML语言【中文版】
2024.3.29 Friday 目录 3.DML语言3.1.外键(了解)3.1.1.概念3.1.2.作用3.1.3.添加(书写)外键的几种方法3.1.3.1.创建表时直接在主动引用的表里写(被引用的表的被引用的部分)3.1.3.2.先创建表后修改表以添加…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...
Springboot 高校报修与互助平台小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,高校报修与互助平台小程序被用户普遍使用,为…...



3. 表中的因素数 = 5;