查看文章 |
来自http://www.17testing.com/bbs/viewthread.php?tid=659&extra=page%3D1
一个更恰当的定义是: 测试是挑错的过程。这虽然听起来有点像文字游戏,但这的确是一个重大区别。理解软件测试的真实含义能深远的影响一个人能取得多大成功。
人是高度目的性的,建立合适目标对心理有重要影响。如果我们的目标是表明程序无错,那我们潜意识里就向这个目标前进;也就是说,我们趋向于选择那些不太可能使程序失败的测试数据,如果目标是使程序失败,那我们的测试数据就更可能找到错误。后一种方法能增加更多价值到里面。
这个定义给与我们大量启示,许多分散在本书之中。例如,他意味着,测试是一个破坏过程,甚至是“虐待”的过程,这就是为什么许多人认为测试很困难。那可能违背了我们的初衷,学多人对于生活的看法都是建设性的,而非破坏性。许多人倾向于创造事物而非破坏它们。这个定义还暗含着怎么设计test cases(test data),和谁应该谁不该测试程序。
对“成功”和“失败”的分析,能提高我们对这个定义的理解一一一般来讲,项目经理利用他们来划分测试案例(test cases)。许多项目经理把一个没有找到错误的test case 归入 “successful test run”,而把找到错误的归入“unsuccessful”。
【----成功的case是可以通过它发现错误的!----】
这又一次本末倒置了。“unsuccessful”表明一些不需要或失望的东西。我们认为,测试称得上成功的,当它能找到错误,并且这些错误能修复。或者这些测试最终表明不会有错误发生。唯一失败的情况是:这些测试没能恰当的检查软件。一般,测试如果没有找到错误被认为是失败的,因为程序不含错误基本上是不现实的。
找到错误的测试案例(test case)不应该归入“unsuccessful”,相反,这才是有价值的。失败的测试案例(test case) 是那些仅表明程序能正确执行的。
我们做一个类比,当某人感到不舒服去见医生。如果这个医生做了一些检查,但并没找他不舒服的原因,我们不会把这些检查称做“successful”;这些检查是失败的,因为他花了病人的钱,但好无效果。此时,病人可能质疑他作为医生的能力。相反,当这些检查表明病人有消化溃疡“peptic ulcer”,这个检查被称做成功的,因为紧接着医生就能进行恰当的治疗。因此,医学看起来正确的认识了这两个词的含义。作为类比,在开始测试时,我们应当把程序当做病人看待。
“测试是表明错误不存在的过程”的错误是:这个目标对于实际的程序,甚至是很小的程序都是不可能实现的。
心理学研究表明当人面对不可行或不可能的任务时,表现糟糕。例如,当我们被要求15分钟解决纽约时报上的纵横字谜时,我们找不了几个。因为许多人10分钟之后就开始认为,这是不可能的。如果你被要求在4小时内完成,我们许多人在头十分钟就能找到更多的单词。把软件测试定义为“表明软件存在错误的过程”,使这种工作变成可行的,从而可能解决这种心理问题。
“测试是表明程序正确的做它该做的事”的问题是,一个程序做了它该做的事人仍可能含有错误。因为,一个程序没有做它该做的事的错误是明显的,但是如果它做了不该做的事仍然错误。考虑第一章的三角形问题。当我们表明这个程序在等边,等腰,三边不等的情况下正确执行,这个程序仍可能含有错误(例如认为1,2,3是不等边,或者0,0,0是等边三角形)。我们更可能找到后一类错误如果我们把测试当作找错的过程而非是“表明程序做了它该做的事”。
综上,软件测试更恰当的看法是找错的破坏性过程。成功的测试案例(test case)是那些能使程序失败的。当然,你最终的目的是通过表明程序做了它该做的,没做他不该做的来建立对程序的某种程度的信心。而达到这个目的的最好办法是仔细的查找错误。
当某人到你面前声称“我的程序是正确的”(没有错误)。要相信这种话的最好方法是,尽力反驳它,也就是要找到程序的错误而非仅仅找些测试数据表明程序无错。 |