实战 GUI 产品的自动化测试,第 3 部分:如何提高测试结果分析的效率-1

上一篇 / 下一篇  2012-07-24 09:13:43 / 个人分类:自动化测试

51Testing软件测试网1V,d\5F2e.G O,XJ

  简介:

C ~'b(Q-a$ce`"p!~#l051Testing软件测试网 }ZQCt/o5Yx

  自动化测试技术是保证产品质量的重要手段。随着敏捷开 发方法的盛行和产品发布周期的缩短,产品对测试的要求也相应提高,因此自动化测试也变得比以前更加重要。冰冻三尺非一日之寒,和产品开发一样,产品的自动 化测试系统也需要通过迭代开发不断强化,逐步解决效率瓶颈,更广泛、更灵活的支持产品开发的需求。那么,如何从无到有建立 GUI 产品的自动化测试系统?GUI 产品自动化测试每一阶段的目标是什么?在逐步演化的过程中,我们可能会面对哪些问题?这些又可以如何解决呢?本系列文章希望能够结合我们团队的经验,一一解答。

*tU*h m[t5DU0

U$|*S?S0  测试结果的分析对于测试来说非常重要,往往需要收集大量的数据,包括屏幕截图和产品日志,并根据具体需要分析各种不同的信息,例如验证点,测试实际步骤和自动测试调试信息等等。可以通过精心准备测试用例、合理输出验证信息、筛选显示测试结果、自动记录测试实际步骤等手段来全面提高分析测试结果的效率。本篇文章从准备测试用例开始,介绍了验证信息的输出,Notes 自动测试日志的各种功能,并对每项功能的实现原理做深入介绍。

{Rk%q7zt.Z)o:Q-z051Testing软件测试网7Gf*UB Dh6U

   所谓自动化测试,就是“自动化”+“测试”。自动化本身显然不是自动化测试的全部,在我们解决了测试脚本自动执行的问题之后,还是要回到测试本身,解决 如何进行分析验证的问题。测试结果的分析对于测试来说非常重要,往往需要收集大量的数据,包括屏幕截图和产品日志,并根据具体需要分析各种不同的信息,例 如验证点,测试实际步骤和自动测试调试信息等等。可以通过精心准备测试用例、合理输出验证信息、筛选显示测试结果、自动记录测试实际步骤等手段来全面提高 分析测试结果的效率。本篇文章从准备测试用例开始,介绍了验证信息的输出,Notes 自动测试日志的各种功能,并对每项功能的实现原理做深入介绍。51Testing软件测试网)^(d kef2uO

51Testing软件测试网2SVY[Eo1Axt2l

  准备准确的测试用例

0Czq/s;{oL'F0

\|AOo![;|5_u0   测试用例是测试脚本的基础,不合理的测试脚本既不利于自动化,也不利于测试。而好的测试脚本则要做到描述简洁准确,操作步骤清晰,测试目的明确易懂。由 于在编写测试用例时,产品一般没有完成,测试人员可能并不清楚执行用例的每个步骤,所以用例容易写得很模糊。手工测试人员执行时也许没有太多困扰,因为他 了解设计文档,知道应该执行什么样的步骤,但是自动测试人员并没有这么清楚,依照模糊的用例编写测试脚本往往无从下手。所以,在开始编写测试用例之前,往 往需要跟测试人员沟通,完善并得到准确的测试用例,这样才能做到有的放矢。

5pA8b3T,D8R ^ s051Testing软件测试网wpa7O:g

  那么什么样的测试用例是描述准确,易于实现的?让我们通过一个测试 Notes 中的打开应用对话框的例子来看一看。51Testing软件测试网#K#IS.H1I*i

图 1. 测试打开文件对话框

(eBN)h.eC$FI0

F w&U+R*|-Vc4}u0

  例 1A. 模糊的测试用例51Testing软件测试网3`z.? H?/]O

  1、打开“Open Application”对话框51Testing软件测试网AszanU }BN

  2、验证使用对话框可以打开Server端的用户邮箱

-`'i9R VXS#ps0

  例 1B. 准确的测试用例51Testing软件测试网0Z8aJ?0W&S#O#oD

Z+NX5Y f7u0

   显然,对于一个有经验的测试人员,可以很轻松的理解例 1A 中的描述,但是对于自动测试人员来说,这种描述不够细致,并且容易带来歧义的。我们需要知道通过何种途经打开文件对话框?怎样切换到 Server?怎样在 server 上定位到用户邮箱应用?只有当我们把这些都明确下来之后,测试脚本才是准确的,并且易于实现的。51Testing软件测试网3yL#bN*zl1FL

51Testing软件测试网1Q!^O T| H

  记录关键测试步骤和结果

9|3nu5G;]5fg1`@2FI051Testing软件测试网F BAgq9r&q4h2P

  准备好了用例,我们就可以开始编写测试脚本。基于准确的测试用例描述和灵活的 IBM 框架支持,我们可以轻松的把测试步骤翻译成测试脚本。同样以脚本例 1B 为例,我们可以可以得到例 2 中的脚本代码:

M~6a[z(N[M r0

/x}*^'Tho0  例 2. 初步的测试脚本51Testing软件测试网o.r%gs7D-dwN Jt

:l:t7@-J4ac)dx2X0

  这是一个新手容易写出的测试脚本,这个脚本遵循 IBM 框架设计,完成了用例要求的步骤,并加入了对测试结果的验证。看起来符合测试用例的要求,不过,这个脚本还不够好。

%u1Z-{R/X!w;ds7i0

  我们说“自动化测试”=“自动化”+“测试”,作为程序执行正确性的验证工具,我们需要假设执行流程中的每一步都是 可能出现错误的。比如说步骤一的点击菜单动作,就可能因为程序内的菜单映射错误而打开错误的对话框;再比如在步骤三中,可能因为网络超时或程序错误判断自 身为离线状态而无法成功连接到服务器。还是以为回到测试结果的分析这一问题上来,一旦产品有了缺陷或者测试执行出错,我们如何快速定位问题么?很显然,测 试人员不可能一直盯着测试脚本的执行,在自动化测试中,我们需要通过日志记录下关键步骤的执行过程和结果。

0R R7[3A#A)b:^k-U/}0

  在通过日志分析结果时,通常我们需要知道两点:51Testing软件测试网?+xD;j'OhY

  1、步骤是否已执行;

_9P7Mn!O(@0

  2、被测程序是否正确做出反应。51Testing软件测试网i5UTv*Q]

  对于第一点,通过在 App Object 层和 Task 层的增强,Notes 自动测试的框架能够自动输出信息,显示出执行了的步骤,这个功能本文后面会做深入介绍。而被测程序是否正确做出反应,则需要我们在测试脚本中进行检测并记 录。实际上,当我们手工验证测试用例时,我们都会不经意的验证每一步的程序响应,并决定下一步的操作。作为“隐藏的验证点”,我们需要把他们补充到测试用 例中。例 3 中给出了经过完善后的测试用例:51Testing软件测试网2P"Q*rl;v(}

  例 3. 完善后的测试用例51Testing软件测试网(Ntz;Mx-h-XC-Zd&W-k

9R4pJZ)JO B0

  相应的,我们在测试脚本的编写过程中也需要加入对各个步骤中程序响应的验证,并将结果记录到日志中。例 4 中给出了我们最终的示例测试脚本:

P(wt/z9q[0

  例 4. 完善后的测试脚本

O2n k%j$l.X)L0

51Testing软件测试网 J U GIr pj9f8Uh

Logger.logDetail(“1. 点击 File-> Open Application 菜单”);
K ?)_#iDVn$|.^|1i0Menu.mOpenApplication.pick();
Gup.H&U;^O7A;J0OpenAppDlg dlgOpenApp = new OpenAppDlg();
C[/u+_G+g yi2S;z0Logger.logCompareFatal(true, dlgOpenApp.exist(LocalSettings.shortWaitTime),
~ ~]9V cb5c C0  "验证:‘打开应用’对话框出现");Logger.logDetail("2. 在 Server Combox 中输入服务器地址");
;o0BfX%kac0dlgOpenApp.getServerCombo().setText(User.mailServer);
IZV G;~8G5i6]0Logger.logCompareFatal(User.mailServer, dlgOpenApp.getServerCombo().getText(),51Testing软件测试网2K$H(g [n~
  "验证:服务器地址输入正确");Logger.logDetail("3. 切换到 Server");
M"E"K1|Cb#P0dlgOpenApp.getOpenButton().click();51Testing软件测试网jz*y Wr[2K za
Logger.logCompareFatal(true, isContentOnServer(dlgOpenApp, User.mailServer),
Ha x)\Wq0x[!e#H A0  "验证:列表框中显示的内容为服务器上的内容");
#m2H1BDJ1W&k0Logger.logDetail("4. 在 File Name Editbox 中输入邮箱路径名称");51Testing软件测试网]p2T9O\'{
dlgOpenApp.getFileEdit().setText(User.mailPath);
hUb"tvt3w0Logger.logCompareFatal(User.mailPath, dlgOpenApp.getFileEdit().getText(),51Testing软件测试网&Dw|.fM6R
  "验证:邮件路径输入正确");
mc!P?0i3@*C&l0Logger.logDetail("5. 点击确定,打开应用");51Testing软件测试网DEP kn-B
dlgOpenApp.getOpenButton().click();
:_;J"[)c2f8@$w0Logger.logCompareFatal(true, dlgOpenApp.waitForNonExistence(LocalSettings.shortWaitTime),
;MaO;V w/A0  "验证:‘打开应用’对话框关闭");
@gb iNR%B0Logger.logCompare(User.name, MailTask.getOpenedMailOwner(),
H8xo;xM$l5j8\A cA0  "验证:邮件应用正确打开");

|}JOCbz_@0
51Testing软件测试网{ tnQq:MX-B

  Logger 类是我们在 Notes 项目中定义使用的日志工具,可以支持多层级、多类型的日志记录。在例四中,我们用到了其中的三个日志函数:

nk/RW'jb~R t1c0

2v_.N m,?3b#j5Z]0  1、logDetail(expression):记录步骤基本信息

P;[&])K6JJn0

vi:QzSw;S0  2、logCompareFatal(expected, actual, vp):记录步骤验证结果,如果比较失败,停止当前用例。51Testing软件测试网hz6iE'S`o

h"K;X4M+l&j k+]0  3、logCompare(expected, actual, vp):记录验证点,返回 boolean 值表示比较结果

z!?*D/Wp051Testing软件测试网LV/u0q6E*Gv

  我们之所以对关键步骤验证用到 logCompareFatal,是因为这些步骤不能正确执行的话,后面的验证和后续步骤也就失去继续执行的意义。与其浪费时间执行无意义的操作,不如停 止用例,及时做出错误清理,同时记录错误信息,如截屏,和输出验证信息。通过完善的步骤检查和日志记录,我们可以在脚本发现错误的时候借助日志分析直接定 位到出现问题的步骤。同时,您可能注意到我们在 exists 和 waitForNonExistence 函数中使用了超时设置,可以在保证被测程序有足够响应时间的情况下,尽可能的节约测试执行时间。如果您希望了解关于执行环境清理以及步骤间等待的更多细 节,请参考本系列的第二篇文章。

a%vRy)P*FC5r0

f![ w&Q&bd%A4Wm0  日志的艺术51Testing软件测试网\#n(K J1K#c ? `L

51Testing软件测试网wj N0]nC

  日志对自动化测试而言至关重要,而好的日志工具可以帮助我们提高测试脚本的输出质量以及问题定位分析效率。在 Notes 项目中,我们实现了自定义的 Logger 类以支持各种特定的输出需求。下面,让我们一起来看一看日志中都可以包括一些什么样的内容。

U8r/H;N8Tw0

图 2. Notes 自动测试用例日志51Testing软件测试网fZM.N/Y"I4qW

51Testing软件测试网ic$K%a/NQ l

  如图 2 所示,Notes 的日志输出是一个 html 格式的文件,提供了验证点结果,用例结果和发生错误的截图。Notes 的日志工具支持以下功能:

o+zb [!i"U0

  1、自动记录测试步骤 (TESTPLAN)51Testing软件测试网E%w(T"X:^8p0_F?$is

  2、隐藏和显示不同级别日志的选择按钮

"G FxB\T`;k7q0

  3、按照关键词筛选显示日志内容51Testing软件测试网0Y*@+Nf,t&s

  4、截图链接 (IMAGE)51Testing软件测试网;i#YG E_w

  5、被测产品日志链接 (IMAGE 和 NOTES LOG FILE)51Testing软件测试网h#^z F G

  6、记录生成日志的位置 ("CALLSTAMP")51Testing软件测试网@ Q_$NVV T

  7、记录日志生成的时间 (TIMESTAMP)51Testing软件测试网 G.N#@,sm3B

  8、记录测试环境配置信息 (SETTINGS)

c#{ LNf3|ed0

  自动记录测试步骤:这一功能自动记录了每一步操作的执行过程,可以帮助我们分析步骤是否已经正确执行。在下一节中,我们会详细介绍。

f(z+qj X6r4M0

TAG:

 

评分:0

我来说两句

Open Toolbar