不谋万世者,不足谋一时;不谋全局者,不足谋一域。君子敏于事而慎于言 新浪微薄:土司阿哈

在RFT中运用手动验证点验证自定义类型对象 (一)

上一篇 / 下一篇  2008-09-18 23:17:00 / 个人分类:Rational

1208328177
  • 自动化测试:
  • 测试文档:

4iI5K"i~h"] Y%G)mn5l0 以下内容转载http://softtest.chinaitlab.com/bug/755952_4.html

c#?U,Q.`W"dO3dFF051Testing软件测试网Yo#[ k#n1?)`3T~

Rational Functional Tester(以下简称RFT)是一款强大易用的自动化功能测试工具。在使用RFT进行功能测试的过程中,测试结果的验证往往是通过插入验证点(Verification Point)来完成的。但是RFT的验证点只能验证有限的数据类型,而在实际应用中,对用户自定义类型的验证存在着较大的需求。本文对验证点的验证执行过程进行剖析,并介绍如何通过自定义ValueManager来实现对用户自定义类型对象的验证。

Tj9S DD[{,YK:J0

BjK0Erg}0        1验证点简介

D)N(z P(@051Testing软件测试网!e3~+v XO N

        1.1 验证点的类型

,JZ^4^6|`S051Testing软件测试网6eq#D"qlR?$n

        Rational Functional Tester是Rational最新推出的自动化功能测试工具。RFT具有数据驱动(Data-Driven)测试、scrīptAssure等特性,因而受到广大功能测试人员的青睐。在RFT中,验证点是脚本(scrīpt)中非常重要的组成部分,它完成对被测试程序生成的实际数据和期望数据的比较,并将比较结果写入日志。一般情况下,测试的结果是通过对验证点的执行而得到的。51Testing软件测试网4sjq:q wgCf9|

51Testing软件测试网kk @ gP

        RFT提供了多种形式的验证点,包括:

n0F3qZw+yf S051Testing软件测试网4V6af@8~ Tr"S5N m

        静态验证点(Static Verification Point):静态验证点是在录制(Record)RFT脚本的过程中通过向导插入的验证点,它在脚本回放(Playback)的过程中自动被验证。

4u O?z5~0

&{`#h eu3v:g9N9h0        手动验证点(Manual Verification Point):如果验证点所要验证的内容是由脚本开发人员在脚本中所提供的,则需要建立手动验证点对其进行验证。例如待验证数据来自外部数据源的情况,脚本开发人员需将数据读取后以参数的形式显式传给验证点。

!S2q/[f${3z0

r w qco7N TD0        动态验证点(Dynamic Verification Point):动态验证点是在脚本首次回放时建立的。验证点一旦建立,其行为就和静态验证点相同了。

7rIsV] P!o7_0

h/`M RSD8b2U9D0        如果以录制-回放(Record-Playback)模式使用RFT进行图形界面(GUI)的自动化回归测试(Regression Test),较常用的是静态验证点。而由于RFT的数据驱动测试特性以及与其他RUP工具的良好集成,使之也是非图形化界面的功能测试的首选工具之一。在这些测试用例中,存在着大量的用户自定义类型对象,这些被测试对象并不能在录制过程中被插入对象映射表(ObjectMap)中,也就是不能使用静态验证点来进行验证,这就需要我们使用手动验证点来比较它们。

,O(@f;e oA"d051Testing软件测试网,r\,iR$i}o9g

        1.2 验证点执行过程51Testing软件测试网M8|J LM N9V"U

51Testing软件测试网]b*r;D y'fo0QL~1S

        在RFT中,手动验证点有两种声明形式:

l:_Q3F"{ m"C051Testing软件测试网U6F ?Q*X|,v r

        IFtVerificationPoint vpManual (java.lang.String vpName, java.lang.Object actual)

`T[S!{z7R yMQ}051Testing软件测试网/EkxBop HC:h Bp

        该声明接受两个参数,第一个参数为验证点的名称,第二个参数为被测试对象。可以通过如下方式在脚本中调用该方法:51Testing软件测试网$qc)LJB OoC

D+_ZG d0        vpManual("VP1", "The object under test").performTest();

N%dtG@d1T^ @051Testing软件测试网!N9F;s&X]p+r geM

        这条语句的作用就是判断被测试对象和基准线(Baseline)是否一致。这里所说的基准线就是期望数据,它以XML格式被存储在磁盘上,后缀名rftvp。

.Gf2Di9UV$G NG h*j6Y0

XM:qVp0        当回放脚本时,如果基准线所对应的文件已经在磁盘上存在,则RFT会比较被测试对象和基准线中的数据是否一致,如果一致,则测试结果为成功(Pass),否则为失败(Failed);如果基准线尚不存在,则会以当前被测试对象作为基准线存入磁盘。51Testing软件测试网1t _(pYh&j'xKB

B v;^\*NKuzR0        IFtVerificationPoint vpManual (java.lang.String vpName, java.lang.Object expected, java.lang.Object actual)

3vm H0nk'|051Testing软件测试网n(@2hH%pC'B4Z2k,s+n

        手动验证点的另一种声明接受三个参数,第一个参数为验证点的名称,第二个参数则为期望数据,第三个参数为实际数据,也就是被测试对象。可以通过如下方式在脚本中调用该方法:51Testing软件测试网6{N]1`4rB r;Q{

51Testing软件测试网U!s6E*LNQ#f1y5`

        vpManual("VP1", "Expected object", "The object under test").performTest();51Testing软件测试网k^!s%m!r^(|"RS#P*Z\

MFI/kT~@@ T0        当脚本回放时,RFT直接比较期望数据和实际数据,并将比较的结果被写入日志。总的来说,验证点的执行过程如图1所示:

3x8iH"ntV0

51Testing软件测试网j$Ugr:V^9H(fY

(HM;\o+np`&r'Y#r`0        图1 验证点执行流程图51Testing软件测试网?-_Daye*V)db

51Testing软件测试网S"Bm:~;R?(|

        不难看出,在执行验证点的过程中,涉及到了将数据写入磁盘以及从磁盘中恢复数据的操作。将这些数据写入磁盘便于测试人员使用工具查看和编辑。但是这也带来了一个问题,对于开发者自定义类型的对象,哪些属性需要被写入磁盘,这些属性按照什么顺序写入都是类型相关的,需要脚本开发者自行定义。更重要的,如何比较自定义类型也是RFT所不能确定的,换句话说,脚本开发者需要告知RFT对象一致的标准。以上这两个任务都需要通过创建ValueManager来完成。

^ h2HH/o9u051Testing软件测试网T)q(p/H_Z h

        ValueManager 可以用类特定(Class-specific)的形式比较和持久化用户自定义的对象。它是IManageValueClass接口的实现。只有拥有自己的 ValueManager的类型才能作为参数传递给vpManual。这些类型被称为基于Value-class的类型。缺省的,只有基本数据类型, String,Vector等少数类型才是基于Value-class的类型那么,如何才能实现我们自己的ValueManager呢?在下面的章节中,我们将通过一个实例来帮助您建立自定义类型的ValueManager。

3\]R0a9d0

aIx"x@(Lb/c/Q%sk0        2. 实例分析--如何实现ValueManager

`^~L6Mk3`7d051Testing软件测试网uRMrp@(p&g e

        2.1需求的提出51Testing软件测试网-DO g _ V0{

51Testing软件测试网 h&N ~Y4b

        假设我们需要验证一个计算图形重心的算法。该算法的输出结果为一个自定义类型MyPoint,它表示的一个平面上的点。它具有两个属性x,y,分别表示其横纵座标。MyPoint的实现如下,除了构造函数,它还提供了x和y的getter和setter方法。

/zH)_(UC0

_'}*v2f2u0        以下是代码片段:

         public class MyPoint51Testing软件测试网D4C&jTI3]
        {51Testing软件测试网L hlS6\IV0b
            int x;51Testing软件测试网9[m3RE(N
            int y;51Testing软件测试网*x+^TK+G[0d
            public MyPoint(int x, int y)
8ug+LsRT/}0            {51Testing软件测试网1Bx2g0c/wQkQ)H
                this.x = x;
U4gj)|S$oA\+J6F0                this.y = y;51Testing软件测试网6Z'G)e,[_&b.a
            }51Testing软件测试网ST5y;T%P4T
            public int getX()51Testing软件测试网@jk@2h$eM
            {
'[HC?9YaL.A0                return x;
1W1DC[Ak0            }51Testing软件测试网7_#G$Ke8`2E"KHJDK
            public void setX(int x)51Testing软件测试网4y,xJP!R;nq
            {51Testing软件测试网'z#GuMJ
                this.x = x;51Testing软件测试网&If hB~k-{.o
            }
JM*v!@uL*rN0            public int getY()
cj%u9i+Ba0            {
C IRbm%q,}%G0                return y;
z4Q3X"],ZO0            }51Testing软件测试网{3F(f._._ Xhipm
            public void setY(int y)51Testing软件测试网MePN ~ jjon
            {51Testing软件测试网7t?+U-m:}
                this.y = y;
4{_W[ G(Z0            }51Testing软件测试网)Z,I/cUb w
        }
51Testing软件测试网 TAK,_I
        我们的测试人员需要判断该算法得到的重心点是否正确,可以使用了如下脚本:
         MyPoint point = getCenterOfGravity(polygon);51Testing软件测试网#] vNa [ Lt
        vpManual("VP_CG", point).performTest();

/x)Kx%{8k7|"I4M*F6U T6~0

{6|Du6\0Y g2v7B-MC0        上面的语句将在第一次回放脚本时将得到的重心坐标写入磁盘;测试人员可以使用验证点编辑器查看得到的基准线是否正确;在此后的回放中(通常是回归测试中),上述代码的工作就是比较当次回归测试得到的重心对象与基准线是否一致。51Testing软件测试网C3EU1T3rzz

51Testing软件测试网([d,R y@*z(w{l4i

        但是,如果直接调用该语句,RFT就会抛出异常(Unsupported type, value class required),说明MyPoint不是基于Value-class的类型。要使MyPoint成为Value-class,必须为其实现相应的 ValueManager,并部署到RFT中。

Q5]{{:u!u%F0

TAG: Rational

 

评分:0

我来说两句

Open Toolbar