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

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

?-i.RUX/V a{7C0  隐藏和显示不同级别日志的选择按钮:以往分析日志的第一个感受就是日志内容太多太杂,在分析的过程中很容易丢掉主要的线索。另外,不同的读者需 要的内容不一样,比如手动测试的人只关心验证点是否通过,而自动测试人员需要知道所有测试细节。Logger 通过提供 logError, logWarning, logDebug 等函数,把日志级别信息也同时输出到日志文件中。在检索日志文件时通过点击日志文件上方的选择按钮,我们就可以隐藏或显示相应级别的日志内容。

(L cr,_ ogbPH0

pIsZ;F6`yV$c[d0  按照关键词筛选显示日志内容:跟上一点类似,提供更灵活的方式,按关键字筛选显示日志,便于查看测试人员关心的内容。关键字不仅可以是日志内容的某一部分,还可以是类的名字。

1]_;g&E ?051Testing软件测试网3b%Vz Uu}5QL

  截图的链接:一图胜千言,截图是分析日志最直观的工具。当测试出现错误和异常时,Logger 能自动截图,把图片按日志文件的目录结构保存在电脑上,并且把文件路径作为链接显示在日志中。通过截图,测试人员可以更直观的了解出现的错误和异常。实现截图的代码如下:

s4x?%Z4QxJ i,F051Testing软件测试网m7x*_YAR W

  例 5. 实现截图功能

%U$Vx~9Jc/S0

A r)S}Qr E2K051Testing软件测试网"v$Oiqp|l

BufferedImage capture = null;
1jDL0h;r [-k7j0Rectangle area = new Rectangle(x, y, width, height);51Testing软件测试网*B4va8_ pG3CsU
Robot robot = new Robot();51Testing软件测试网mP |$K?+]i
capture = robot.createScreenCapture(area);51Testing软件测试网 G }ElHH;^tx
FileOutputStream ut = new FileOutputStream(filename);51Testing软件测试网.i @h4l?K2aJ3zD
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);51Testing软件测试网+k`+B3db)HV x
encoder.encode(capture);
T1o*ES#H0out.flush();
*z5B!s+z2mCFV0out.close();
51Testing软件测试网'w.f u t:A@/Q%|)}j

  被测产品日志链接:产品的执行日志。自动测试日志用来让测试人员发现产品问题,而进一步,让研发人员解决问题,通常还需要产品的日志。 Logger 在被测程序出现不响应和崩溃时,会主动收集被测程序的日志文件,生成链接提供给测试和研发人员。在 Notes 项目中实际应用时,由于 Notes 的每行日志都会记录当前时间,Logger 会根据测试开始和结束时间,到 Notes 的日志文件中找到测试过程中生成的日志片段,并保存到自动测试日志目录的单个文件中。这样便可以将不同测试用例造成的问题隔离出来。51Testing软件测试网#|KQ.nW$IL

51Testing软件测试网7hg{#P2|.`.s&w%R

  记录生成日志的位置:提供日志记录点的调用函数和具体位置。在自动测试人员分析日志时,往往会不清楚日志是什么地方产生的,这样在找出问题时需 要花时间搜索代码。Logger 通过调用“new Throwable().getStackTrace()”,能够找到输出日志时,程序执行到的类名,方法名和行号。这些信息被分析后输出到日志文件,成 为 CALLSTAMP 列显示在日志的右边。值得说明的是,在分析调用栈时,需要得到除了 Logger 之外的第一行,因为要记录的是调用 Logger 的函数,而不是 Logger 自己的函数。以下面的调用栈为例,这里的 EnableInstanceCheck 函数才是需要被记录到日志中的,而不是 logMessage。

t8d1st} q0{$cm0

e&f0YBn'f'c0  例 6. 待分析的调用栈

&~'^:k t)DZG$f8q`051Testing软件测试网h s:i&v#p5Z Z;D

51Testing软件测试网6Y E g] A

Logger.logMessage()51Testing软件测试网&WL.H m/gn|(]2A
Logger.logDebug()
]$^|K5kCY0SpellCheckTask.EnableInstanceCheck()51Testing软件测试网6QP jbL$r
script2.testMain(Object[])
51Testing软件测试网}m(J['R3@%D

  记录日志生成的时间:顾名思义。时间对于日志分析也是非常有用的信息,通过比较每行日志记录时间有助于找出性能相关的问题,例如当两次点击被测程序的时间比较长的时候,有可能是因为在第一次点击时的性能不够好,没有及时响应。具体实现比较简单,此处不再介绍。51Testing软件测试网T&]yf7v

aj1~R1q%z0  记录测试环境配置信息:包括测试平台,产品版本和配置信息等。这些内容在 Logger 初始化的时候由 Logger 分析输出,可以帮助我们分析定位由于平台和配置差异导致的问题。

zr b/{zBp9p0

%mB9hH(h%UpwM0  除了通过单一日志文件显示具体每一测试用例的信息,Logger 还能为每组测试用例生成测试报告,格式如图 3 所示。它提供了每个用例的结果,通过率等信息,还包含日志文件的链接

,m `${&x ]\#C ^0

图 3. 测试报告

h8Q6jJ5t!~2X0

51Testing软件测试网5x(?n p2Gt

PP_y9K&Fw,l)V0  自动记录测试步骤

5F2XB?B c051Testing软件测试网b-R|l%CW3L'Z/?2Q

  Notes 的 Logger 能够帮助我们自动记录测试步骤,下面让我们具体看一看这一功能的作用和实现方法。首先,记录测试步骤的好处有哪些呢?对 Notes 测试来说,有如下两点:

#Ed$r*V+K6pdG}051Testing软件测试网R#\ F/}m1f})Z

  1、测试人员不需要读测试代码就能知道用例的测试步骤51Testing软件测试网"{F7c"{u{2R

[1G'r+i@I;Ac0  2、测试代码往往有不同的逻辑分支。有了实际测试步骤,能够知道实际运行到的代码分支

3Z w ^i4t$yDEd0

图 4. 测试步骤记录示例51Testing软件测试网_ `;i ^fa!J!Z

5Eu Dz0bkx0

  图 4 是测试中实际执行到的例子。其中典型的部分是:

g-K?K3Zkv!A1F0

L"QMid'K"t*Z9f7~[0
Dialog: Replace - click on (Close) NPushButton

  它表示点击了 Replace 对话框上面的 Close 按钮。短短一行日志包括下面 4 个方面的信息:51Testing软件测试网L6Vm O4ll+fF A%~!h

  1、控件所在容器的名字51Testing软件测试网#]M#C-t^?$W

  2、控件的名字51Testing软件测试网KZ-c1WmA]X%?j

  3、实际执行的方法名51Testing软件测试网)g9b9v3Ult

  4、方法接受的参数51Testing软件测试网@6BGy%C0g v

  如何自动找到这些信息?让我们先看一看这些对象是如何使用的:51Testing软件测试网NPmU&p+]$\

  例 7. 用例如何使用测试对象

H8L3`:uvA'P]+G%v3V0

51Testing软件测试网seT|5J#a$VM}AMt

p"o,^ Gb%uQ H0// 测试对象的定义
'YZ5Pm4ei r/P0class DlgReplace extends NNotesDialog{
)~/}0~[G L0J\)N0    public NPushButton getClose(){
;j{ J K&zK7\u.U T0  return new NPushButton(id, this)51Testing软件测试网*w(T Y%|B5S B e*x%n
  }
^)u Q-@I6O0}
51Testing软件测试网${Q7I2[/Uw?

8T]+rK;B{e yN4?0// 用例中点击按钮51Testing软件测试网4a$J-]A` JXi%w x
NPushButton btn = new DlgReplace().getClose();51Testing软件测试网P5H_^:e/FjQe
btn.click();

N e#jCZ\!D0

  从例 7 中控件与对话框的定义不难找到我们需要的四项信息:对话框叫 Replace, 按钮是 Close, 方法是 click,并不需要参数。问题再于如何将这些信息收集起来,并且在需要的时间输出到日志文件里。我们的解决方案分别如下:

2}K ~3^lQ0

  1、构造控件时,记录调用栈 ( 例 8),从中找到容器和 getter 方法的名字:Replace 和 Close。之所以我们不在控件调用 click 方法时,使用控件内部的方法获得控件容器的类名,有两个原因:51Testing软件测试网@)D_k WoD^5_

  a)容器有可能会互相嵌套。测试人员最关心的是最顶级的容器名字,比如对话框51Testing软件测试网F'NW6pZ!pjW

  b)不是所有控件构造时都传入了容器的引用。例如 web 控件通常用 xpath 定义,构造时并不需要指定容器,这样的控件没有内部方法获得控件容器的信息。51Testing软件测试网 R;OS/dLu

2@\(QO#\r?0  例 8. 构造控件的调用栈51Testing软件测试网Q!dj0r P,P

[\WPjJ~)Z051Testing软件测试网b8Q.W5_Y_3tS(q

NControl.<init>(ControlID,String,INControl)51Testing软件测试网J5Y2f.|"`dy
NPushButton.<init>(ControlID,INControl)51Testing软件测试网T*C#d3mf(Fl
DlgReplace.getClose()
51Testing软件测试网E6D y3C*N#~

  2、调用控件方法时,记录调用栈,从中取得第一次调用时的方法名。

.L+rm/PjI#U0

._-rBNH0  例 9A. 点击按钮时的调用栈51Testing软件测试网qk8s;H WP8W/Cb

k6gkJA5~4g-F0

f AA-J9a0bM'Wy)Me0
NPushButton.click(Point)51Testing软件测试网6?1F5oxyz8a
NPushButton.click ()51Testing软件测试网]X^5sG-L5F
script2.testMain(Object[])

+[af2pcqp|0  例 9B. 操作控件时的调用栈

.M4ro8{ x4g?0

%f I(r!vpPXj051Testing软件测试网{8}fo"z9VA$Yl&R/Q&T

NComboBox.click()
&h.y"\c,R$]!rb$x0NComboBox.clearText()51Testing软件测试网@:[%}S6M(OL1`u;^
NComboBox.setText(String)
]p(wP"L?7y0script2.testMain(Object[])
51Testing软件测试网"s S:](rX)P?DnKOo

  当执行自动测试到 DlgReplace.getClose().click() 时,函数调用栈如例 9A 所示。显而易见,最后调用的 click 方法,对应了该次操作。然而大多数情况并没有这么简单,比如在文本框中输入文字时需要执行若干子步骤,包括点击控件,清除文字,和输入文字。这些步骤都在 setText 方法中调用。如例 9B 所示的调用栈。控件的方法可能会相互嵌套,只有第一次调用,才是最便于理解执行步骤的。我们在 click 函数里分析调用栈,能知道调用 click 方法是为了往控件上输入文字,然后记录成 setText。值得注意的是,如果把每个调用栈都转成步骤输入到日志的话,会包括重复并且很有歧义的信息。这就需要引入一个机制避免重复输出。我们的解 决办法是每次输出时,将调用栈每行的行号都记录下来。下次输出时把当前的跟原先的比较,如果是一致,表示属于同一次操作,直接忽略掉。51Testing软件测试网4ekR | ba`,F/c

51Testing软件测试网TQ'Uab Q]Sy

  3、记录传入的参数。这个很容易理解,比如调用 setText("hello") 时,把 hello 记录下来。

#T wMtc0

z2?6f1] P5B4h0  通过上述三步,我们就可以获得操作步骤的信息。有了这些信息后,需要在合适的位置调用日志函数,将步骤输出到日志中。在 Notes 项目使用的控件库中,所有 Notes 控件有一个基类,这个类定义了 click 方法,控件库的其它类都是由它继承而来。因为几乎所有的 UI 操作都会直接或间接地调用 click 方法,我们只需要在 click 函数开始的时候,组合上面说的四项信息成测试步骤,然后调用日志函数把测试步骤输出到日志文件中。在这里,我们给出的只是基本原理,您可以结合自己项目实 际的特点,实现这一功能。51Testing软件测试网(l D*s2k"T8jF

51Testing软件测试网D:E8L/hcNF

  总结

:J^mW*F:R1@ \0

]!V#i&YT*E0  提高测试结果分析效率和自动化测试过程同样重要。本章从测试用例的准备开始,由浅入深地介绍了如何优化测试用例,用例如何记录日志,以及日志能 提供什么功能,各个功能又是如何实现。在最后,我们还介绍了自动记录测试步骤的基本原理。希望能够为您提供改进测试日志的思路和指导。在本系列的下一章, 我们将会为读者介绍控件库的设计和使用,其中也会介绍录制用例和自动生成对象定义的基本原理,敬请期待。

d'V0]+X Jz6d9FhT051Testing软件测试网Xb a \yG

相关链接:51Testing软件测试网#SbdzkLY:C

51Testing软件测试网#C\+B(Y*DJ

实战 GUI 产品的自动化测试,第 1 部分:简介51Testing软件测试网*` qEZ+`4Ws

GrlryW0实战 GUI 产品的自动化测试,第 2 部分:构建利于维护的自动化测试系统

}]L-c-@Ic&WM-n0

TAG:

 

评分:0

我来说两句

Open Toolbar