?-i.RUX/V
a {7C0 隐藏和显示不同级别日志的选择按钮:以往分析日志的第一个感受就是日志内容太多太杂,在分析的过程中很容易丢掉主要的线索。另外,不同的读者需
要的内容不一样,比如手动测试的人只关心验证点是否通过,而自动测试人员需要知道所有测试细节。Logger 通过提供 logError,
logWarning, logDebug
等函数,把日志级别信息也同时输出到日志文件中。在检索日志文件时通过点击日志文件上方的选择按钮,我们就可以隐藏或显示相应级别的日志内容。
(L
cr,_ogbPH0pIsZ;F6`yV$c[d0 按照关键词筛选显示日志内容:跟上一点类似,提供更灵活的方式,按关键字筛选显示日志,便于查看测试人员关心的内容。关键字不仅可以是日志内容的某一部分,还可以是类的名字。
1]_;g&E ?051Testing软件测试网3b%VzUu}5QL 截图的链接:一图胜千言,截图是分析日志最直观的工具。当测试出现错误和异常时,Logger 能自动截图,把图片按日志文件的目录结构保存在电脑上,并且把文件路径作为链接显示在日志中。通过截图,测试人员可以更直观的了解出现的错误和异常。实现截图的代码如下:
s4x?%Z4QxJ
i,F051Testing软件测试网m7x*_YAR
W 例 5. 实现截图功能
%U$Vx~9Jc/S0A r)S}QrE2K051Testing软件测试网"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.fu 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{$cm0e&f0YBn'f'c0 例 6. 待分析的调用栈
&~'^:k t)DZG$f8q`051Testing软件测试网h
s:i&v#p5Z
Z;D51Testing软件测试网6YE
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 分析输出,可以帮助我们分析定位由于平台和配置差异导致的问题。
zrb/{zB p9p0%mB9hH(h%UpwM0 除了通过单一日志文件显示具体每一测试用例的信息,Logger 还能为每组测试用例生成测试报告,格式如图 3 所示。它提供了每个用例的结果,通过率等信息,还包含日志文件的链接
,m`${&x ]\#C ^0图 3. 测试报告
h8Q6jJ5t!~2X051Testing软件测试网5x(?n p2Gt
PP_y9K&Fw,l)V0 自动记录测试步骤
5F2XB?Bc051Testing软件测试网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 Dz0bk x0 图 4 是测试中实际执行到的例子。其中典型的部分是:
g-K?K3Zkv!A1F0L"QMid'K"t*Z9f7~[0Dialog: Replace - click on (Close) NPushButton |
它表示点击了 Replace 对话框上面的 Close 按钮。短短一行日志包括下面 4 个方面的信息:51Testing软件测试网L6Vm
O4ll+fFA%~!h
1、控件所在容器的名字51Testing软件测试网#]M#C-t^?$W
2、控件的名字51Testing软件测试网KZ-c1WmA]X%?j
3、实际执行的方法名51Testing软件测试网)g9b9v3Ult
4、方法接受的参数51Testing软件测试网@6BGy%C0gv
如何自动找到这些信息?让我们先看一看这些对象是如何使用的:51Testing软件测试网NPmU&p+]$\
例 7. 用例如何使用测试对象
H8L3`:uvA'P]+G%v3V051Testing软件测试网seT|5J#a$VM} AMt
p"o,^Gb%uQH0// 测试对象的定义 'YZ5Pm4ei
r/P0class DlgReplace extends NNotesDialog{ )~/}0~[GL0J\)N0 public NPushButton getClose(){ ;j{JK&zK7\u.U T0 return new NPushButton(id, this)51Testing软件测试网*w(TY%|B5S
Be*x%n } ^)uQ-@I6O0}51Testing软件测试网${Q7I2[/Uw? 8T]+rK;B{ e yN4?0// 用例中点击按钮51Testing软件测试网4a$J-]A` JX i%wx 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
[\WPj J~)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
fAA-J9a0b M'Wy)Me0NPushButton.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'UabQ]Sy 3、记录传入的参数。这个很容易理解,比如调用 setText("hello") 时,把 hello 记录下来。
#TwMtc0z2?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软件测试网Xba
\yG相关链接:51Testing软件测试网#SbdzkLY:C
51Testing软件测试网#C\+B(Y*DJ实战 GUI 产品的自动化测试,第 1 部分:简介51Testing软件测试网*`qE Z+`4Ws
GrlryW0实战 GUI 产品的自动化测试,第 2 部分:构建利于维护的自动化测试系统
}]L-c-@Ic&WM-n0