更多的文章,访问我的个人博客:www.cesoo.info

在AC上开发和运行QTP自动化测试脚本

上一篇 / 下一篇  2010-11-25 11:42:50 / 个人分类:自动化测试框架

AC应用案例:金融系统自动化测试

对于金融业务系统来说,测试案例往往涉及到数据校验,交易确认,业务关联等等,手工测试执行起来比较复杂,更不用提自动化测试的实施了。这也是当前金融系统业界功能自动化测试程度不高的原因之一。51Testing软件测试网 Y]m8P:M[0W st8K J

1  金融系统业务测试的复杂性

比如某个银行支付系统的转账案交易,手工测试大概的流程如下:

R)h5{:Y2`/E1T0

1.创建Test Account AAccount B,并在各自名下建立相应权限的转账卡51Testing软件测试网h&zEYZ%_

2.使用Account A登录银行转帐系统,使用名下某一张卡对Account B做转账交易,支付金额为1000元人民币.51Testing软件测试网 nCn-EH8lw

3.      查看Account AB的余额,确认A账户减少1000元,B账户上增加1000元。51Testing软件测试网6Ew V]%ir8F?%d0R!`

 

{0F.jcr0

以上三个步骤从银行业务角度来看是各自独立的三个功能,但在转账场景里,又有密切的联系。步骤2依赖于步骤1的先决运行,步骤3则需要步骤2的转账数据。

"PK,JNJ0

使用QTP等工具针对以上案例开发脚本,则会面临棘手的问题,如果把三个功能写在一个脚本里,就会大大降低每个功能脚本的复用性。若开发成三个不同的脚本,那么彼此的关系和数据交互又需要增加额外的开发成本来实现。51Testing软件测试网j {"ULK.F

2   使用AC的观点完成TestJob的定义

AC的世界里,一切都得非常简单,三个功能将被定义成三个TestJob51Testing软件测试网*Y?/^ rh

Create_Account_Info负责创建测试账户AB,然后将accountAaccountB作为参数输出。AC中做如下定义:

D5~k%q4QGb(t(ZC}j0

<QTPname="Create_Account_Info" description="以管理员身份登录后台系统创建测试账户及相关卡信息" depends="">51Testing软件测试网zg^/G0g1M[L

                  <JobOutput name="accountA"/>51Testing软件测试网g;ISKG&} }Kla_

                  <JobOutput name="accountB"/>

*\kig'y0

                  <Lib location=”common\lib\lib_utility.vbs”/>

~#@sG7j qj0

                  <Run path="testcase\qtp\admin_createaccount"></Run>

5Vhn-Z#HG0

</QTP>51Testing软件测试网 c/DL dO6j`3?

其中admin_createaccount是录制好的qtp脚本路径, lib_utility.vbs是脚本使用到的lib文件,AC将会自动加载到QTP运行环境中。

uy ufv&D(nM3Ogp0

Transfer_FromAToB则会运行转账交易,将account A里的款项转给account B,并将转账数额作为参数输出。在AC中做如下定义:51Testing软件测试网 x;Y8[7RZt

<QTPname="Transfer_FromAToB" description="以账户A登录,转账给B账户" depends=""Create_Account_Info">51Testing软件测试网0_0A*GG6vp

                  <JobInput name="accountA"/>

"Ey9K-r$ROJ0

                  <JobInput name="accountB"/>

:e5V:X+G+OMb0Do0

                  <JobOutput name="transfer_amount"/>51Testing软件测试网"^&T#t t_s#g+~

                  <Lib location=”common\lib\lib_utilityvbs”/>51Testing软件测试网:]4\e7{Zr r0e&X"w

                  <Run path="testcase\qtp\transfer_bank"></Run>

&Q u+T?6A nF!V9y5D0

        </QTP>

8vz-P7su)K!}0

Verify_Account根据输入的两个account信息和转账金额,检查account的余额是否预期变化。在AC中做如下定义:51Testing软件测试网 U/M0|Zo$y0_;n4P

<QTPname="Verify_Account " description="检查账户A和账户B的余额是否预期变化" depends="" Transfer_FromAToB">

(h0Rxm%l0

                  <JobInput name="transfer_amount"/>51Testing软件测试网e5_~QA$B

                  <JobInput name="accountA"/>51Testing软件测试网0h)PF/l:x

                  <JobInput name="accountB"/>

\ bf@TKq'?0

                  <Lib location=”common\lib\lib_utilityvbs”/>

$E-K4@.Dl:MT/^-h0

                  <Run path="testcase\qtp\transfer_bank"></Run>51Testing软件测试网-IY.e:V"Dyv9N

        </QTP>51Testing软件测试网 @FKD ha0VlJ

 

(w%q~$W6\Y Q ~;T0

以上三个TestJobAC组织起来,将会根据depends关系计算出执行路径:51Testing软件测试网Z6Maj6my

Create_Account_InfoTransfer_FromAToBVerify_Account

vh%eFpS0

同时,AC搭建一条全局数据通道,所有TestJobJobInputJobOutput等数据都可在这条通道中进行交互。针对QTP脚本,AC提供了框架vbs函数writeInitoACChanel(paraname,paravalue)getDataFromChannel(paraname)实现写入和读出全局数据的功能。51Testing软件测试网K!o/l5q3k1M9r3M

上面谈到的是一种理想的TestJob结构模型,在实际的业务中,还有一些比较复杂的因素。比如,Create_Account_Info创建测试账户,测试卡号等信息这些工作,更合适在产品实例安装结束之后,作为基础数据被sql脚本直接创建至Database中。

4h].h0E's!u2_0

这时,我们可将Create_Account_InfoQTP改由Java类型,而接口维持不变。

8[1b\$RA#re[0

<Javaname="Create_Account_Info" description="Java程序调用jdbc运行sql脚本,在数据库中创建基础数据" depends="">

1S$a`*k%w2DQ W S0

                  <JobOutput name="accountA"/>

t5^)X-x(Buu(u0

                  <JobOutput name="accountB"/>

3@b'EJl}_2GKB u0

                  <ClassPath location=”javacase\jdbc_sql.jar”/>

+k T0H-u[4lp)g$jNM-M0

                  <Run path="jdbc.createAccount"></Run>

oZ6}@f0

        </Java>

#g5xHo.CB)Z0

 

1?8O1n.Sd$c7z0

其中jdbc.createAccount是按照AC规范自开发的java程序,调用jdbc运行sql脚本。

N&mpV a-n o v0

这种好处显而易见,Create_Account_InfoQTP转换成Java类型之后,只要接口维持不变(JobOutput不变),那么其它两个TestJobTransfer_FromAToBVerify_Account不会受到任何影响。51Testing软件测试网R9@9bs]M

同理,Verify_Account也可改写成Java或者selenium类型,以不同的方式进行验证。

Te(d[^ ?(x@(vv0

另外一种复杂的情形可能会出现在QTP层面上,如果QTP的脚本规模较大,而又在同一个产品实例的上下文中完成不同的功能。比如,登录后做查账,查账之后做理财交易等等,都是基于一个web session上完成的。针对这种情况,ACQTP提供了一种Factory Mode(工厂模式)的开发方式,使得所有的测试案例的定义和执行可以在同一个QTP执行环境中完成,非常适合QTP大规模的脚本开发工作。51Testing软件测试网!N%X(o*D0R I H/{ t,I

3   AC提供QTP的工厂开发模式

基于录制生成的QTP脚本,是面向功能的,而不是结构化的测试案例。这使得QTP在维护和增加测试案例时,成本十分昂贵。为此,AC引入工厂开发模式,使得QTP的开发像Junit一样清晰方便。51Testing软件测试网#h;{{NL`)Ra.R7R

QTP的工厂开发模式有如下规范:

q`V4f\0

1.      每个QTP的测试案例在表现形式上都是一个Vbscript的函数,测试案例的增加/删除通过增加/删除一个VBSFunction来达到。51Testing软件测试网J/d"x8?{L;my

2.      工厂模式不支持对象库模式的脚本,所有的功能都以Description编程来实现

9vy+D0lt$M3rE%?R0

3.      使用checkDependence函数来检查每个测试案例的运行结果状态

{nbks0

4.      调用writeIntoACChannelgetDataFromChannel来完成测试案例之间的数据交互。

'm!j h;Aswt0

5. 每个测试案例都是一个函数,一个函数是否成为一个测试案例取决于在TestJobFile.xml中的定义。51Testing软件测试网8|8B-D2S3{

 

9dI,i0mDUK0|0

示例:

*~C-Iju-` f0

QTP自带的Flight演示程序,录制生成的脚本如下模式:51Testing软件测试网9Q#HQ6@ew3J

登录客户端51Testing软件测试网-o*GFK.j+jr#_

Dialog("Login").WinEdit("Agent Name:").Set "testing"

d&ry/Xab@d~(~0

Dialog("Login").WinEdit("Password:").Set "mercury"51Testing软件测试网7hSW4p xL

Dialog("Login").WinButton("OK").Click

i,iUrnw&p\0

输入机票信息,下订单

{ C+W5JwfI/R0

Window("Flight Reservation").ActiveX("MaskEdBox").Type "081210"51Testing软件测试网J6Y2iv-BZ$J_[

Window("Flight Reservation").WinComboBox("Fly From:").Select "Frankfurt"51Testing软件测试网KeK2FcT4ReU

Window("Flight Reservation").WinComboBox("Fly To:").Select "London"

0{k3m&h q_ h0

Window("Flight Reservation").WinButton("Insert Order").Click51Testing软件测试网A:^*T,Rtbq

Window("Flight Reservation").Close

#YK.a0a-i0

 

@nk(Os`,w0

QTP录制脚本转换成工厂模式脚本,步骤如下:51Testing软件测试网 ]!p:B0y0qJ@G

1.      创建一个testcase.vbs

m#{_U2W(~[2y-l0

2.      将原始脚本进行description改写,并按照工厂模式规范,写入testcase.vbs

(hYxqA"j0

Function login

PJD@2M0

      '调用框架函数ReportRunningInfo,写日志

0s$s3[IzU9w^ b1] e(h0

      ReportRunningInfo "start to run login test case"51Testing软件测试网8`K1\xb,m.jq_T

      ……………Description创建……………………

)ju9et+?Y(u;U2S0

      Dialog(dlgLoginDesc).WinEdit(editUserDesc).set getDataFromACChannel("user")

'R0C+Y$t1i"O$D0

      Dialog(dlgLoginDesc).WinEdit(editPasswdDesc).set getDataFromACChannel("passwd")51Testing软件测试网Zy2E-?f

      Dialog(dlgLoginDesc).WinButton(btnOKDesc).Click

h+uo#V mhU9lG+|0

      if(Window(flightWindowDesc).Exist(30)) Then51Testing软件测试网/E lk!J(]\h.]

             调用reportPass,向AC报告当前案例成功状态51Testing软件测试网8u)r+l1?8Y2t1}

             reportPass "has sigin in successfully"

5\3|lY5I X4|k0

             login = True51Testing软件测试网!|-L&}/r w&x

      Else51Testing软件测试网wR/B9vm m G4t#c

             调用reportFail,向AC报告当前案例失败状态51Testing软件测试网4R m*y-EF8hxnf

             reportFail "failed to sigin in"51Testing软件测试网$l!IZs8\r7XDV

             login = False

:\+Q_8e s'X0

      End If

v!DW+e6Iz0

      '将用户名写入数据通道,供后续执行的测试案例使用. 

By clzU4Kf0

      username = "sheng.liu"51Testing软件测试网.p1@S9D1vj"i

      writeIntoACChannel "displayname",username

"K F m1k3BC D0

End Function51Testing软件测试网}}B/C}'`^m$y

Function bookFlight

SSKia~(G'h Hi9sl0

      ReportRunningInfo "start to run book flight test case"51Testing软件测试网7l F N$K3q E"B+Jd6V

      '检查login案例是否成功,如果失败,当前案例则返回失败.51Testing软件测试网pi@lR:tJ

      If Not CheckDependence("login") Then

.v2b Bc6xWT^0

             bookFlight = False

7J A8C1x'^2c$\"p%K@i0

             Exit Function51Testing软件测试网M&qe'@]I}%E-s

      End If

0Qd:C9a7sl*s2p0

      …………..Description创建及调用……………………51Testing软件测试网$zHviz

      '从数据通道中获得login案例写入的用户名,作为订单用户名下单.51Testing软件测试网D}m3G9|P gmD

      username = getDataFromACChannel("displayname")

w:PQs t1gw0

      Window(flightWindowDesc).WinEdit(nameEditDesc).Set username

qT7ZY}UU&\0

Window(flightWindowDesc).WinButton(insertBtnDesc).Click51Testing软件测试网9m/iB:Ec#]"L8P-X

      ……………………….

P,ruN:J2O0R0

End Function51Testing软件测试网X \YCUrD9S

3.      定义TestJobFile.xml文件,指定工厂模式和测试案例。

oGfF/jF3f0

<QTP name="QTP_DesktopClientTest_AC" description="demo"factoryMode="true"depends="Java_Init" iteration="">

P:r zb9NB7| c~Yw0

                  <Lib location="testscripts\DesktopClient\testcase.vbs"/>51Testing软件测试网 }B(R d9hx t'~ P

                  <Testdata type="xsl" location="data\data_global_shining.xls"/>51Testing软件测试网"T.Z CtPx

                  <Testdata type="xsl" location="data\data_global_shining.xls"/>51Testing软件测试网x Wxj8e;g,i

                  <Testdata type="iteration" location="data\testdata.xls"/>51Testing软件测试网8d.D?2NeQ7Om RA&W

                  <Case name="test.vbs" description="demo" depends="">

Ej]-`&K\0

                           <Testname="login"description="login flight app"><Run path="login"/></TestJob>51Testing软件测试网QF`6I tlS`

<Test name="bookFlight"description="book flight"><Run path="login"/></TestJob>

*M)w(d`R%K H}%U0

                  </Case>51Testing软件测试网)o;Z }!c:kM)m6I%d

        </QTP>

.\J4yUAB0

4.      运行AC框架

DX)P%PG'y Q+g/`0

AC会从指定的lib路径中获得testcase.vbs,然后以工厂模式运行loginbookflight两个测试案例。并最终形成测试报告。51Testing软件测试网+q!gN)sLd

 51Testing软件测试网t_1GrRa:c

从上面的示例可以看出,经过工厂模式改写后,QTP自动化测试具有以下优势

[3`Ny#M*k~m0

1.      测试案例的粗细粒度更加细微,可以有效地与手工测试案例形成一一对应的映射关系

K7dbj ~U0

2.      扩展性大大增强,增加新的功能点,只需开发新的function函数即可集成到AC中。

&\+C(X7zG5L1w7@@c0

3.      案例之间的依赖关系和数据交互更加密切。51Testing软件测试网,~7j2[&]!?YVx

 

zB%J+Pft H M0

总之,工厂模式非常实用于大规模的QTP的自动化测试脚本开发,大大减少维护成本,提升开发效率。51Testing软件测试网(p)fLO w,c R

Automation Center免费,并逐步在www.cesoo.info发布开源,详情了解

Q!D}e R&J0

http://www.cesoo.info/bbs/

5ab~/znU8M d0
51Testing软件测试网@@ Edq Y


TAG:

ac659574848的个人空间 引用 删除 ac659574848   /   2011-08-29 17:27:57
3
carol2000的个人空间 引用 删除 carol2000   /   2011-07-13 16:56:26
使用agent来封装QTP/LoadRunner的测试工具无疑是一个很取巧的方式,但是问题是人家学习QTP/LoadRunner本身就需要成本,然后再学习AC还需要更多的成本
carol2000的个人空间 引用 删除 carol2000   /   2011-07-13 16:53:59
3
 

评分:0

我来说两句

Open Toolbar