Python自动化测试教程
上QQ阅读APP看书,第一时间看更新

1.1.3 软件测试工作的原则

在了解了测试工作中所要做的事情及其要达成的目标之后,读者接下来要考虑的就是如何做好一个铁了心要“刁难”待测软件的“坏人”了。如果我们想在测试工作中扮演好这种“坏人”的角色,就需要在工作实践中建立起一些基本原则,按照《软件测试的艺术》这本书中的建议,我们可以归纳出如下工作原则。


 《软件测试的艺术》(The Art of Software Testing)是软件测试领域的经典著作,书中对软件测试的任务类型、测试用例的设计方法、测试策略等主题都有精彩且具体的论述,其中的许多经典论断至今仍被广泛引用。特别值得一提的是,此书仅100多页,非常适合专业人员每年精读一次,每次都会有新的感悟。

程序员或开发团队应该避免测试自己编写的软件。这很好理解,既然软件测试工作的本质是对待测软件进行各种“刁难”,那么自然要对自己的作品进行回避,否则很难保证测试结果不受测试人员的主观心理影响。

在测试用例中必须提出对软件输出或执行结果的预期。或许很多人不相信,这个再正常不过的工作原则恰恰是软件测试工作中最常见的疏忽之一。这其实是心理学问题,即如果测试人员没有就测试用例在待测软件上得到的执行结果做出明确且清晰的预期,根据“所见即所想”现象,某个似是而非的、实际上是错误的结果就可能会下意识地被解释成正确的结论。而纠正这种下意识行为的一种方法,就是事先精确预期软件的输出,鼓励人们对所有的输出进行仔细检查。

每个测试用例的执行结果都应该得到充分的检查。这也是一个显而易见但很容易被忽视的原则。我们经常会看到,即便某个错误的“症状”在测试用例的输出结果中已经清晰可见,测试人员也没有注意到这个错误的存在。

测试过程中不仅要考虑有效的数据和可以预期的执行结果,还要考虑无效的数据和预计不到的执行结果。测试人员在测试软件时通常有一个很自然的倾向,即将测试重点集中在有效和可以预期的输入情况上,而忽略无效和无法预料到的情况。然而,软件产品在使用过程中发现的许多问题往往是在它们以某些新的或未预料到的方式运行时发现的。因此,针对未预料到的和无效输入情况的测试用例通常比针对可以预期的和有效输入情况的测试用例更具有价值。

测试过程中不仅要观察软件是否做了它该做的事情,还要关注它是否做了它不该做的事情。这个原则是上一个原则的必然结果,必须检查软件是否有其开发者不希望出现的操作。例如,如果某个公司的工资管理系统可以为公司的每个员工生成正确的工资单,我们就可以认为它做了该做的事情,但如果该系统为公司的非雇员也生成了相应的工资单,这就是一个不小的错误,测试人员的职责就是发现它做了这件不该做的事情。

测试人员使用的测试用例应该是可以重复执行的,测试用例的执行结果也应该是可以重现的。这个原则也是非常重要且显而易见的,试想一下,如果测试人员精心设计的测试用例在他发现某个错误并提交报告之后就被丢弃了,那么一旦软件在完成修改之后需要重新测试,测试人员就必须重新设计这些测试用例。这不仅是对人力资源的巨大浪费,而且测试人员很难保证重新设计的测试用例能对上一次发现的已修改的错误进行确认。除此之外,软件的其他部分被修改之后,也可能导致已经被测试过的部分出现新的问题,因此需要对其进行回归测试,这也需要测试人员保留并重复执行使用过的测试用例。

在制订工作计划、开发测试用例时不能假设软件中不存在错误。这是项目经理经常容易犯的一种错误,因为他们对测试工作有不符合科学规律的预期。也就是说,他们误以为测试是一个“证明程序能正确运行”的过程,但测试实际上是“为发现错误而执行程序”的过程。关于这两种认知的差异及其造成的影响,本书之前已经做了详细的说明,这里不再重复。

软件的某一部分中可能存在的实际错误数量通常与该部分中已经发现的错误数量成正比。在各种类型的工程中,人们总会观察到错误同时出现的现象,软件工程也不例外,每个软件都免不了会出现几个出错频率很高的部分。尽管没有人能够对这种现象给出很好的解释,但这足以让测试人员积累某种工作经验。换言之,如果程序的某个部分远比其他部分更容易产生错误,那么测试人员就可以基于这种经验对这部分进行重点测试,以便让测试工作获得更高的成效。

明白软件测试是极富创造性的工作,它给程序员带来的挑战并不低于软件开发所带来的挑战。也许很多人没有意识到一个事实,即测试大型软件所需要完成的创造性工作在很多情况下是超过该项软件开发工作的。想要充分地测试软件并确保所有错误都不存在几乎是不可能的。这意味着测试人员需要使用一系列特定的技术,并针对具体的软件设计出合理的测试用例集,而这显然需要测试人员完成大量的创造性工作。

除了上述基本原则之外,对于某些具体的测试工作来说,妥善利用自动化测试来提升测试的效率和质量是一个非常重要的工作原则,这让自动化测试成为测试人员必须学习的一项重要技能。这项技能如今在流行的敏捷开发、持续交付和持续集成等新型软件工程理念中有着至关重要的地位。下面我们继续了解实现自动化测试的意义,以及自动化测试的核心能力及其局限性。