不要追求绝对的公平,红尘之中没有公平而言,人活一世,难得糊涂。                                           it is no use doing what you like, you have got to like what you do.

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

上一篇 / 下一篇  2006-12-08 09:05:39 / 精华(2) / 置顶(2) / 个人分类:软件测试技术

使用自定义代码对数据池进行随机访问51Testing软件测试网Y`$d_t,I

v%|&^0\Rh0[关键字]代码 数据池51Testing软件测试网T1O } {2n@3~)| i
    为了更加稳健的测试,可以用自定义代码使 Performance Tester 随机化。目前,Performance Tester 数据池中的元素只能按照顺序进行访问。这篇文章讨论了作者如何创建自定义的 Performance Tester 代码,并用随机数据访问来实现数据池。这篇文章提供的了 RPTDataPool 类,以及如何实现它的详细说明。51Testing软件测试网K \*Kr&{1hy

Cq[t m'|#uw0l;G0    注意:这篇文章适用于 IBM® Rational® Performance Tester Version 6.1.2.00251Testing软件测试网+@"^Q8SJ4P r
51Testing软件测试网A&o#?+L?!Z
     好的测试不仅仅是重复执行相同的动作。为了更好的模拟实际用户的动作,测试人员可以利用IBM Rational Performance Tester 中的数据池。这是远超出使用静态记录测试的一步,因为它允许测试为每个执行来选择不同的变量。例如,无论什么时候应用软件要求用户输入搜索条件,比如一个电影的名字,一个标题或者标题的一个部分都可以从数据池中选择。51Testing软件测试网Y"C#S&F&XA'T e5B
51Testing软件测试网8m0N)J3x$Wcc+Ze{|#i
    目前Rational Performance Tester数据池仅仅是顺序存储。在这个电影搜索的例子中,每次你运行这个测试时,相同电影名称的搜寻都是以相同的顺序来进行处理的。通过对要搜索的标题进行随机选择,可以提高测试的稳健性。
3hNRm$f4Fy051Testing软件测试网`"X#M'u0B#O7s
    数据池文本文件51Testing软件测试网m$R*iHtG(H

$M&a`C_0    在i5/OS系统测试环境中,IBM测试自动化小组自从2004年就一直在将Mercury LoadRunner的脚本转换到 Rational Performance Tester。为了随机化i5/OS测试的变量选择,我们创建了一个 Rational Performance Tester自定义代码的包,来对数据池中的元素进行随机存储。这个执行一点都没有用到 Rational Performance Tester数据池的特性。相反,Rational Performance Tester DataPool 类读取的文本文件中包含要使用的数据池条目。
(v2jA y u"X051Testing软件测试网|0JE%b&Z_ _8XJ9c2R
     这个将选择元素随机化的数据池文件是一个每行仅包含一个元素的纯文本文件。用Rational Performance Tester来实现它的一个简单的方法,就是为测试项目的文本文件创建一个数据池文件夹。一个文件输出包括这些文本文件,因为它们被包含在 Rational Performance Tester项目中。当转换Mercury LoadRunner脚本时,你可以通过LoadRunner数据文件来实现。51Testing软件测试网J~Zg{O~+X_}

2\&A*Vbv~%Q5C&hW0RPTDataPool类51Testing软件测试网 ^8n3N9{s#^"_W&o+g

)f"H&h z7m {)Eb6rG0    这个文本数据的文件名传给创建者,整个文件在首次访问尝试时就被读取进入了 Java™ Vector 对象。为了从这个数据池中随机重新找到一个条目,可以使用getaDataPoolItem 方法。(参见列表1。)
"r%C2F"}2W h%C I"?0
-h@5O6cZ.}0注意事项
1t$m @]-~_B051Testing软件测试网q%^W OE R7F1ak$h
    记住整个文件在测试的开始就已被读入存储器是十分重要的。巨大的数据池将会用到大量的内存,这将会降低加载和Rational Performance启动的速度。巨大的Rational Performance Tester测试数据池也会发生类似的情况。51Testing软件测试网0Z4DZ+g ~"LO"uv(b
51Testing软件测试网}!N4ZKPpL E&QZ
    你可以使用每行包含多个元素的数据池,但是用户必须在这个测试的自定义代码中增加一些功能来取出单个元素。51Testing软件测试网u?g T*_5WPg \
51Testing软件测试网/^N*u t7`w#NZ

4B)jA a'F;s0    列表1. getaDataPoolItem 方法
(Vp8G)NS9Fax|3a0   
v8@/u7M/k0import .io.*;
"A$d MTxSP3{)L9Qwb0import .util.Vector;51Testing软件测试网(?,}-}}&nvX
public class RPTDataPool {
y?:mzG)OwC0    private boolean DataPoolIsLoaded = false;
"kH"WD w A8v0    private String DataPoolFileName;
*s6j I2AdsCU0    private Vector DataPool;51Testing软件测试网]AS9G?rl,U Z/k
    private int DataPoolCount = 0;51Testing软件测试网;E @W%_/z1Q
 
I&Lq`%{K;w0    public RPTDataPool( String fileName )  {51Testing软件测试网+Jct w{|
        DataPoolFileName = fileName;51Testing软件测试网$~wu:aON
        DataPool = new Vector();51Testing软件测试网$}"d tXN
        DataPoolCount = fillVector( DataPoolFileName, DataPool);
+y#OZHTF&N-[0        DataPoolIsLoaded = true;51Testing软件测试网,}@Aos#K0XT,d7m.z
        }51Testing软件测试网.dP,q+Bo-P~o%gs
 
7j$Tc~TvC0    public String getaDataPoolItem(  )  {
)b f;Bq:R0XV%Q0        if( !DataPoolIsLoaded ) {51Testing软件测试网4\+A1kDET+L
            //System.out.println("loading:" + DataPoolFileName);51Testing软件测试网u1N0M"n sb
            DataPoolIsLoaded = true;
Q2f`J.y}Fk0        }51Testing软件测试网SwSX R+x}._*Z0l
        return (String) DataPool.elementAt((int)51Testing软件测试网(_H!Mp4^V ]!Q [
          (Math.floor(Math.random() * (DataPoolCount))));
-Q Vxu Ot'i0    }
DI1b!o b1`Gs8Jr Z B0   51Testing软件测试网"O F!~!CQ]
    private int fillVector( String fileName, Vector FileLines) {
a{;m&Ku(D0        // take the Datapool file and read it into a Vector
n8R~.L(bXB{0        // do this only once per test
Ow/H7n NJ L u#Q0        int fileLineCounter = 0;51Testing软件测试网 S loE;g
       51Testing软件测试网;xB/pB v+Z
        BufferedReader brInReader = null;51Testing软件测试网o]X`f)mS
       
+{R;|2^\y+a0        // read from the file
U&K Td};q0        // try to setup a buffered reader and open the file
`+|(^/Eqv0|~/}0        try  { brInReader = new BufferedReader(new FileReader(fileName));}
'} P5f5G}H`#M0        catch(Exception error)51Testing软件测试网Re)SnG+{-Tb*p3L
        {
8tx'F&@'c\0      //System.out.println("Error Opening DataPool File: " + error);
%Q'e7p`aJ3q6}{[0      return 0;
1k6xM_6t/dY0  }
!md.g'p!h0 51Testing软件测试网 tN~7~4{
  // read the file and place the lines in an array51Testing软件测试网#Vd&Jn ~~R c
  // get the first line of the file
$NLP*z*D@'y*t"y0  String sInLine = ReadLine(brInReader);51Testing软件测试网j#[3`kv%O%]1uR
 51Testing软件测试网Y ~Ao)WJ;b
  // read through the file
0d_ljzgR0  while (sInLine != null)
-J E+Up)g4F:k0  {51Testing软件测试网!V`;Qr4aE
      //System.out.println("Storing ’"+ sInLine+"’");51Testing软件测试网*]5U_4F J
      FileLines.addElement(sInLine);51Testing软件测试网 D0Z#B5cudt_
     51Testing软件测试网l,Bx4Hz:_z
      // read the next line51Testing软件测试网.tE `~O@
      sInLine = ReadLine(brInReader);
c r%K:U8l7s L+B EE0     
{6}/GT|-@9Cf$P?r Y0      fileLineCounter++;51Testing软件测试网5C yvY~Z7R0\n
  }
3ax7g k%sU"J0 
U N&n)g:U?TT0  // At this point, the FileLines Vector has all the lines51Testing软件测试网Y^"K;Ux;k3]-cn
  from the file and fileLineCounter
&n}uQ)k0 51Testing软件测试网%^ ^7w)Tk4\8a
  // indicates the max index value for the array51Testing软件测试网{J&bSP0ut
  return fileLineCounter;
/}9I2Ya|#Q%Z[0  }
F#]:c/@xBt0 
K6|Ykk+n.y"s0  // ReadLine
2C)K}9DBf_`0  // This method will read a line from a given file and return the string value51Testing软件测试网(U.i(W0j Ug*j-v d`$p
  // ********************************************************************************51Testing软件测试网 U8G?-WS8?EMg
 
L1[~5R'o0  private String ReadLine(BufferedReader brReader) {51Testing软件测试网A"w#|w]U+s
      String sReadLine = "";
I"h:W l?-hVR0      try  {  sReadLine = brReader.readLine();}51Testing软件测试网 @%[u)P4H
      catch (IOException error)
1Gh7Zkw3q v6h+b0      {//System.out.println("DataPool.test Read Error: " + error);}51Testing软件测试网\$g,E#Dr1P
     51Testing软件测试网n.r-L ~ N k
      return sReadLine;
&z0@!F OE&K0k-? e0  }51Testing软件测试网'O+GlBtI
  // end of Read
XFWF6X#TQ*PQ(Y0  }51Testing软件测试网7L C T&l Ov'qj
51Testing软件测试网 _"r+t uO;t OK

1m$_$uN$b8l:Y1D0    在测试中实例化数据池对象
6z6` z|9[7yjA1C0S%j*A051Testing软件测试网O n!y5kZ2J
    为Rational Performance Tester测试项目创建一个特殊的类来实例化这个数据池的对象。这里,用MovieSearchDataPools来举例说明,这个电影搜索项目需要三个不同的数据池(请看列表2)
n5L4x"Bf H})fJ051Testing软件测试网6? I{T[)yf4xj

.H h(Oy,jK0列表 2. MovieSearchDataPools 例子
@|VK'FGy0   51Testing软件测试网*aL!x)n.PKaA J%y

Ml!}:a'BQE0public class MovieSearchDataPools {
Euwq(`K*Hm9lU&A0    static RPTDataPool Titles =51Testing软件测试网 F2c%ggdn,q
        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieTitles.txt" );
F2lFZ;iTS,`r0       51Testing软件测试网] EG0n7W{z:^!K
    static RPTDataPool Directors =51Testing软件测试网\d%b9n#n/IF6`s
        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieDirectors.txt" );51Testing软件测试网y(|_9gL5t
       51Testing软件测试网 O+?4j0d}+P
    static RPTDataPool Actors =
!?(Du`0Rt*Xy5R0        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieActors.txt" );51Testing软件测试网*U0T"Hi{+Un"F#n:H
    }51Testing软件测试网C%E(~HzFc#b
51Testing软件测试网Oj/pg}$] A
51Testing软件测试网OBc*YY7w
    使用自定义代码从一个数据池中取回数据
P)m0@ N(\0
(YK[VuW&N7p2Z0    要取回一个元素,在一个自定义代码模块中使用getaDataPoolItem方法。用这个电影搜索的例子来取回一个任意电影的标题名称,如列表3所示。51Testing软件测试网z L"f5f{S

dy"q$d;t051Testing软件测试网]9y9oh5a*`3xH4|
列表 3: 使用 getaDataPoolItem 方法51Testing软件测试网e*GJl8J2qH R
   51Testing软件测试网P8{(X;mi.@T {a
package test;51Testing软件测试网 P~GI'bC r!@:Q

X oP)](Pwa `;]0import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices;51Testing软件测试网6Xe:DW5vP

2u0k f%i!i^ r0public class GenerateRandomTitle implements51Testing软件测试网ao*e'n&W1h+I,y;_)u
    com.ibm.rational.test.lt.kernel.custom.ICustomCode2 {51Testing软件测试网F c*sQSUBy~b
   51Testing软件测试网 v7hEWlA6l
    /**51Testing软件测试网]F6s@`.mb/[
    * Instances of this will be created using the no-arg constructor.
\"rl}7h_1|L k0    */51Testing软件测试网Y? ?bz k]
    public GenerateRandomTitle() { }
/^S{+Gr)O)x(p0   51Testing软件测试网0l)`;oSo.U+}
    /**51Testing软件测试网 u,?,uGha8y
    * For descrīption of ICustomCode2 and ITestExecutionServices interfaces,
3zEGGB7K*n0    * see doc located at 51Testing软件测试网5Kp(AHd;_&E M_
51Testing软件测试网 @4jzq)RsZ:F
/rpt_prod/eclipse/plugins/com.ibm.rational.test.lt.kernel_/pubdoc51Testing软件测试网!o9T&]N)uV
    */
{ej$hK1~0   
!Y6cMHJ U0public String exec(ITestExecutionServices tes, String[] args) {
*_3OPfP%WL{#|0    return MovieSearchDataPools.Titles.getaDataPoolItem();51Testing软件测试网 @7f9OY%g|i
    }51Testing软件测试网(j}dQITE
   
h1l@ lEC y0}51Testing软件测试网KH!j2w0lw.W8^

![ tG YT9pN051Testing软件测试网.R4D,^%jfOs,[$|4w8c
    你可以使用来自搜索电影的HTTP请求中的自定义代码模块中的输出结果。
O^1i/R{3B+T%^0
| ueV3Hw'x:|Qv`0

TAG: 数据池 datapool 随机化

 

评分:0

我来说两句

Open Toolbar