2、自动化测试的佳实践

很自然地,大家希望借助于自动化测试来缩短系统测试的周期,缓解测试的压力。但是,如果在设计和代码开发的过程中缺乏对自动化测试的考虑,例如提高应用程序的可测试性,我们可能会掉入自动化测试的陷阱中去。

为了避免掉入自动化测试的陷阱,Elfriede Dustin总结了几个佳实践,其中包括:

(1)提高应用程序的可测试性。

软件开发人员可以通过在程序中构建更多的可测试特性,来帮助测试人员开展自动化测试。可以有多种方式来提高可测试性,其中一种比较常见的方式是提供日志或跟踪机制,从而提供关于程序正在做什么的信息,包括正在操作的数据,以及关于应用程序状态、运行中的错误等方面的信息。测试工程师可以利用这些信息来判断错误是否发生,跟踪测试执行过程中的各种处理流程。

在应用程序执行过程中,所有模块都会写入关于方法、函数、当前处理对象等详细的日志信息。通常日志会写到文件或数据库中,并且按一定的格式写入,以便后期地分析和调试。

在某些复杂的C/S结构系统或Web系统中,日志文件可能会写到多个机器上,因此日志中应该包含足够的信息用于判断在机器之间执行的顺序和路径。但是也不能包含太多的信息,否则将影响后期的分析过程。每个日志信息应该尽可能简洁地包含一些关键的信息,例如:

? 类名和方法名。

? 机器名和进程ID。

? 时间戳(精确到毫秒级)。

? 执行信息或出错信息。

灰盒测试方式可以充分利用这些日志信息,跟踪到对象在测试执行过程中的各种信息。另外,还会带来如下好处:

?测试用例的执行能被跟踪起来。

?在碰到严重错误的时候,日志的信息可以帮助找到引起问题的模块或代码。

?在一些模块接口计算的区域,日志文件包含的模块ID、数据可以帮助找出这些接口的错误。

在找到Bug之后,测试人员把Bug描述连同格式化的日志信息发给开发人员,有助于开发人员定位和调试问题发生的根源。例如下面的日志信息:

Function: main (main.cpp, line 100)

Machine: testsrvr (PID=2201)

Timestamp: 8/6/2009 20:26:54.721

Message: connecting to database [dbserver1, customer_db]

Function: main (main.cpp, line 125)

Machine: testsrvr (PID=2201)

Timestamp: 8/6/2009 20:26:56.153

Message: successfully connected to database

[dbserver1, customer_db]

Function: retrieveCustomer (customer.cpp line 20)

Machine: testsrvr (PID=2201)

Timestamp: 8/6/2009 20:26:56.568

Message: attempting to retrieve customer record for customer ID [A1000723]

Function: retrieveCustomer (customer.cpp line 25)

Machine: testsrvr (PID=2201)

Timestamp: 8/6/2009 20:26:57.12

Message: ERROR: failed to retrieve customer record, message [customer record for ID A1000723 not found]
 
从日志中可以看到,应用程序按照测试用例的执行过程,不能取到指定的顾客记录。

在这种情况下,测试员应该检查dbserver1数据库,使用SQL查询工具查询customer_db数据库中ID为A1000723的记录,来验证数据是否存在。确认是Bug之后,连同日志信息一起发送给开发人员,而不仅仅包含Bug的现象。这些日志信息对于开发人员定位问题的本质有重要的作用,可以减少问题分析和定位、调试的时间。

(2)GUI和接口测试的建议

录制回放型的测试工具通过脚本语言记录测试工程师在程序界面上的操作,然后通过回放来做一些基本的验证。由于需要与GUI打交道,任何GUI的细微变化都可能引起脚本回放的失败。因此,如果是基于位图的录制,则要注意下面几个方面:

? 控件的字体不要随便改动。

? 界面的颜色不要随便改动。

? 显示的设置需要保持不变。

? 如果可能,应该保持操作系统的标准设置。

开发人员在做界面层的修改之前,需要考虑到界面的修改对自动化测试脚本的影响,尤其是在界面基线已经建立起来之后,需要慎重考虑GUI的修改。

GUI测试工具通常是基于对象的属性来识别对象的,因此开发人员好能知道GUI测试工具的工作原理,这样可以在修改GUI时尽量避免对自动化测试脚本造成的影响。