误解2:软件测试的目的是为了验证软件能够正常运转

和第一个误解一样,这个说法也反映了一个对软件测试完全乐观的观点。在我们一生的活动中,我们尽力去创造和建造能够正常运行的事物,我们尽我们大的努力去避免故障。然而,软件测试人员必须有不同观念:为了能够成功,我们必须有意地尽量去促使故障的产生。4

如果我们不采用“不正当的”方法会发生什么?如果我们设计避免故障的测试,那么将会使我们的客户失望。当你开发一个软件应用程序的时候,你会清楚地了解应用程序所使用的数据类型,配置以及它能运行所需要的环境。你也知道程序的局限性。如果你的目标是验证应用程序能够工作,你会限制你在数据、配置和应用程序初设计所支持环境的边界处测出故障的可能。如果你这样做,你有较大的机会通过你所有的测试。然而在现实世界中,你的客户很有可能会超越这些边界并遇到你测试中没有测出来的bug。

下面是一些要成为一个好的测试者所需要的可以使用的建议。

如果产品出现了故障,你进行了一个成功的测试。

如果你在头脑中保持测试的目标是为了发现一个bug这一观念,那么你可以开始考虑一个“成功”的测试是让软件运行出现故障。不论你只是运行了一个测试还是运行了成千上万次测试,即使你没有发现bug,你的软件仍然不能说没有bug。bug仍然潜伏在测试没有覆盖到的领域。换句话说,要证明没有bug是一件非常困难的事情,并且,我们前面提到过,你必须集中力量去找到产品中危险大的领域中的bug。

不久前,我接受了一个产品的测试任务,在我之前这个产品已经经过了成百上千次测试。产品出来以后,他们所有人对产品的一些过去投入了几年的工作的组件进行测试。然而,他们的测试很少甚至没有涉及到感兴趣的测试领域。虽然这种回归测试有利于验证新代码的变更没有导致一些旧的函数无法运行,但是我不得不在可能导致麻烦的区域设计新的测试。在 软件测试的艺术,5 一书中,Glenford Myers用了一个医学上的类比,如果你觉得不舒服去医院检查,但检查的结果并不足以诊断病因,那能够说这个检查是“成功”的吗?不!你还是有病,你的医生必须再进行正确的检查。

所有的使用者都会犯错误

在测试一个新的软件应用程序的时候,看到不好的测试结果的人肯定要反对你的测试场景。“没有人会那样做!”。不要相信没有这个。一些用户会那样做,或者做一些更糟的事情,并且他们不是有意那样。你的工作是在产品运送到客户手里以前,考虑用户会犯的错误中坏的情况,并且确认你的产品仍然能够安然无恙,没有崩溃或者丢失数据。再说一遍,你要寻求的是那些能够发现危险bug的测试故障。

让我们再看一下我们之前讨论的简单程序,那个需要6,000次测试才能包括所有可能的程序。如果你要设计只在合法的输入,环境,操作等情况下的测试,那么你的测试只涵盖了对你系统运行来说好的场景。但是,如果有些地方出错会怎样?如果用户手指滑了一下,或者错误的配置了什么,或者删除了非常重要的信息,你的软件会怎样表现?或者当一个系统/服务器出现挂起,或者出现达到一些资源的上限(比如内存,磁盘空间,数据库记录的ID等),会发生什么?当一些应该被标识为损坏的数据进入或者通过系统会怎么样?如果操作中断,系统处于含糊不清的状态?或者如果太多的人在同样的时间做同样的事情?潜在错误的列表是无限的,并且如果你只想确认“它可以工作”的话,你可能会忽略掉这些场景中的大部分。