调查一个难以重现的缺陷与软件调试非常相似,测试人员可以借鉴一些调试原则和方法。可以试试一下9条调试规则不但可以指导调试,还能帮助测试。
1.理解系统(Understand the system) 。解决一个具体问题,很多时候需要在整体上理解系统。重现一个缺陷也要求测试人员在宏观上和细节上都能把握软件。在项目全程,测试人员需要积极地学习被测软件的领域知识、产品架构、代码实现、技术平台、调试工具等。只有较全面地理解软件,才能有效地分析信息、设计实验、快
速测试。软件开发与测试没有捷径,持续积累才是正途。
2.制造失败(Make it fail) 。影响软件行为的因素包括软件自身的状态和软件的外部输入(用户的输入、操作系统的输入、其他软件的输入等)。测试人员应该列举这些影响软件行为的因素,并分析哪些因素可能与当前缺陷有关。然后,他需要大量尝试这些因素的取值组合,并试着总结缺陷重现的模式。有时测试人员需要求助于程序员,让他提供更好的测试钩子以控制软件的状态和输入,或提供更好的调试日志以了解软件的状态和输出。
3.观察先于思考(Quit thinking and look) 。在猜测引发错误的原因之前,应该仔细地观察软件的状态、操作系统的状态、所依赖的软件或服务的状态,并分析软件的输入数据和输出数据。细心观察可以更好地推测缺陷原因,设计更有效的测试,相反,凭空猜测很可能使测试误入歧途,费时费力却没有收获。
4.分而治之(Divide and conquer) 。如果运行一次测试需要大量的准备工作(如初始化数据库、复制数据文件、重启服务等),测试就不能提供快速的反馈,缺陷调查的效率就很低。为此,测试人员需要建立一个可以快速测试的环境,这通常需要隔离一些无关的数据、软件和服务,也需要测试钩子的帮助。在此环境中,测试人员通过逐次逼近来缩小搜索的范围,即通过测试来排除一些影响软件的因素,从而慢慢锁定若干重要的因素。
5.一次只做一处修改(Change one thing at a time) 。在科学实验中,科学家一次只修改一个变量的值,从而了解该变量对于实验结果的影响。同样,在测试中,测试人员一次只修改一个变量的值,从而了解它对软件行为的影响。
6.保持审计跟踪(Keep an audit trail) 。在调查过程中,要记录下所做的测试和测试结果。魔鬼隐藏在细节中,而人的记忆总是不可靠的。应该将测试、软件和环境的细节记录下来,作为缺陷报告的一部分。
7.检查基本假设(Check the plug) 。如果测试人员的调查没有进展,他也许要质疑一下他的基本假设。面对复杂的问题,测试人员的思考常常基于一些能简化情况的假设,例如他会假定“服务器返回的数据应该是没问题的”、“这个模块一直很稳定,不会出错”、“错误检查代码一定能过滤掉无效的输入数据”等。这些假设在大多数时候成立,但是并非永远如此,要质疑并检查它们。
8.获得全新视角(Get a fresh view) 。如果重现的努力没有成功,测试人员可以向程序员或测试同伴请教。软件是如此的复杂,每个人都有盲点。向别人解释问题,会强迫测试人员组织思路,这有助于他跳出原来的思维模式,获得新的见解。也许叙述完毕,测试人员就获得了新的测试灵感。此外,被咨询人可能知道一些知识,能够提供有效的测试策略或关键线索,这会显著提高调查效率。
9.如果你没有修复它,它就一直存在(If you didn't fix it, It ain't fixed) 。当重现缺陷的努力失败时,测试人员不能简单地说:“它一定随风而去了。”缺陷在测试环境中不出现,但可能在用户的环境中出现,更可能在公司领导向媒体做公开演示时出现。为了让项目团队获得必要的信息,测试人员应该提交缺陷报告。调查不可重现的缺陷可能是一个“时间黑洞”。测试人员应该根据缺陷的严重程度,设定不同长度的时间盒。在时间耗尽时,他可以自问:“是否追加一个时间盒继续调查?在下一个时间盒中能获得突破吗?对于项目而言,是继续调查还是开始新的测试更有利?”经过评估,他可以决定是继续调查,还是结束调查并提交缺陷报告。