软件测试的心理学和经济学、软件测试的原则

《软件测试的艺术》读书笔记(第二章)

第二章:软件测试的心理学和经济学

前言:
软件测试是一项技术性工作,但同时涉及经济学和人类心理学的一些重要因素。
在理想情况下,我们会测试程序的所有可能执行情况,而在大多数情况下,这几乎是不可能的。即使是一个简单的程序,其可能的输入与输出组合可达到数百种甚至数千种,对所有的可能情况都设计测试用例是不切合实际的。对于一个复杂的应用程序进行完全的测试,将耗费大量的时间和人力资源,这样在经济上是不可行的。
另外,要成功地测试一个软件应用程序,测试人员也需要有正确的态度或者说是良好的心理。

[2] [1] 软件测试的心理学

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

“软件测试就是证明软件不存在错误的过程。”
“软件测试的目的在于张明软件能够正确完成其预定的功能。”
“软件测试就是一个建立一个‘软件做了其应该做的’信心的过程。”

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

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

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

这并不是在玩文字游戏,而是人类行为总是倾向于具有高度目标性,确立一个正确的目标有着重要的心理学影响。如果我们的目标是为了证明程序不存在错误,那就会潜意识中倾向于实现这个目标,也就是说,我们会倾向于选择可能较少导致程序失效的测试数据。

[2] [2] 软件测试的经济学

给出了软件测试的适当定义后,下一步就是确定软件测试是否能够发现“所有”的错误。我们将证明答案是否定的,即使是规模很小的程序。

为了应对测试经济学的挑战,应该在开始测试之前建立某些策略。黑盒测试和白盒测试是两种最普遍的策略。

[2] [2] [1] 黑盒测试

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

使用这种测试方法时,将程序视为一个黑盒子。测试目标与程序的内部机制和结构完全无关,而是将重点集中放在发现程序不按其规范正确运行的环境条件。

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

如果想用这种方法来发现程序的所有错误,判定的标准就是“穷举输入测试”,将所有可能的输入条件都作为测试用例。

我们可以清楚地意识到穷举输入测试是无法实现的。这有两方面的含义,一是我们无法测试一个程序以确保它是无错的,而是软件测试中需要考虑的一个基本问题是软件测试的经济学。

[2] [2] [2] 白盒测试

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

在这里我们建立与黑盒测试中穷举输入测试相似的测试方法——程序中的每条语句都至少执行一遍。这种方法通常被称为“穷举路径测试”。

然而这个方法也有两个问题,首先程序中不同逻辑的数量可能达到天文数字,这就需要漫长的时间来等待,而这个时间可能至少上亿年。其次虽然我们可以测试程序中的所有路径,但是程序中仍然存在着错误。原因如下:

  1. 穷举路径测试不能保证程序符合其设计规范。
  2. 程序可能会因为缺少某些路径而存在问题。
  3. 穷举路径测试可能不会暴露数据敏感错误。

[2] [3] 软件测试的原则

软件测试中有如下的原则:

  • 原则1:测试用例中一个必须部分是对预期输出或结果的定义。

    一个测试用例必须包括两个部分:
    对程序的输入数据的描述
    对程序在上述输入数据下的正确输出结果的精确描述

  • 原则2:程序员应当避免测试自己编写的程序

    还是那句话,软件测试是为了发现错误,而开发人员的目的是减少错误

  • 原则3:编写软件的组织不应当测试自己编写的软件

    道理与上一条类似。

  • 原则4:应当彻底检查每个测试的执行结果

    不要因为一些低级错误而后面的测试埋坑。

  • 原则5:测试用例的编写不仅应当根据有效和预料到的输入结果,而且也应当更具无效和未预料的输入结果

    在测试软件的时候,有一个自然的倾向,即将重点集中在有效和预期的输入情况上,而忽略了无效和未料到的情况。
    例如上一章的三角形中,很少有人会去证明“1,2,5”无效三角形而非不规则三角形。

  • 原则6:检查程序是否“未做其应该做的”仅是测试的一半,测试的另一半是检查程序是否“做了不该做的”

    这条原则是上一条原则的必然结果。必须检查程序是否存在我们不希望的副作用。

  • 原则7:应避免测试用例用后即弃,除非软件本身就是一个一次性的软件

    这个问题在采用交互式系统来测试软件时最常见。保留测试用例,当程序其他部件发生更新后,可以更好的“回归测试”。

  • 原则8:计划测试工作时不应默许假定不会发现错误

    项目经理经常容易犯这个错,这也是使用了不正确测试定义的一个迹象。

  • 原则9:程序某部分存在更多错误的可能性,与该部分已发现的的错误数量成正比

    该原则的另一个说法是:错误总是倾向于聚集存在。

  • 原则10:软件测试是一项极富创造性、极具智力挑战性的工作

    为合适的程序设计合理的测试用例集需要大量的创造性。

[2] [4] 小结

在阅读之后的内容时,请牢记以下几个重要的测试原则:

  • 软件测试是为发现错误而执行程序的过程
  • 尽量避免编码人员测试自己的程序
  • 好的测试用例能够对未发现的错误高度敏感
  • 成功的测试用例能发现未知的错误
  • 成功的测试需要仔细定义输入输出的期望值
  • 成功的测试需要仔细研究分析测试结果

《软件测试的艺术》读书笔记 链接目录
下一讲代码检查、走查与评审

猜你喜欢

转载自blog.csdn.net/idler123/article/details/120978410