当前课程知识点:软件理论与工程 > 第5章 软件测试 > 5.2 测试传统的应用系统 > 5.2 测试传统的应用系统
大家好
这一个节我们来分享一下
如何测试传统的应用系统
测试传统的应用系统
我们可以使用白盒测试方法
黑盒测试方法
可以使用基于模型的测试
另外我们还可以应用一些软件测试模式
也就是利用的以往成功测试模式
然后来进行我们的软件的测试
在白盒测试当中
我们要学习基本路径测试
还有控制结构测试
在黑盒测试当中
我们学习一下基于图的测试方法
等价类划分
边界值分析
正交数组测试相关的概念
下面我们开始看一下
测试传统的应用系统
什么是一个“好的”测试
好的测试具有较高发现错误的可能性的能力
好的测试是不冗余的
也就是我们可以使用简单
少量有效的测试达到我们的目的
好的测试应该是“最佳品种”的
也就是非常有代表性的测试
而且好的测试应该既不太简单也不太复杂
通常我们任何的工程化的产品
(以及大多数的东西)
都可以采用两种方式进行测试
也就是内部视角和外部视角
当我们了解已经设计产品要完成的指定功能
可以执行测试以显示每个功能是可操作的
同时查找在每个功能中的错误
这种就主要说外部视角对应我们的测试
是黑盒测试
如果我们了解产品的内部工作情况
可以执行测试
以确保我们的所有的齿轮
都是可以有效的吻合的
也就是从内部视角进行测试
我们这种叫做白盒测试
即内部操作依据规格说明执行
而且对所有的内部构件
已进行了充分的测试
当我们设计测试用例的时候
我们要知道
所有的错误和bug
都潜伏在角落或者是边界处
我们设计测试用例的目标是要发现错误
而且以一种完整的方式
以最小的努力和时间
可以发现尽可能多的错误
我们看一个例子
这样一个程序结构中间有选择
有循环
如果我们想把所有的执行过程
执行路径都测试到
也就是我们要使用一种穷举法测试
这个循环结构的循环小于20次
在这个循环中
这个程序中大约有10的14次方个
可能的执行路径的组合
如果每毫秒执行一个测试
这个工作也要持续3170年
所以大家可以看出来
穷举法的测试是不可能完成的任务
那么通常我们会选择一些
代表性的路径进行测试
所以我们刚才提到了
我们软件测试当中
一共有两种大的测试方法的类别
也就是白盒测试方法和黑盒测试方法
我们在策略的基础上
使用不同的测试方法来进行我们的软件测试
白盒测试也称为玻璃盒测试或者结构化测试
是一种测试用例的设计方法
它利用构件级设计的一部分
所描述的控制结构来生成测试用例
利用白盒测试方法导出的测试用例
可以保证一个模块所有的独立路径
至少被执行一次
而且对所有的逻辑判断
我们都要测试其取真和取假的两个方面
另外在上下边界
及可操作的范围内执行所有的循环
最后要检验内部的数据结构以确保其有效性
在白盒测试当中会有一个概念
叫做基本路径测试
基本路径测试允许测试用例的设计者
计算出过程设计的逻辑复杂性的测量
并以这种测量为指导来定义执行路径的基本集合
执行该基本集合导出的测试用例
保证程序中的每一条语句至少执行一次
在基本路径的时候
我们会涉及到一个概念叫做环路复杂性
很多行业研究已经表明
环路复杂性越高
发生错误的概率也就越大
从这张图上我们可以看出来
这张图中的右侧灰色的部分
环路复杂性比较高
也是这个区域的模块更容易出错
那么怎么设计基本测试路径
我们下面来看一下这个例子
这样一个程序控制结构的程序
我们要导出它的独立路径
我们要经过几个步骤
首先我们要计算它的环路复杂性
这个控制结构的环路复杂性是4
因为环路复杂性计算的方法
是我们的判断的数量+1
或者是封闭区域的数量+1
那么这张图的环路复杂性是4
那我们就设计4个有代表性的测试路径
来测试这个程序
那么这4个代表性的测试路径是
第一条路径走过模块1 2 3 6 7 8
第二条路径走1 2 3 5 7 8
第三条测试基本路径走1 2 4 7 8
第四条路径走1 2 4 7 2 4
再最后走7和8
我们根据这样环路的复杂性
选择测试集合当中的基本路径的数量
然后导出我们的基本测试路径
我们在这里面要注意的问题是
每条新的路径需要引入一条新的边
另外我们要注意的一个问题是
基本测试路径的集合并不是一个唯一的
那么关于导出测试用例
我们要总结一下它的步骤
第一以设计或者是代码作为基础
画出它对应的流图
第二根据流图确定环路复杂性
环路复杂性决定了
独立路径的基本集合当中路径的数量
确定了线性的独立路径的基本集合
然后准备测试用例
使得基本集合中的每条路径都执行
另外测试白盒测试的方法图矩阵法
图矩阵是一种方阵
它的大小或者是行和列的数量
和流图当中的结点数量是一致的
每行和每列都对应着已标识出来的结点
矩阵中的项对应于结点之间的连接
也就是我们图中的边
通过在每个矩阵项中加入一个连接的权重
图矩阵就可以成为有效的测试
评估程序结构的一个强有力的工具
那在我们图中的例子当中有这样一个程序的流图
那么我们根据所有的节点1 2 3 4 5
这样设计了一个矩阵
当某个结点比如
结点2和结点3之间通过d这个边来连接
那在我们的图矩阵当中
2和3对应的位置上就标上了d这个边
那么图矩阵的一个好处就是可以
标明我们的边的权重
可以根据它权重的高和低
我们来设计我们的测试用例
另外一个是控制结构测试
基本路径测试是控制结构测试的技术之一
虽然基本路径测试简单且高效
但其本身并不充分
其他的控制结构测试的变体
拓宽了测试的覆盖率
并提高了白盒测试的质量
比如控制结构测试包括条件测试
条件测试通过检查程序模块中包含的逻辑条件
来进行测试用例设计
另外一个控制结构测试是数据流测试
根据程序中变量的定义
和使用的位置来选择程序的测试路径
我们下面看一下什么叫做数据流测试
数据流测试
测试方法根据程序中变量的定义
和使用位置这两个重要的结点
来选择程序测试的路径
假设程序中每个语句被分配了一个
唯一的语句编号
且每项功能不修改其参数和全局的变量
对于语句号为S的语句
我们可以定义为
它的定义的地方叫做DEF(S)
也就是语句S包含了X的定义
USE(S)也就是语句S包含了X的使用
那么变量X定义使用的这样的一个链就叫做
变量X的(DU)链
(DU)链具有形式这样[X, S, S’]
其中S和S’是语句号
在S处是变量X的定义
在S’是变量X的使用
那么我们应该在语句S中的X的定义
和X的使用
首先他们要都存在
另外我们设计测试用例
可以经过我们的X定义和X的使用
好 我们下面看一下循环测试
我们在软件的程序结构中
有一类很典型的结构就是循环结构
循环结构可以分为图中的简单循环
嵌套循环
串联循环和非结构化循环
那么对于简单循环
我们就是跳过整个循环是一次测试
只执行一次通过循环是一次测试
两次通过循环是一次测试
m次通过循环m小于循环的次数n
另外在n-1 n和n+1次通过循环
我们可以设计这样5个测试的用例
其中n是允许通过循环的最大次数
那么对于嵌套循环怎么测试
我们已经掌握了简单循环的测试方法
那么我们下面看一下嵌套循环
嵌套循环从最内层的循环开始
将其他的循环设置为最小值
对最内层的循环执行简单循环测试
而使外层的循环迭代次数值最小
并对范围以外或不包括在内的值增加其他测试
然后由内向外构造下一个循环的测试
但使其他的外层循环具有最小值
并使其他的嵌套循环为“典型”值
继续这样的过程
直到测试完成所有的循环
还有一种是串联循环
如果串联循环的每个循环是彼此独立的
则使用简单的循环方法就可以测试
如果循环是不彼此独立的
我们就建议使用嵌套循环的方式来进行测试
那么什么叫做不彼此独立
比如如果两个循环串接起来
第一个循环的循环次数为
第二个循环的初始值
那么这两个循环就不独立
在这种情况下
我们就不能使用简单循环来测试
而应该使用嵌套循环的方法来测试
那么对于第四种非结构化循环
我们通常希望重新设计这种程序结构
尽量不出现非结构化循环这种程序
看完了白盒测试
我们下面看一下黑盒测试
黑盒测试也称为行为测试或功能测试
侧重于软件的功能需求
黑盒测试是软件工程师设计出
可以测试程序的所有的功能需求的输入条件集
黑盒测试并不是白盒测试的替代品
而是作为发现其他类型错误的辅助方法
白盒测试在测试过程早期执行
黑盒测试在应用的测试的后期来执行
在黑盒测试中我们设计测试输入
然后通过我们的程序产生输出
然后我们比较测试的输出和预期的输出
来确定黑盒测试的结果
黑盒测试故意不考虑控制结构
而侧重于信息域
黑盒测试重点要测试如何测试功能的有效性
如何测试系统的行为和性能
哪种类型的输入会产生好的测试用例
系统是否对特定的输入值特别敏感
如何分离数据类的边界
系统能承受什么样的数据速率和数据量
特定类型的数据组合
会对系统运行产生什么样的结果
什么样的影响等等
基于图的测试方法
我们有一种测试方法是基于图的测试方法
它的步骤是
第一步
我们要理解
软件中建模的对象和对象之间的关系
然后设计覆盖图的一系列测试用例
使得图中的对象和关系都被测试到
并发现错误
比如我们右面这张图
就画出了一种基于图的测试方法
它设计了对象1 对象2 对象3
并显示了它们之间的关系
那么我们应该设计测试用例
使得对象和对象之间的关系都可以被测试到
再有一种是等价类划分方法
等价类划分是一种黑盒测试方法
它将程序的输入划分为若干个数据类
每个数据类内部是一类相似的输入
我们从每个数据类从中生成测试用例
理想的测试用例可以单独发现一类错误
(例如所有的字符数据处理不正确)
否则在观察到一般的错误之前
需要运行许多的测试用例
而等价类划分的测试用例设计时
我们就基于输入条件的等价类
来进行设计测试用例 进行评估
比如这张图显示的等价类划分
划分了几种等价类
其中包括用户的查询
鼠标的点击
输出的格式 提示和数据等等
我们等价类可以有以下几种情况
我们在这里举一个例子
比如有效的数据的等价类包括用户提供的命令
对系统提示的响应
文件名
计算数据
物理参数
边界值
初始值
输出数据的格式化
对于出错信息的响应
还有图形数据等等
那么无效的数据的等价类
还应该作为我们测试的范围
程序边界处以外的数据
物理上不可能的数据
有错误的地方提供的适当的值等等
除了等价的划分
我们还有一种边界值分析
边界值分析是一种测试用例的设计技术
是对等价类划分的一种补充
我们叫做
Boundary Value Analysis BVA
BVA不是选择等价类的任何元素
而是在等价类的“边缘”上选择测试用例
BVA不仅仅侧重于输入条件
它也从输出域中导出测试用例
根据输出找到输入的边界值相关
进行测试用例设计
另外还有一种是正交数组测试方法
正交数组测试方法适用于输入条件
输入参数的数量不多
且每个参数可取的值有明确的界定的时候
比如在图中我们有x y z这几种输入
那么图中左边的图
和右边的这个图的立方体中
显示的x y z的分布
大家可以看出来不同
我们正交数组的测试方法是
根据x y z的分布
使得它在这个正交空间中
分布比较均匀的输入参数设计
还有基于模型的测试
我们基于模型的测试叫做
Model based testing MBT
基于模型的测试是一种黑盒测试技术
它使用需求模型中的信息
作为生成测试用例的基础
使用UML建模语言的状态图
作为测试用例设计的基础
我们看一下基于模型测试的几个步骤
首先我们分析软件已有的行为模型
或者为它创建一个行为模型
然后我们回顾一下一个行为模型表明了
这个软件将如何对外部事件和刺激做反应
然后我们要遍历行为模型
并标明使得软件在状态之间转换的输入
输入将触发事件
使得状态转换发生
然后我们回顾行为模型
标注当软件在状态之间转换的时候
所期望的预期的输出
然后运行测试用例
来比较实际的输出和预期的输出之间的差距
然后根据需要采取纠正措施
基于模型的测试重点就是
关心我们的软件在整个运行过程中
所进行的状态的变迁
并且有哪些的事件和行为促使了状态的变迁
然后根据这样的状态变迁过程
来设计测试用例刺激软件进行状态变迁
然后比较预期输出和实际输出之间的差距
来进行软件测试的一个方法
我们最后看一下软件测试模式
我们软件测试模式
和我们之前在设计模式中讲过的模式类似
测试模式是以相同方式被描述为设计模式
模式作为描述特定的设计问题
和解决方案的一种机制
但是模式也可以用于
提出其他软件工程的解决方案
不仅仅用于设计领域
比如测试
我们的测试模式可以描述常见的测试问题
和对应的解决方案
可以辅助软件工程师处理这一类问题
并重复的运用设计模式来处理这一类问题
比如我们看一个软件测试模式的例子
叫做场景模式
场景模式是指
一旦进入了单元测试和集成测试
有必要确定该软件
是否会以满足用户的方式来执行
那么场景测试模式描述了一种技术
用于从用户的角度来运行软件
在这个级别上的故障表明
该软件已经无法满足用户的可视化的需求
那么场景模式是
设计模式在软件测试领域的应用的
一个测试模式的代表
那么到这里面
我们对于测试传统的应用系统
已经学习了白盒测试方法
黑盒测试方法
基于模型型的测试方法和软件测试模式
那么关于测试传统的应用系统
我们今天就学习到这里
谢谢大家
-课程概述
-1.1 软件的本质
-1.2 软件工程
--1.2 软件工程
-1.3 软件过程结构
-1.4 过程模型
--1.4 过程模型
-1.5 敏捷开发方法
-第1章 习题
--第1章 习题
-2.1 需求工程过程
-2.2 需求获取
--2.2 需求获取
-2.3 需求分析
--2.3 需求分析
-2.4 过程建模
--2.4 过程建模
-2.5 面向对象建模
-第2章 习题
--第2章 习题
-3.1 设计概述
--3.1 设计概述
-3.2 设计的概念
-3.3 设计模型元素
-3.4 体系结构概述
-3.5 体系结构风格
-3.6 构件级设计
-3.7 UI设计
--3.7 UI设计
-3.8 基于模式的设计
-第3章 习题
--第3章 习题
-4.1 UML概述
-4.2 UML 及UML中的事物
-4.3 UML关系和图
-4.4 UML 图细节(上)
-4.4 UML 图细节(下)
-第4章 习题
--第4章 习题
-5.1 软件测试策略
-5.2 测试传统的应用系统
-5.3 测试面向对象的应用系统
-5.4 测试web应用系统
-5.5 测试移动应用系统
-第5章 习题
--第5章 习题
-6.1 软件项目估算
-6.2 软件过程管理
-6.3 软件配置管理
-6.4 项目版本控制及调试
-第6章 习题
--第6章 习题