友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

软件测试的艺术(中文清晰版)(PDF格式)-第5章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






  另外,心理学研究表明,当人们开始一项工作时,如果已经知道它是不可行 



的或无法实现时,人的表现就会相当糟糕。举例来说,如果要求人们在15分钟之 



内完成星期日《纽约时报》里的纵横填字游戏,那么我们会观察到10分钟之后的 



进展非常小,因为大多数人都会却步于这个现实,即这个任务似乎是不可能完成 



的。但是如果要求在四个小时之内完成填字游戏,我们很可能有理由期望在最初 



10分钟之内的进展会比前一种情况下的大。将软件测试定义为发现程序错误的过 



程,使得测试是个可以完成的任务,从而克服了这个心理障碍。 



  诸如“软件测试就是证明‘软件做了其应该做的’的过程”此类的定义所带 



来的第三个问题是,程序即使能够完成预定的功能,也仍然可能隐藏错误。也就 



是说,当程序没有实现预期功能时,错误是清晰地显现出来的;如果程序做了其 



不应该做的,这同样是一个错误。考虑一下第1章中的三角形测试程序。即使我们 



证明了程序能够正确识别出不规则三角形、等腰三角形和等边三角形,但是在完 



成了不应执行的任务后(例如将1,2 ,3说成是一个不规则三角形或将0 ,0 ,0说 



成是一个等边三角形),程序仍然是错的。如果我们将软件测试视作发现错误的过 



程,而不是将其视为证明“软件做了其应该做的”的过程,我们发现后一类错误 



的可能性会大很多。 



  总结一下,软件测试更适宜被视为试图发现程序中错误(假设其存在)的破 



坏性的过程。一个成功的测试用例,通过诱发程序发生错误,可以在这个方向上 



促进软件质量的改进。当然,最终我们还是要通过软件测试来建立某种程度的信 



心:软件做了其应该做的,未做其不应该做的。但是通过对错误的不断研究是实 


…………………………………………………………Page 19……………………………………………………………

                       第2章 软件测试的心理学和经济学   7 



现这个目的的最佳途径。 



  有人可能会声称“本人的程序完美无缺”(不存在错误),针对这种情况建立 



起信心的最好办法就是尽量反驳他,即努力发现不完美之处,而不只是确认程序 



在某些输入情况下能够正确地工作。 



2。2   软件测试的经济学 



  给出了软件测试的适当定义之后,下一步就是确定软件测试是否能够发现 



“所有”的错误。我们将证明答案是否定的,即使是规模很小的程序。一般说来, 



要发现程序中的所有错误也是不切实际的,常常也是不可能的。这个基本的问题 



反过来暗示出软件测试的经济学问题、测试人员对被测软件的期望,以及测试用 



例的设计方式。 



  为了应对测试经济学的挑战,应该在开始测试之前建立某些策略。黑盒测试 



和白盒测试是两种最普遍的策略,我们将在下面两节中讨论。 



2。2。1   黑盒测试 



  黑盒测试是一种重要的测试策略,又称为数据驱动的测试或输入/输出驱动的 



测试。使用这种测试方法时,将程序视为一个黑盒子。测试目标与程序的内部机制 



和结构完全无关,而是将重点集中放在发现程序不按其规范正确运行的环境条件。 



  在这种方法中,测试数据完全来源于软件规范(换句话说,不需要去了解程 



序的内部结构)。 



  如果想用这种方法来发现程序的所有错误,判定的标准就是“穷举输入测试”, 



将所有可能的输入条件都作为测试用例。为什么这样做?比如说在三角形测试的 



程序中,试过了三个等边三角形的测试用例,这不能确保正确地判断出所有的等 



边三角形。程序中可能包含对边长为3842 ,3842 ,3842 的特殊检查,并指出此三 



角形为不规则三角形。由于程序是个黑盒子,因此能够确定此条语句存在的惟一 



方法,就是试验所有的输入情况。 



  要穷举测试这个三角形程序,可能需要为所有有效的三角形创建测试用例, 



只要三角形边长在开发语言允许的最大整数值范围内。这些测试用例本身就是天 



文数字,但这还绝不是所谓穷尽的;当程序指出-3 ,4 ,5是一个不规则三角形或 



2 ,A ,2是一个等腰三角形时,问题就暴露出来了。为了确保能够发现所有这样的 


…………………………………………………………Page 20……………………………………………………………

8  软件测试的艺术 



错误,不仅得用所有有效的输入,而且还得用所有可能的输入进行测试。因此, 



为了穷举测试三角形程序,实际上需要创建无限的测试用例,这当然是不可能的。 



  如果测试这个三角形程序都这么难的话,那么要穷举测试一个稍大些的程序 



的难度就更大了。设想一下,如果要对一个C++编译器进行黑盒穷举测试,不仅 



要创建代表所有有效C++程序的测试用例(实际上,这又是一个无穷数),还需要 



创建代表所有无效C++程序的测试用例(无穷数),以确保编译器能够检测出它们 



是无效的。也就是说,编译器必须进行测试,确保其不会执行不应执行的操作— 



如顺利地编译成功一个语法上不正确的程序。 



  如果程序使用到数据存储,如操作系统或数据库应用程序,这个问题会变得 



尤为严重。举例来说,在航班预定系统这样的数据库应用程序中,诸如数据库查 



询、航班预约这样的事务处理需要随上一次事务的执行情况而定。因此,不仅要 



测试所有有效的和无效的事务处理,还要测试所有可能的事务处理顺序。 



  上述讨论说明,穷举输入测试是无法实现的。这有两方面的含义,一是我们 



无法测试一个程序以确保它是无错的,二是软件测试中需要考虑的一个基本问题 



是软件测试的经济学。也就是说,由于穷举测试是不可能的,测试投入的目标在 



于通过有限的测试用例,最大限度地提高发现的问题的数量,以取得最好的测试 



效果。除了其他因素之外,要实现这个目标,还需要能够窥见软件的内部,对程 



序作些合理但非无懈可击的假设(例如,如果三角形程序将2 ,2 ,2视为等边三角 



形,那就有理由认为程序对3 ,3 ,3也作同样判断)。这种思路将形成本书第4 章中 



测试用例设计策略的部分方法。 



2。2。2    白盒测试 



  另一种测试策略称为白盒测试或称逻辑驱动的测试,允许我们检查程序的内部 



结构。这种测试策略对程序的逻辑结构进行检查,从中获取测试数据(遗憾的是, 



常常忽略了程序的规范)。 



  在这里我们的目标是针对这种测试策略,建立起与黑盒测试中穷举输入测试 



相似的测试方法。也许有一个解决的办法,即将程序中的每条语句至少执行一次。 



但是我们不难证明,这还是远远不够的。这种方法通常称为穷举路径测试,在本 



书第4 章中将进一步进行深入探讨,在这里就不多加叙述。所谓穷举路径测试,即 



如果使用测试用例执行了程序中所有可能的控制流路径,那么程序有可能得到了 


…………………………………………………………Page 21……………………………………………………………

                          第2章 软件测试的心理学和经济学       9 



完全测试。 



   然而,这个论断存在两个问题。首先,程序中不同逻辑路径的数量可能达到天 



文数字。图2…1所示的小程序显示 



了这一点。该图是一个控制流图,                      a 



每一个结点或圆圈都代表一个按 



顺序执行的语句段,通常以一个 



分支语句结束。每一条边或弧线 



表示语句段之间的控制(分支) 



的转换。图2…1描述的是一个有着 



10~20 行语句的程序,包含一个 



迭代20 次的DO 循环。在DO 循环 



体中,包含一系列嵌套的IF语句。 



要确定不同逻辑路径的数量,也 



相当于要确定从点a ~点b 之间所 



有不同路径的数量(假定程序中 



所有的判断语句都是相互独立 

                                    b 

的)。这个数量大约是1 0 1 4 ,即 



          20 19  1 

100万亿,是从5  +5 …+5  计算 

                           图2…1   一个小型程序的控制流图 

而来,5是循环体内的路径数量。 



由于大多数的人难以对这个数字有一个直观的概念,不妨设想一下:如果在每五 



分钟内可以编写、执行和确认一个测试用例,那么需要大约10亿年才能测试完所 



有的路径。假如可以快上300倍,每一秒就完成一次测试,也得用漫长的320万年 



才能完成这项工作。 



   当然,在实际程序中,判断并非都是彼此独立的,这意味着可能实际执行的 



路径数量要稍微少一些。但是,从另一方面来讲,实际应用的程序要比图2…1所描 



述的简单程序复杂得多。因此,穷举路径测试就如同穷举输入测试,非但不可能, 



也是不切实际的。 



   “穷举路径测试即完全的测试”论断存在的第二个问题是,虽然我们可以测试 



到程序中的所有路径,但是程序可能仍然存在着错误。这有三个原因。 



   第一,即使是穷举路径测试也决不能保证程序符合其设计规范。举例来说, 


…………………………………………………………Page 22……………………………………………………………

10  软件测试的艺术 



如果要编写一个升序排序程序,但却错误地编成了一个降序排序程序,那么穷举 



路径测试就没多大价值了;程序仍然存在着一个缺陷:它是个错误的程序,因为 



不符合设计的规范。 



  第二,程序可能会因为缺少某些路径而存在问题。穷举路径测试当然不能发 



现缺少了哪些必需路径。 



  第三,穷举路径测试可能不会暴露数据敏感错误。这样的例子有很多,举一 



个简单的例子就能说明问题。假设在某个程序中要比较两个数值是否收敛,也就 



是检查两个数值之间的差异是否小于某个既定的值。我们可能会这样编一条Java 



语言的IF语句: 



当然,这条语句明显错了,因为程序原意是将c与a…b 的绝对值进行比较。然而,要 



找出这样的错误,取决于a和b 所取的值,而仅仅执行程序中的每条路径并不一定 



能找出错误来。 



返回目录 上一页 下一页 回到顶部 1 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!