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

使用自定义代码对数据池进行随机访问

上一篇 / 下一篇  2008-06-17 13:11:27 / 个人分类:Rational

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

使用自定义代码对数据池进行随机访问

(R0z0I7YI:I lN3Q0

为了更加稳健的测试,可以用自定义代码使Performance Tester随机化。目前,Performance Tester数据池中的元素只能按照顺序进行访问。这篇文章讨论了作者如何创建自定义的Performance Tester代码,并用随机数据访问来实现数据池。这篇文章提供的了RPTDataPool类,以及如何实现它的详细说明。51Testing软件测试网 R5fK {y%b

   注意:这篇文章适用于IBM® Rational® Performance Tester Version6.1.2.00251Testing软件测试网l}+C&Y0d

   好的测试不仅仅是重复执行相同的动作。为了更好的模拟实际用户的动作,测试人员可以利用IBM Rational Performance Tester中的数据池。这是远超出使用静态记录测试的一步,因为它允许测试为每个执行来选择不同的变量。例如,无论什么时候应用软件要求用户输入搜索条件,比如一个电影的名字,一个标题或者标题的一个部分都可以从数据池中选择。

(J5el)h0P2P[+t0

   目前Rational Performance Tester数据池仅仅是顺序存储。在这个电影搜索的例子中,每次你运行这个测试时,相同电影名称的搜寻都是以相同的顺序来进行处理的。通过对要搜索的标题进行随机选择,可以提高测试的稳健性。

m+yw7io0

   数据池文本文件

'RwZyb.]0

   i5/OS系统测试环境中,IBM测试自动化小组自从2004年就一直在将Mercury LoadRunner的脚本转换到Rational Performance Tester。为了随机化i5/OS测试的变量选择,我们创建了一个Rational Performance Tester自定义代码的包,来对数据池中的元素进行随机存储。这个执行一点都没有用到Rational Performance Tester数据池的特性。相反,Rational Performance Tester DataPool类读取的文本文件中包含要使用的数据池条目。

,f]L ]SG+K)r&i0

   这个将选择元素随机化的数据池文件是一个每行仅包含一个元素的纯文本文件。用Rational Performance Tester来实现它的一个简单的方法,就是为测试项目的文本文件创建一个数据池文件夹。一个文件输出包括这些文本文件,因为它们被包含在Rational Performance Tester项目中。当转换Mercury LoadRunner脚本时,你可以通过LoadRunner数据文件来实现。51Testing软件测试网5W u.^%S;u

RPTDataPool51Testing软件测试网_8?\I0c gx] Jz7S

   这个文本数据的文件名传给创建者,整个文件在首次访问尝试时就被读取进入了Java™ Vector对象。为了从这个数据池中随机重新找到一个条目,可以使用getaDataPoolItem方法。(参见列表1。)51Testing软件测试网}#f4| wh a2q"c

注意事项

-Xf#a,[6D ~ x(C0

   记住整个文件在测试的开始就已被读入存储器是十分重要的。巨大的数据池将会用到大量的内存,这将会降低加载和Rational Performance启动的速度。巨大的Rational Performance Tester测试数据池也会发生类似的情况。

R DAsCSlV0

   你可以使用每行包含多个元素的数据池,但是用户必须在这个测试的自定义代码中增加一些功能来取出单个元素。

G?F!Jq D+ZdFp+b0

51Testing软件测试网vk!b1X"Y Q)~je3`
   列表1. getaDataPoolItem方法
+p e^-P }c d0    
g nl}Oh0import .io.*;51Testing软件测试网$AQP;X:N'?G
import .util.Vector;51Testing软件测试网&hL5Z An']
public class RPTDataPool {51Testing软件测试网Pz+pOyKb)p2o6W#W P
    private boolean DataPoolIsLoaded = false;
+y [$n'C!i_(^-[dv0    private String DataPoolFileName;51Testing软件测试网ZT-|R2Hupk K
    private Vector DataPool;
5?i+I A"[R0    private int DataPoolCount = 0;51Testing软件测试网`] lA:ql
 51Testing软件测试网'r]| @(V-O&J
    public RPTDataPool( String fileName )  {
DHr7^/d'fM)g&^ ~0        DataPoolFileName = fileName;
6ENNa]l ZOM/q([7z0        DataPool = new Vector();51Testing软件测试网\`w.BI(v
        DataPoolCount = fillVector( DataPoolFileName, DataPool);
`5gK&|#tz0        DataPoolIsLoaded = true;51Testing软件测试网 bFB xV[
        }51Testing软件测试网Qn^i!eIi~v
  51Testing软件测试网yC1jK?O6E
    public String getaDataPoolItem(  )  {
Hd`0u dMhaT0        if( !DataPoolIsLoaded ) {
a d:Q$@!@} X"^1@0            //System.out.println("loading:" + DataPoolFileName);
"U``Q&Ckpq0            DataPoolIsLoaded = true;51Testing软件测试网'Cy s.E.bU*b-Q
        }
Le AF2\v0        return (String) DataPool.elementAt((int)51Testing软件测试网1^8sy:e t2Yf y
          (Math.floor(Math.random() * (DataPoolCount))));
y/Od8O5\ V}x0    }51Testing软件测试网 K O6F.JR
   51Testing软件测试网 ZxQ,WM
    private int fillVector( String fileName, Vector FileLines) {51Testing软件测试网"V }/j\I
        // take the Datapool file and read it into a Vector
&| _Y}&Qn0        // do this only once per test51Testing软件测试网vO-r0p%Wt}8X
        int fileLineCounter = 0;
6`xP1Pn:Q,B0       
K^G mP[r0        BufferedReader brInReader = null;
rc&pv$pL0       
X1R*~,T3`?2L~)a;GTM0        // read from the file51Testing软件测试网AdkJ9O&y
        // try to setup a buffered reader and open the file51Testing软件测试网r(g9z iW.le
        try  { brInReader = new BufferedReader(new FileReader(fileName));}
Jh3Lp*~#m,r'a0        catch(Exception error)
I\-m3K |;p/V/R e/Q0        {51Testing软件测试网Z3|I(dTzT
      //System.out.println("Error Opening DataPool File: " + error);51Testing软件测试网/a8L+[5n3^n&p$rQ1a
      return 0;
u[-Y/_crro0  }51Testing软件测试网 BsfN*c oU ^2C2B
  
Cq[b _8T7T0  // read the file and place the lines in an array51Testing软件测试网w4U)a:l:c)E(j
  // get the first line of the file51Testing软件测试网,uF g _hz$Y!dY
  String sInLine = ReadLine(brInReader);
P`&tg1t4z U0  
-Z*U~t%GO0  // read through the file
/Z7c'v6x I/m%P0  while (sInLine != null)
#c*F eG7~ a t0  {51Testing软件测试网f``1\;w?$}0gs5I
      //System.out.println("Storing '"+ sInLine+"'");
ym{8jvc3R.}-M0      FileLines.addElement(sInLine);
t$qrF f2L;y RK5T0     51Testing软件测试网 rl.f9X,k(]'z$T
      // read the next line51Testing软件测试网2?[#U*AJZ2I
      sInLine = ReadLine(brInReader);
W2Es#nd/J0     51Testing软件测试网2U2U@9W9M/E"G ~
      fileLineCounter++;51Testing软件测试网"h[0SaHD1R3B5n
  }
])v;H {&A{P0  
Qz\ tx ]{!a"oC0  // At this point, the FileLines Vector has all the lines
5a o-AG;j C0  from the file and fileLineCounter51Testing软件测试网X3w_-l(N;IX0@1n
  51Testing软件测试网5Q?R&F$PS%t]
  // indicates the max index value for the array51Testing软件测试网K:R,J Cv4d1?k"_f _
  return fileLineCounter;
-Dq/S&Dt L5z0  }51Testing软件测试网qi$C"NW,fq
  
{6t q w|$NBmu0  // ReadLine
5uSA)Zn1k}L:a0  // This method will read a line from a given file and return the string value
r$d.Y?k7|f$i9\0  // ********************************************************************************51Testing软件测试网N5y _X&N2oyB3]
  
.kr!R O2rM}*P[OM0  private String ReadLine(BufferedReader brReader) {
x%~v*rE@\0      String sReadLine = "";51Testing软件测试网 fG:} m*ks!rj.c}W`
      try  {  sReadLine = brReader.readLine();}51Testing软件测试网j!I8p K^pOf.|
      catch (IOException error)
}$@0?0f\6Nq0      {//System.out.println("DataPool.test Read Error: " + error);}51Testing软件测试网 R4c!xWJq6l
     51Testing软件测试网!}pJ V4XfYU5W.G k
      return sReadLine;51Testing软件测试网ggTeL@jj
  }51Testing软件测试网c(ElDN:I)E`{ U:M
  // end of Read
,dCl/C5H G uP0  }

2C/e7Hzz _.L$u)s0

51Testing软件测试网8{y m8V ? Er
   在测试中实例化数据池对象

U5b.@8U9B0

   Rational Performance Tester测试项目创建一个特殊的类来实例化这个数据池的对象。这里,用MovieSearchDataPools来举例说明,这个电影搜索项目需要三个不同的数据池(请看列表2

\!`2w4ZQH.` n0


q%H-}4w%w0
列表2. MovieSearchDataPools例子
8iO*`#R dMt0    
51Testing软件测试网E)T u,x ]

public class MovieSearchDataPools {51Testing软件测试网l&w4H"w6v(Q7_
    static RPTDataPool Titles =
"{F}+bG{(Jg'y0        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieTitles.txt" );51Testing软件测试网 es:IjrX"ox9Jo
       51Testing软件测试网~`|`d r v
    static RPTDataPool Directors =51Testing软件测试网@MZxN`/T:Oq
        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieDirectors.txt" );
8z.lOr6`HbYU0       51Testing软件测试网D(p;h6?_&x+h e)w
    static RPTDataPool Actors =
qY;u;Uk0        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieActors.txt" );
9]3o@b;mC;[SK W0    }

T}GD*n2VUw]3wr0


'tI-rE\0
   使用自定义代码从一个数据池中取回数据

B_"a&vY2a w|0

   要取回一个元素,在一个自定义代码模块中使用getaDataPoolItem方法。用这个电影搜索的例子来取回一个任意电影的标题名称,如列表3所示。51Testing软件测试网Ta!\KB.UpT

51Testing软件测试网d uJ xg'z
列表3:使用getaDataPoolItem方法
^q3I!n\2?0    
2Kg1`0t g2D;o0package test;

/|]'JUe g(O X8W5JR0

import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices;

~{sj8o0I0

public class GenerateRandomTitle implements51Testing软件测试网:~x{q'@ B7oe8Q
    com.ibm.rational.test.lt.kernel.custom.ICustomCode2 {51Testing软件测试网0L3x2j)HTS9Uq;?
   51Testing软件测试网9Yo,B'Or8`6fp
    /**51Testing软件测试网]8xw+i![g6?\ r7Y
    * Instances of this will be created using the no-arg constructor.
*Y!]'MR8hTo9z&?/J0    */51Testing软件测试网z ]x#vM4n#L
    public GenerateRandomTitle() { } 51Testing软件测试网 }s:vPO:Mw
   51Testing软件测试网8~.qAv OI*pE v
    /**
t.o&qHE@M+}0    * For descrīption of ICustomCode2 and ITestExecutionServices interfaces,51Testing软件测试网8P]#E0n B&V
    * see doc located at 
51Testing软件测试网2g yan}(fu/Ej Q

/rpt_prod/eclipse/plugins/com.ibm.rational.test.lt.kernel_/pubdoc51Testing软件测试网k1Z {(tW(@H
    */
,N1mT&t7A qAgz mP0   51Testing软件测试网2w1GH%_B
public String exec(ITestExecutionServices tes, String[] args) {
X3yXXX QQ0    return MovieSearchDataPools.Titles.getaDataPoolItem();51Testing软件测试网4{!VJw&BL
    }51Testing软件测试网nW&WB8z&D4IC
   51Testing软件测试网8VCC$Ba[ ivw
}
51Testing软件测试网#FTxgy
   你可以使用来自搜索电影的HTTP请求中的自定义代码模块中的输出结果。

c X7K0{ P[!sN Mh0

 

*}xe} SW/V*V[0

 51Testing软件测试网5ka2LV-w,{


TAG: Rational

 

评分:0

我来说两句

Open Toolbar