当前课程知识点:软件工程 > 第3章 单元测试 > 3.2 黑盒测试方法 > 黑盒测试方法
测试用例的设计
是测试活动的基础和关键
它可以指导人们
系统地进行测试
对于测试的执行
起到事半功倍的作用
测试不可能是完备的
它会受到时间的约束
测试用例可以帮助我们
分清先后主次
以便更有效地组织测试的工作
从而提高测试效率
降低测试成本
在测试的过程中
临时性地发挥也许会有灵感出现
但是大多数情况下
我们会感觉思维混乱
可能有一些功能没有测到
而另一些功能已经重复测过几遍
测试用例可以帮助我们理清头绪
避免重复和遗漏
测试用例的通过率
和软件缺陷的数量
是检验软件质量的量化标准
通过对测试用例的分析和改进
可以逐步地完善软件的质量
另外测试用例也可以用于衡量
测试人员的工作量
进度和效率
从而更有效地管理
和规划测试的工作
下面我们先了解一下
什么是测试用例
测试用例是为了一个特定的目标
而设计的一组测试输入
执行条件和预期结果
它的目的是测试某个程序路径
是否正确
或者何时
程序是否满足某个特定的需求
测试用例一般包括以下部分
测试用例值
是测试需要的一些输入值
期望结果是程序满足预期行为
而应当产生的结果
我们要验证一个程序是否正确
就要事先明确这个程序
应该满足的期望行为
如果测试结果和期望结果相符
那么我们就认为
它是正确的
另外
测试的时候
需要预先设定软件
处于测试输入的一个稳定状态
前缀值就是把软件
置于合适的状态
来接受测试用例值的
任何必要条件
后缀值
就是测试用例值输入以后
为了查看结果
或者终止程序
而需要的任何输入
后缀值又可以再细分为验证值
和结束命令两种类型
比如
我们测试一个移动电话软件
测试用例值可以是多种电话号码
期望的结果就是接通
或者未接通
除了这两部分之外
测试的时候
我们还需要电话开启
并且处于可拨号的稳定状态
也就是所谓的前缀值
输入电话号码之后
我们还要按下呼叫或者取消按纽
来查看测试结果
这就是后缀值
测试用例设计
应该考虑下面的因素
因为穷举测试是不可行的
所以我们必须要选择
少量有代表性的数据
使每一个测试用例
都能覆盖一组范围
或者特定情况
测试用例
要确切地反映
系统设计中可能存在的问题
我们要根据需求规格说明
并且结合各种可能情况
来综合考虑测试用例
测试不能只考虑正确输入情况
还要考虑错误或异常输入
并且分析怎么才能产生
这些错误和异常
测试用例
要基于用户的实际使用情况
从用户的角度来模拟测试的输入
我们在上一讲讲过
黑盒测试是把测试对象
看成是一个黑盒子
根据需求说明来检查程序
是否符合功能要求
在单元测试部分
我们重点讲解
等价类划分和边界值分析
这两种方法
等价类划分是把输入域
划分成尽可能少的若干子域
并且要求这些子域
是两两不相交的
那么每一个子域
就称为一个等价类
对于同一个域来说
可能会存在不同的划分方法
我们来看这个图
它显示两种划分
那么哪一种划分是等价类划分呢
左边图里面的子域
两两不相交的
右边的1和2是有交集的
根据上面的定义
左边是等价类划分
但是右边不是
在等价类划分中
我们用
同一个等价类中的任何输入
对软件进行测试的时候
软件都会输出相同的结果
所以只需要从每一个等价类中
选取一个输入作为测试用例
就可以构成
软件一个完整的测试用例集
对于相同的等价类划分
不同的测试人员
所选取的测试用例集
可能是不同的
那么良好的选择
需要经验的积累
等价类可以分为有效等价类
和无效等价类
其中有效等价类
是有合理的输入数据构成的集合
它能够检验程序是否实现了
规格说明中预先规定的功能
和性能
无效等价类
是不合理输入数据构成的集合
它可以发现程序异常处理的问题
来检查程序
是否具有一定的容错性
我们设计测试用例的时候
要同时考虑这两种等价类
因为软件
不仅要能够接收合理的数据
也要能够经受意外的考验
下面我们结合一些常见的
不同数据类型来简单说明
如何进行等价类的划分
对于一般的简单数值变量来说
如果输入规定了取值范围
那么范围内是一个有效等价类
范围外是两个无效等价类
下面来看一个例子
程序的输入参数X是小于100
大于10的整数
根据上面的方法
有一个有效等价类
就是X大于10小于100
有两个无效等价类
分别是X小于等于10
和X大于等于100
对于字符串变量
如果规定了输入字符
遵守的规则
那么我们可以确定
有一个有效等价类
就是符合规则的字符串
和若干无效等价类
它们是从不同角度
违反规则的字符串
看一个例子
姓名是长度不超过20的
非空字符串
只是由字母组成
数字和其他字符都是非法的
显然
我们可以有一个有效等价类
就是满足了
上述所有条件的字符串
那么有几个无效等价类
我们可以看长度是一个因素
组成字符串的字符也是一个因素
那么长度可以是0
或者超过20
然后其他是非字母的字符
这样我们就得到了
三个无效等价类
分别是空字符串
长度超过20的字符串
包含了数字
或者其他字符的字符串
对于枚举类型
如果规定输入数据是一组值
假定n个
并且程序要对每一个输入值
分别处理
那么就可以确定
有n个有效等价类
和1个无效等价类
比如说
某一个程序根据不同的学历
分别计算岗位工资
其中学历可以是专科 本科
硕士 博士
四种类型
那么显然
就有四个有效等价类
分别是专科 本科 硕士 博士
还有一个无效等价类
就是其他学历
如果我们把
专科 本科 硕士 博士
是按一种方式来计算岗位工资
这个时候应该如何划分等价类
数组
是一组具有相同类型元素的集合
那么数组的长度和类型
都可以作为等价类划分的依据
假设某一个程序的输入
是一个长度为3的整数数组
那么根据数组的长度
我们可以划分成一个有效等价类
就是长度是1到3的所有合法数组
还有两个无效等价类
分别是空数组
所有长度大于3的数组
比如说-9 0 12 5
那么这个数组因为长度是4
所以是一个无效等价类
如果我们对于数组的元素
还有其他的附加的约束
比如说
数组oper的元素
它的取值范围-3到3
那么还要适当地来增加
相应的等价类
符合数据类型
是包含了两个
或两个以上
相互独立属性的输入数据
在进行等价类划分的时候
需要考虑
输入数据的每一个属性的合法
和非法取值
比如说这个例子
student这个结构
它是包括了name course
和grade三个属性
那么在进行等价类划分的时候
先对每一个元素进行划分
然后再把这些等价类进行组合
最终得到了这个student结构的
一个整个的等价类划分
一般的测试对象
都会有多个输入的参数
我们会把这些参数的等价类
进行组合来设计测试用例
这个时候就要考虑如何进行组合以便保证等价类的覆盖率
首先
所有参数
有效等价类的每一个组合
就构成一个有效的测试用例
其次
任一个参数的无效等价类
与其他参数的有效等价类
进行组合
构成一个无效的测试用例
现在来看一个程序的例子
整数ABC是它的三个输入
分别代表三角形的三条边
这个程序判断这三条边
构成的三角形类型
分别输出等边三角形
等腰三角形 一般三角形
或者不构成三角形
这三个整数还满足大于等于1
小于等于100这个条件
现在使用等价类划分的方法
来设计这个程序的测试用例
首先进行等价类划分
第一种方法
是按照输入的取值进行划分
把ABC都划分成0
大于0 小于0
或者0 1 大于1
小于0这样的一些等价类
第二种方法
是按照输出的几何特性进行划分
划分成等腰三角形 等边三角形
一般三角形
和非三角形四个等价类
那么你会选择哪一种方法
来划分等价类
显然第二种方法最合适
在多数情况下
等价类是根据输入域进行划分的
但并不是说不能从输出来
反过来划分
事实上 对于三角形这个问题
输出域的划分是最简单的方法
等价类划分之后
我们就来设计测试用例
根据等价类的性质
每一个等价类
只需要选取一个有代表性的输入
作为测试用例
这样我们就得到了
四个有效的测试用例
我们还可以补充一些
无效测试用例
根据前面提到的组合原则
每一个测试用例
只有一个参数是无效的
其余保持有效
这样就形成了
健壮等价类的测试用例
边界值分析
是对输入或输出的边界值
进行测试的一种方法
通常也作为
等价类划分的一个补充
首先要确定边界
等价类的边界
就是测试的重点
然后选取正好等于 刚好大于
或者刚好小于边界的值
作为测试数据
实践表明
大多数的故障
往往发生在输入
或者输出域的边界上
针对边界情况设计测试用例
通常会取得良好的效果
这里列举了
几个边界值分析的例子
第一个例子是一个文本输入区
它允许输入1到255个字符
那么空串长度为1 255
和256的字符串都是边界条件值
第二个例子
是要求输入5位十进制整数
我们可以使用
刚好小于5位和大于5位的数值
作为边界条件
第三个例子是磁盘空间
这个边界值的选取
和整数值方法类似
边界值分析方法认为
故障往往出现在
程序输入的边界值附近
但是它是基于单故障假设的
也就是说两个
或两个以上故障同时出现
而导致失效的情况很少发生
用这种方法设计测试用例的时候
每次只保留一个变量取边界值
其余的变量取正常值
正像这幅图给出的示例这样
我们再来看一下
三角形程序的例子
按照前面提到的单故障原则
我们可以设计一些
边界值的测试用例
在这里边界值分别取了
1 2 99
和100
健壮性测试
是对边界值分析的一个简单扩充
它除了边界内的五个取值之外
还增加了
刚好超过边界的两个取值
像上图所示
这种方法可以检查
超过极限值的时候系统的情况
测试经验对于软件测试
是非常重要的
人们可以经验或者直觉
推测出程序中
可能存在的各种错误
然后有针对性地编写
检查这些错误的测试用例
实际上
软件缺陷具有空间聚集性
对于代码的高危多发地段
投入更多的精力进行测试
往往可以发现更多的错误
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)