qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

软件测试中的心理学

软件测试是一项技术性工作,但同时也涉及经济学和人类心理学的一些重要因素。

  在理想情况下,我们会测试程序的所有可能执行情况,而在大多数情况下,这几乎是不可能的。即使一个看起来非常简单的程序,其可能的输入与输出组合可达到数百种甚至数千种,对所有的可能情况都设计测试用例是不切合实际的。对一个复杂的应用程序进行完全的测试,将耗费大量的时间和人力资源,这样在经济上是不可行的。

   另外,要成功地测试一个软件应用程序,测试人员也需要有正确的态度(也许用“愿景”(vision)这个词会更好一些)。在某些情况下,测试人员的态度 可能比实际的测试过程本身还要重要。因此,在深入探讨软件测试的本质之前(指技术层面),我们先探讨一下软件测试的心理学问题。

  测试执行得差,其中一个主要原因在于大多数的程序员一开始就把“测试”这个术语的定义搞错了。

  他们可能会认为:

  “软件测试就是证明软件不存在错误的过程。”

  “软件测试的目的在于证明软件能够正确完成其预定的功能。”

  “软件测试就是建立一个‘软件做了其应该做的’信心的过程。”

  这些定义都是本末倒置的。

  每当测试一个程序时,应当想到要为程序增加一些价值。通过测试来增加程序的价值,是指测试提高了程序的可靠性或质量。提高了程序的可靠性,是指找出并最终修改了程序的错误。

  因此,不要只是为了证明程序能够正确运行而去测试程序;相反,应该一开始就假设程序中隐藏着错误(这种假设对于几乎所有的程序都成立),然后测试程序,发现尽可能多的错误。

  那么,对于测试,更为合适的定义应该是:“测试是为发现错误而执行程序的过程”。

  虽然这看起来像是个微妙的文字游戏,但确实有重要的区别。理解软件测试的真正定义,会对成功地进行软件测试有很大的影响。

   人类行为总是倾向于具有高度目标性,确立一个正确的目标有着重要的心理学影响。如果我们的目的是证明程序中不存在错误,那就会在潜意识中倾向于实现这个 目标;也就是说,我们会倾向于选择可能较少导致程序失效的测试数据。另一方面,如果我们的目标在于证明程序中存在错误,我们设计的测试数据就有可能更多地 发现问题。与前一种方法相比,后一种方法会更多地增加程序的价值。

  这种对软件测试的定义,包含着无穷的内蕴,其中的很多都蕴涵在本书各处。举例来说,它暗示了软件测试是一个破坏性的过程,甚至是一个“施虐”的过程,这就说明为什么大多数人都觉得它困难。这种定义可能是违反我们愿望的;所幸的是,我们大多数人总是对生活充满建设性而不是破坏性的愿景。大多数人都本能地倾向于创造事物,而不是将事物破坏。这个定义还暗示了对于一个特定的程序,应该如何设计测试用例(测试数据)、哪些人应该而哪些人又不应该执行测试。

   为增进对软件测试正确定义的理解,另一条途径是分析一下对“成功的”和“不成功的”这两个词的使用。当项目经理在归纳测试用例的结果时,尤其会用到这两 个词。大多数的项目经理将没发现错误的测试用例称为一次“成功的测试”,而将发现了某个新错误的测试称为“不成功的测试”。

  这又是一次 本末倒置。“不成功的”表示事情不遂人意或令人失望。我们认为,如果在测试某段程序时发现了错误,而且这些错误是可以修复的,就将这次合理设计并得到有效 执行的测试称做是“成功的”。如果本次测试可以最终确定再无其他可查出的错误,同样也被称做是“成功的”。所谓“不成功的”测试,仅指未能适当地对程序进 行检查,在大多数情况下,未能找出错误的测试被认为是“不成功的”,这是因为认为软件中不包含错误的观点基本上是不切实际的。

  能发现新错误的测试用例不太可能被认为是“不成功的”,也就是说,能发现错误就证明它是值得设计的。“不成功的”测试用例,会看到程序输出正确的结果而没发现任何错误。

   我们可以类比一下病人看医生的情况,病人因为身体不舒服而去看医生。如果医生对病人进行了一些检查和化验,却没有诊断出任何病因,我们就不会认为这些检 查和化验是“成功的”,因为病人支付了昂贵的检查和化验费用,而病状却依然如故。病人会因此而质疑医生的诊断能力。但是,如果医生诊断出病人是胃溃疡,那 么这次检测就是“成功的”,医生可以开始进行相应的治疗。因此,医疗行业会使用“成功的”或“不成功的”来表达诊断结果。我们当然可以类推到软件测试中 来,当我们开始测试某个程序时,它就好似我们的病人。

  “软件测试就是证明软件不存在错误的过程”,这个定义会带来第二个问题。对于几乎所有的程序而言,甚至是非常小的程序,这个目标实际上也是无法达到的。

   另外,心理学研究表明,当人们开始一项工作时,如果已经知道它是不可行的或无法实现时,人的表现就会相当糟糕。举例来说,如果要求人们在15分钟之内完 成星期日《纽约时报》里的纵横填字游戏,那么我们会观察到10分钟之后的进展非常小,因为大多数人都会却步于这个现实,即这个任务似乎是不可能完成的。但 是如果要求在四个小时之内完成填字游戏,我们很可能有理由期望在最初10分钟之内的进展会比前一种情况下的大。将软件测试定义为发现程序错误的过程,使得 测试是个可以完成的任务,从而克服了这个心理障碍。

  诸如“软件测试就是证明‘软件做了其应该做的’的过程”此类的定义所带来的第三个问 题是,程序即使能够完成预定的功能,也仍然可能隐藏错误。也就是说,当程序没有实现预期功能时,错误是清晰地显现出来的;如果程序做了其不应该做的,这同 样是一个错误。如果我们将软件测试视作发现错误的过程,而不是将其视为证明“软件做了其应该做的”的过程,我们发现后一类错误的可能性会大很多。

   总结一下,软件测试更适宜被视为试图发现程序中错误(假设其存在)的破坏性的过程。一个成功的测试用例,通过诱发程序发生错误,可以在这个方向上促进软 件质量的改进。当然,最终我们还是要通过软件测试来建立某种程度的信心:软件做了其应该做的,未做其不应该做的。但是通过对错误的不断研究是实现这个目的 的最佳途径。

  有人可能会声称“本人的程序完美无缺”(不存在错误),针对这种情况建立起信心的最好办法就是尽量反驳他,即努力发现不完美之处,而不只是确认程序在某些输入情况下能够正确地工作。

posted on 2012-05-17 09:23 顺其自然EVO 阅读(324) 评论(0)  编辑  收藏 所属分类: 测试学习专栏


只有注册用户登录后才能发表评论。


网站导航:
 
<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜