我发现,许多测试人员和测试经理将测试自动化等同于测试用例自动化执行。在他们的词汇中,“自动化”是“测试自动化”的缩写,而“测试自动化”就是自动地运行被测试对象、检查测试结果并生成测试报告。
如果仅仅运行计算机可执行的测试用例就可以保证软件质量,那么测试人员的生活将轻松许多。但是,在绝大多数项目中,测试者都必须完成一系列任务来提供优质的测试服务。
以上幻灯片来自Doug Hoffman和Cem Kaner的报告“Exploratory Test Automation”。他们列举了典型的测试任务,并强调这只是测试人员日常工作的一部分。
分析产品和它的风险
开发测试策略
设计测试用例
执行测试用例(测试用例的首次运行通常是手动执行)
评估测试结果(包括错误分析和调试)
管理测试环境
测试结果管理与追踪
测试用例自动执行对回归测试很有帮助,但是对其他活动支持有限。为了更好地测试,测试者需要放宽测试自动化的视野,在测试全程合理地利用计算机的强大能力。
如果自动化能促成测试使命的完成,就利用自动化。评估利用自动化是否成功的标准,是看它多大程度上帮助测试人员完成自己的使命。(摘自《软件测试经验与教训》第5章“测试自动化”)
在探索式测试中,探索式测试自动化(exploratory test automation)是帮助测试人员完成探索式测试使命的开发与测试活动。Doug和Cem认为:
探索式测试自动化是计算机辅助测试,它支持学习被测试软件质量的新信息。
Exploratory test automation is computer-assisted testing that supports learning of new information about the quality of the software under test.
分析他们的描述,可知探索式测试自动化的要点。
探索式测试自动化强调计算机辅助(computer-assisted),而不是自动化测试(automated testing)。它的目标是人尽其才(自由发挥测试者的智能),物尽其用(充分利用计算机的性能)。
探索式测试自动化的一个重要目标是学习。我在“探索式测试:探索是为了学习”中提到,软件测试是一个持续学习并实践的过程,而探索式测试支持更有效的学习和实践。测试自动化也应该坚持这一方向。
学习的目的是获得新知。测试专家Rex Black 在《Pragmatic Software Testing》提到了一条测试设计原则,很有启发性:“你应该设计测试用例以便你能从每个测试用例中学习到一些你还不知道的东西。当你从测试中学到了什么时,你应该感到高兴”。
下图是一个探索式测试自动化的实例。它是我开发的测试工具,以图形化的方式来展示指定时间段中所有任务(Job)的耗时:横轴是时间轴,每一个矩形对应一个任务,矩形越宽说明任务耗时越长,相同颜色的矩形对应同一种任务。
通过该工具,我可以立即理解被测试系统在产品环境或测试环境的工作负载。在特定时间窗口中,执行了哪些任务,哪些任务耗时最长,哪些任务数目最多,哪类任务在并发执行,哪类任务在串行执行,哪些时段系统繁忙,哪些时段系统空闲——这些信息界皆一目了然。虽然该工具不执行任何测试,但是它可以帮助我分析被测试系统,发掘可能的性能风险,为测试策略选择提供信息。
著名的Web调试工具Fiddler也体现了探索式测试自动化的思想。其作者Eric Lawrence在IEBlog上描述了它的诞生:
在我加入Internet Explorer团队之前,我工作于Microsoft Office Online网站。当处理大规模流量时,我们面临一些性能挑战,它们迫使我深入挖掘HTTP性能的深入细节。我的努力最终产生两个成果:Microsoft Fiddler和网络性能优化的最佳实践的文档。
Before I joined the Internet Explorer team, I worked on the Microsoft Office Online website. Handling massive amounts of traffic, we faced some performance challenges that forced me to dig into the guts of HTTP performance. The output of that effort was twofold: Microsoft Fiddler, and documentation of some best practices for web performance optimization.
可见Fiddler的原始需求是性能测试的结果分析和问题调试。为了更好地理解系统(包括服务器、客户端、网络、HTTP协议),更快速地定位问题,Eric用Fiddler捕获网络通讯的细节,并以友好的方式显示。当工具完成了枯燥、琐碎、繁杂、海量的任务,开发者能够利用他们的头脑去解决来自现实世界的难题。
在结束本文之前,我想再回顾一下我的观点。
情景(context)是非常重要的。要依据当前情景,选择合适的测试任务。要根据测试任务,思考合适的测试自动化方法。
测试自动化不但包括自动执行测试用例,还包括计算机辅助的测试分析、手工测试、错误调试等活动。
学习是软件测试的核心活动之一。测试自动化应该更好地支持测试学习。