软件测试的艺术(中文清晰版)(PDF格式)-第3部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
10。2 测试的挑战……………………………………………………………………159
10。3 测试的策略……………………………………………………………………161
10。3。1 表示层的测试 ……………………………………………………………163
10。3。2 业务层的测试 ……………………………………………………………165
10。3。3 数据层的测试 ……………………………………………………………167
10。4 小结 …………………………………………………………………………169
第11章 移动应用测试 ……………………………………………………………171
11。1 移动环境 ……………………………………………………………………171
11。2 测试面临的挑战………………………………………………………………173
11。2。1 移动设备多样性 …………………………………………………………173
11。2。2 运营商网络基础设施 ……………………………………………………174
11。2。3 脚本编程 …………………………………………………………………176
11。2。4 可用性测试 ………………………………………………………………177
11。3 测试方法 ……………………………………………………………………177
11。3。1 真机测试 …………………………………………………………………179
11。3。2 基于模拟器的测试 ………………………………………………………181
11。4 小结 …………………………………………………………………………182
附录A 极限编程示例程序 …………………………………………………………184
附录B 小于1000的素数 ……………………………………………………………190
…………………………………………………………Page 13……………………………………………………………
第1 章
Chapter 1
一次自评价测试
自本书30年前首次出版以来,软件测试变得比以前容易得多,也困难得多。
软件测试何以变得更困难?原因在于大量的编程语言、操作系统以及硬件平
台的涌现。在20世纪70年代只有相当少的人使用计算机,而在今天几乎人人离不
开计算机。而今天计算机不仅仅是指摆在你书桌上的计算机了,几乎所有我们所
接触和使用的电子设备都内置了一个“计算机”或者计算芯片,以及运行在其上
的软件系统。不妨回想一下在今天的社会中还在使用哪些不需要软件驱动的设备,
没错,锤子和手推车是,但是这些工具也大量使用在由软件控制和操作的车间中。
软件的普遍应用提升了测试的意义。今天的设备已经千百倍强于它们的“前辈”,
今天的“计算机”这个概念也变得越来越广泛和越来越难准确地定义。数字电视、
电话、游戏产品、汽车等都有一颗计算机的“心”以及运行其中的软件,以至于
在某些情况下它们自己本身也能够被看做是一台特别的计算机。
因此,现在的软件会潜在地影响到数以百万计的人,使他们更高效地完成工作,
反之也会给他们带来数不清的麻烦,导致工作或事业的损失。这并不是说今天的软件
比本书第1版发行时更重要,但可以肯定地说,今天的计算机(以及驱动它的软件)
无疑已影响到了更多的人、更多的行业。
就某些方面而言,软件测试变得更容易了,因为大量的软件和操作系统比以
往更加复杂,内部提供了很多已充分测试过的例程供应用程序集成,无须程序员
从头进行设计。例如,图形用户界面(GUI )可以从开发语言的类库中建立起来,
同时,由于它们是经过充分调试和测试的预编程对象,将其作为自定义应用程序
的组成部分进行测试的要求就减少了许多。
另外,尽管市场上的测试书籍越来越多,甚至有过剩之嫌,似乎依旧有很多开
发人员对全面的测试并不那么欢迎。引入更优秀的开发工具、使用已经通过测试
…………………………………………………………Page 14……………………………………………………………
2 软件测试的艺术
的GUI (图形界面控件)控件、紧张的交付日期以及高度集成的便利开发环境会让
测试变得仅仅是让那些最基本的测试用例走走过场罢了。影响不大的bug 也许只不
过会让最终用户觉得使用不方便而已,然而严重的bug 则可能造成经济损失甚至是
人身伤害。本书所阐述的方法旨在帮助设计人员、开发工程师以及项目经理更好
地理解全面综合测试的意义所在,并提供行之有效的指南以帮助达成测试的目标。
所谓软件测试,就是一个过程或一系列过程,用来确认计算机代码完成了其
应该完成的功能,不执行其不该有的操作。软件应当是可预测且稳定的,不会给
用户带来意外惊奇。在本书中,我们将讨论多种方法来达到这个目标。
好了,在开始阅读本书之前,我们想让读者做一个小测验。我们要求设计一
组测试用例(特定的数据集合),适当地测试一个相当简单的程序。为此要为该程
序建立一组测试数据,程序须对数据进行正确处理以证明自身的成功。下面是对
该程序的描述:
这个程序从一个输入对话框中读取三个整数值,这三个整数值代表
了三角形三条边的长度。程序显示提示信息,指出该三角形是何种三角
形:不规则三角形、等腰三角形还是等边三角形。
注意,所谓不规则三角形是指三角形中任意两条边不相等,等腰三角形是指
有两条边相等,而等边三角形则是指三条边相等。另外,等腰三角形等边的对角
也相等(即任意三角形等边的对角也相等),等边三角形的所有内角都相等。
用你的测试用例集回答下列问题,借以对其进行评价。对每个回答“是”的答
案,可以得1分:
1。 是否有这样的测试用例,代表了一个有效的不规则三角形?(注意,如1、
2 、3和2 、5 、10这样的测试用例并不能确保“是”的答案,因为具备这样
边长的三角形不存在。)
2。 是否有这样的测试用例,代表一个有效的等边三角形?
3。 是否有这样的测试用例,代表一个有效的等腰三角形?(注意,如2 、2 、4
的测试用例无效,因为这不是一个有效的三角形。)
4。 是否至少有三个这样的测试用例,代表有效的等腰三角形,从而可以测试
到两等边的所有三种可能情况(如3 、3 、4 ;3 、4 、3 ;4 、3 、3 )?
5。 是否有这样的测试用例,某边的长度等于0 ?
…………………………………………………………Page 15……………………………………………………………
第1章 一次自评价测试 3
6。 是否有这样的测试用例,某边的长度为负数?
7。 是否有这样的测试用例,三个整数皆大于0 ,其中两个整数之和等于第三
个?(也就是说,如果程序判断1、2 、3表示一个不规则三角形,它可能就
包含一个缺陷。)
8。 是否至少有三个第7类的测试用例,列举了一边等于另外两边之和的全部可
能情况(如1、2 、3 ;1、3 、2 ;3 、1、2 )?
9。 是否有这样的测试用例,三个整数皆大于0 ,其中两个整数之和小于第三个
整数(如1、2 、4 ;12、15、30 )?
10。 是否至少有三个第9类的测试用例,列举了一边大于另外两边之和的全部
可能情况(如1、2 、4 ;1、4 、2 ;4 、1、2 )?
11。 是否有这样的测试用例,三边长度皆为0 (0 ,0 ,0 )?
12。 是否至少有一个这样的测试用例,输入的边长为非整数值(如2。5、3。5、5。5)?
13。 是否至少有一个这样的测试用例,输入的边长个数不对(如仅输入了两
个而不是三个整数)?
14。 对于每一个测试用例,除了定义输入值之外,是否定义了程序针对该输入值
的预期输出值?
当然,测试用例集即使满足了上述条件,也不能确保能查找出所有可能的错
误。但是,由于问题1至问题13代表了该程序不同版本中已经实际出现的错误,对
该程序进行的充分测试至少应该能够暴露这些错误。
开始关注自己的得分之前,请考虑以下情况:以我们的经验来看,高水平的
专业程序员平均得分仅7。8 (满分14)。如果读者的得分更高,那么祝贺你。如果
没有那么高,我们将尽力帮助你。
这个测验说明,即使测试这样一个小的程序,也不是件容易的事。因此,想
象一下测试一个十万行代码的空中交通管制系统、一个编译器,甚至一个普通的
工资管理程序的难度。随着面向对象编程语言(如Java 、C++ )的出现,测试也变
得更加困难。举例来说,为测试这些语言开发出来的应用程序,测试用例必须要
找出与对象实例或内存管理有关的错误。
从上面这个例子来看,完全地测试一个复杂的、实际运行的程序似乎是不太可能
的。情况并非如此!尽管充分测试的难度令人望而生畏,但这是软件开发中一项非常
必需的任务,也是可以实现的一部分工作,通过本书我们可以认识到这一点。
…………………………………………………………Page 16……………………………………………………………
第2 章
Chapter 2
软件测试的心理学和经济学
软件测试是一项技术性工作,但同时也涉及经济学和人类心理学的一些重要因素。
在理想情况下,我们会测试程序的所有可能执行情况,而在大多数情况下,
这几乎是不可能的。即使一个看起来非常简单的程序,其可能的输入与输出组合
可达到数百种甚至数千种,对所有的可能情况都设计测试用例是不切合实际的。
对一个复杂的应用程序进行完全的测试,将耗费大量的时间和人力资源,这样在
经济上是不可行的。
另外,要成功地测试一个软件应用程序,测试人员也需要有正确的态度(也
许用“愿景”(vision )这个词会更好一些)。在某些情况下,测试人员的态度可能
比实际的测试过程本身还要重要。因此,在深入探讨软件测试的本质之前(指技
术层面),我们先探讨一下软件测试的心理学和经济学问题。
2。1 软件测试的心理学
测试执行得差,其中一个主要原因在于大多数的程序员一开始就把“测试”
这个术语的定义搞错了。他们可能会认为:
“软件测试就是证明软件不存在错误的过程。”
“软件测试的目的在于证明软件能够正确完成其预定的功能。”
“软件测试就是建立一个‘软件做了其应该做的’信心的过程。”
这些定义都是本末倒置的。
每当测试一个程序时,应当想到要为程序增加一些价值。通过测试来增加程
序的价值,是指测试提高了程序的可靠性或质量。提高了程序的可靠性,是指找
出并最终修改了程序的错误。
…………………………………………………………Page 17……………………………………………………………
第2章 软件测试的心理学和经济学 5
因此,不要只是为了证明程序能够正确运行而去测试程序;相反,应该一开
始就假设程序中隐藏着错误(这种假设对于几乎所有的程序都成立),然后测试程
序,发现尽可能多的错误。
那么,对于测试,更为合适的定义应该是:
“测试是为发现错误而执行程序的过程”。
虽然这看起来像是个微妙的文字游戏,但确实有重要的区别。理解软件测试
的真正定义,会对成功地进行软件测试有很大的影响。
人类行为总是倾向于具有高度目标性,确立一个正确的目标有着重要的心理
学影响。如果我们的目的是证明程序中不存在错误,那就会在潜意识中倾向于实
现这个目标;也就是说,我们会倾向于选择可能较少导致程序失效的测试数据。
另一方面,如果我们的目标在于证明程序中存在错误,我们设计的测试数据就有
可能更多地发现问题。与前一种方法相比,后一种方法会更多地增加程序的价值。
这种对软件测试的定义,包含着无穷的内蕴,其中的很多都蕴涵在本书各处。
举例来说,它暗示了软件测试是一个破坏性的过程,甚至是一个“施虐”的过程,
这就说明为什么大多数人都觉得它困难。这种定义可能是违反我们愿望的;所幸
的是,我们大多数人总是对生活充满建设性而不是破坏性的愿景。大多数人都本