软件测试是软件开发中非常重要的一个环节。
那么在世界的 IEEE
的软件工程 大会上,这是软件工程顶级的会议,
每年有三分之一的论文来自于软件测试,所以大家可以看到,逐渐
这个研究人员对这个软件测试的这个问题的这样 的一个重视程度,也说明软件测试是我们软件开发中
不得不面对,但是一直很难去解决的一个什么? 困难的问题。
所以我们今天来看一下,软件测试这么 重要,那么我们应该掌握一些什么样的软件测试的思想
到我们的这个开发中,那么让我们在进行软件
分析设计,包括软件的这个编码的过程中,能够有一些这样的一些意识。
我们先举几个小的案例,那么迪斯尼呢在 1994
年呢 它发布了第一个面向儿童的多媒体光盘游戏,就 Lion King
这个,那么这个游戏是成为那个夏天的所有的孩子的谈论的资本。
所以大家看,足以看出它是多么火啊,但是在 12
月 26 号圣诞节后的这个一天啊,迪斯尼公司的客户支持电话
开始响个不停,电话支持部门接受到的都是家长愤怒的整个这个投诉啊。
就是说明,说孩子在这个玩的过程中遇到的种种的问题。
后来,迪斯尼这个公司也很负责任,这个相当于坐下来开始进行深刻地反思,
我们到底什么地方做错了?OK,这是他们反思的结果,也就是说 迪斯尼公司没有对市场上投入使用的各种 PC
进行正确的测试,也就是说我们现在所说的什么? 兼容性的测试。
那么软件在少数系统中 正常工作,例如迪斯尼的程序员用于开发游戏的系统。
但在大众使用的常用的系统中却不断地出现各种问题。
所以大家看这个看似觉得人们应该能够有一种常识都能解决的问题,但是 就真正地发生了。
大家可以看到,软件测试 如果做得不好,没有发现
软件测试相当于没有如果做得很彻底,帮我们把那些重要的错误抓出来的话,
那可能对于程序,整个相当于造成一个致命性的这样的一个后果。
那么我们怎么去看待软件测试呢?也就是说软件测试到底要做什么呢? 那么软件测试,它指的是
检测和评价软件,以确定其质量的过程和方法。
那么即评价软件和程序的属性和能力,以确定它是否满足 所需结果的过程和方法。
所以大家看,最终希望的是什么? 确定这个软件的质量到底达没达到这个要求啊,那么
这个程序相当于它的这种属性和它的整个这个功能能力是否是像 原来它所说的那个样子。
那么软件测试 我们可以分为两种经典的技术,一个就是静态分析技术,一个是动态测试技术。
很多的人在没有学这个之前,认为测试就是 一个动态的这样的一个测试,这是错误的一个概念。
那么软件测试的静态分析指的是通过检查和审阅
这个程序加文档来帮助找到程序中的错误。
那么动态测试呢是运行和使用这个软件 来去发现程序中的这样的一个错误。
所以我们来看一下,那么在静态分析的时候
我们不运行软件,我们是通过对源代码进行分析,那么检测程序的控制流和数据流,
发现执行不到的死代码
那么无限地循环,未初始化的变量,包括未使用的数据,重复定义的数据等等。
那么也可以包括对多种复杂性度量值的这样的一个计算,所以这个时候大家可以看到
如果我能够在动态测试之前,就能够应用静态分析的这样的一个技术
对于源代码进行系统的这样的一个分析,就能查到一些什么?
源代码中一些非常容易被检测到的一些错误,对吧?这些错误的这样的一个去除,
能帮助我扫清一些动态测试的这样的一个压力啊。
所以这个经常是动态测试前 有用的这样的一个质量检测的手段。
所以我也希望大家 在进行编码的过程中有意识的
去看一下,你的这个程序里面,源代码里面有没有类似的这样的一些问题。
那么动态的测试技术呢是借助于输入的测试样例
那么这个测试用例,它一般指的什么含义?就是对
给定的一组的输入,那我这个系统,或者这个软件 能够给出指定的这样的一个输出。
那么由固定的输入和输出的这样的一个啊 数据量构成的整个就是测试用例。
那么一般情况下这个动态测试又称为功能测试啊,就是分为,我们也称为
黑盒测试,那么以及结构测试我们又称为 白盒测试。
有的同学说老师我还看过灰盒测试对吧? 不白不黑的,在中间的,那么这种呢实际上是所谓
的灰盒测试是白盒测试技术和黑盒测试技术之间的这样的一种中间的测试。
所以我们还是把在这两种技术基础上你就能够去理解灰盒测试这样的一些特点。
那我们来看一下,软件测试 目标是什么?人们就想了说软件测试我们希望它预防错误,
但是不犯错误的这个程序员这基本上是没有的对吧? 那么也就是说他由于对一些分析设计的这样的一个理解
有误,或者他对一些编程语言的这样的一个错误的应用都会给软件带来一些错误。
所以这个,预防错误,让他不出现错误这是不可能的。
那么如果这一点做不到的话我们大家看 我们的追求,第二个吧,那我就如果出现了错误我尽可能去发现它。
那么发现错误是成为软件测试最重要的这样的一个目标。
那么错误我们可以把它分为哪几类呢?我们来看一下 一般我们可以分为这五类啊,这个是从美国的
Patton 写的 软件测试这本书里面来的这个错误的分类,我觉得他介绍的还是很 这个详尽的。
第一个就是说软件未达到产品说明书标注的功能。
对吧,我说了为用户提供这样一个功能,但我实际中用户使用的时候
发现根本没有达到他说的那些功能,实际上就说明了软件已经出现错误了啊。
那么第二就是产品出现了产品 说明书指明不会出现的错误,你的产品说明书实际上
要来说明可能我会这个系统中会出现哪些的错误啊, 这个相当于应该有这样的一个罗列,但是它
出现的错误不在你那个列表中,那这个时候也是一种致命的错误。
那么还有一个,软件功能超出产品说明书的范围。
也就是说,产品说明书有说有这些功能,我希望的是我把这个东西能做得更好一点,
我实现了你没有说的这样的一些功能,这也是不行的,这也被看作是一种错误。
所以大家可以看到就是说不是说锦上添花永远是好的,在这种软件测试中如果这样的一个
对于软件范围的无限制的蔓延那么也是造成这个错误的一个很重要的根源。
那么还有一点,就是说软件未达到软件说明书虽未指出,但应该达到的目标。
因为有一些 这个业务领域,它有一些暗含的我们说的
这个叫潜需求,对吧? 我们不叫潜规则,叫潜需求,这种实际上是指暗含的
我不需要,不言自明的,你就应该满足的一些东西。
比如说我们 军方的一些,对吧?一些这个软件,那么它对于安全性的这样的一些要求
就非常的高,包括对一些软件这样的一些,跟它交互的这样一些软件都要求的很高,对吧-
?就是说 所以在这个过程中相当于你要来去看,那个领域所
有的一些潜在的这样的一些需求有哪些,你需要把它 明确,尽量去满足。
那还有一个是软件测试员认为软件难以理解,不易使用, 运行速度缓慢或最终用户认为不好。
所以大家看啊 也就是说在软件的易用性,对吧,可使用性等方面
这个也是这个造成错误的一个根源,因为目前用户
就是上帝,所以用户不买单,那就说明你的软件没有达到人家的要求。
所以 用户的满意度是软件测试很重要的一个衡量的指标啊。
我们来看一下软件测试和软件调试两者之间到底有
什么区别,我们在做了软件调试帮助我们解决了什么样的问题。
那么软件的调试它是发现所编写软件中的错误对吧? 希望能确定错误的位置,我来进一步地改正它。
那个进而呢这个软件在解除了这个错误的情况下能进一步地什么?
再继续执行,这是我们希望调试过程中不断地帮助我们去发现错误 去定位错误,我们再去解决它。
那么在进行 调试工作以前呢,我们需要做的就是
发现错误的迹象,对吧,大家经常说设置断点,应用这个
调试器,一看说,这个函数相当于就跳转整个,我就跳在这个函数之前
发现这个函数相当于就不出来了对吧?程序相当于就就就一直相当于
这个这个无限制的这样的一个循环下去,那这个时候大家就知道这个函数的里面 肯定一些变量啊,处理啊是不是出现了问题。
所以这个 里面一般情况下你已经对一些错误有了一定的分析,
那么随后呢你要确定问题的性质,并找到该错误在软件中可能的这种位置,
进一步修正这个错误,所以这个我们一般用调试器呢就帮助我们来去解决。
那么我们测试在做的 实际上是既然也是发现错误,但是我希望的是,更多的是什么?
测试从一个侧面证明程序员出错的地方,对吧?
那么调试它希望的是我要不断地发现问题,解决问题,证明我这个程序员编写的这个程序相当- 于它的逻辑是正确的,
希望这个程序最终能正确的运行,但是测试是我希望 的尽可能多,尽管它能正确的运行也不是我的目标,
我希望的是能找到里面尽可能多的错误, 对我这个软件的运行也好,对于这个安全也好,对于等等
的这个方面,相当于造成的一些等级比较高的这种错误,我把它排除。
所以这一点,两者之间呢整个的这个区别就第一点非常明显的显露出来。
那么第二个就是测试呢,是在已知条件开始,使用预先定义的程序
那么同时呢对于这个测试的用例, 对于给定的输入一定要形成给定的输出。
如果你给定的输入之后相当于 没有形成给定的输入,那说明没有通过测试。
所以这个测试只是说我到底能不能通过的问题啊。
那么调试呢是以不可知的内部条件来开始的 所以结果经常是不可预测的。
所以这个测试是能预测的,调试 是无法预测的。
那么还有一点就是测试是有计划进行的啊,就是说它要进行
测试的设计,我们这节课的时候大家可以看到讲到那个测试步骤的时候我们再回顾一下
比如说单元测试对吧?集成测试、 确认测试 包括系统测试,那么这几个测试阶段实际上
我相应的测试计划都应该在软件分析中的前期来给出来的。
调试是不受时间的约束对吗?那也就是说调试人员 编码人员相当于是突发奇想,我可能就随意地进行一个
这个调试来去帮助我去来找到相应的错误。
那么另一个就是测试是发现错误、 改正错误 重新测试的过程,调试呢是一个推理的过程,我一步步的去,去走对吧,走这个程序,
一直走到一个这个出错点,那我再开始分析这是什么地方的问题 去解决,所以这个是不断的一个推理的过程。
测试的执行也是有规律的啊。
那么调试呢经常程序员的这样的一个经验,它有一种灵感在里面
对吧?经常编写了这个程序它就是通不过,你都感觉到已经想拍案而起
觉得这个程序太笨了,到底什么地方出现问题,但是你可能某一时刻恍然大悟说
我的那个地方出现了问题,所以这有的时候是一种你的直觉的这样的一个飞跃啊。
那还有测试经常是由独立的测试组,也就是
独立于软件开发人员的这个第三方的测试组 在不了解软件设计的条件下去完成的。
调试呢经常是由软件开发人员,对吧,去进行的。
那么还有就是说大多数的测试啊,这个相当于可以用一些辅助工具来去帮助执行。
调试呢是用的这个调试器来帮助我们来进行 的,所以两者的工具也是不一样的。