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

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

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

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

使用自定义代码对数据池进行随机访问51Testing软件测试网7F B9nh"] NoI

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

5O ?C/p? ^ S0

   注意:这篇文章适用于IBM® Rational® Performance Tester Version6.1.2.00251Testing软件测试网zk3j"iSq fs?1}J

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

3A4x&S*uRHo0

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

   数据池文本文件

t s{?P v*o#k%F0

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

jQk0gvD0

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

A~o9t/g:v\4k0

RPTDataPool51Testing软件测试网r"Gr.P-tf%C&F])P

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

注意事项51Testing软件测试网~"l.t0r/L to4x

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

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

nDveg&^O,i/X0


Hp"}1JMuu z b1@z4A0
   列表1. getaDataPoolItem方法
.\e~%TxCd1S t8ty0    
1_"\r~'{ SQI2@0import .io.*;51Testing软件测试网 Q*b aH eP
import .util.Vector;
;C3D\p^.x$X,K0public class RPTDataPool {
4o I1A3AfBwGBa0    private boolean DataPoolIsLoaded = false;51Testing软件测试网 t.pEVuf;i$M
    private String DataPoolFileName;
-w0t`6n[S*`&h0    private Vector DataPool;
M4{O M+|'l+L#d0    private int DataPoolCount = 0;
kaRY9K2M-y0 
6d}nO w O#w@0    public RPTDataPool( String fileName )  {51Testing软件测试网-lK](}JMWhW
        DataPoolFileName = fileName;51Testing软件测试网R5`Mi U e-[b
        DataPool = new Vector();
&QU(x6mo6i3x0        DataPoolCount = fillVector( DataPoolFileName, DataPool);
A/~2|T/}0u0U2O7u0        DataPoolIsLoaded = true;51Testing软件测试网^:fER%}0K'}aq'E
        }51Testing软件测试网N(e,jS!g'Q
  51Testing软件测试网5qQ:d7D(P$dDr&D c-R
    public String getaDataPoolItem(  )  {51Testing软件测试网#A_-_fnP
        if( !DataPoolIsLoaded ) {51Testing软件测试网3L$G6w$\wu6w
            //System.out.println("loading:" + DataPoolFileName);
W[TC$L9OyG QD0            DataPoolIsLoaded = true;
hH C2qH(d0        }
W(A#I;y}R?-Q3\8~0        return (String) DataPool.elementAt((int)
/j(V~ I%{u2V0          (Math.floor(Math.random() * (DataPoolCount))));51Testing软件测试网 Y/z9KT;I^e
    }
%h PY T'a-e2q`w)X@0   51Testing软件测试网b~"quTp
    private int fillVector( String fileName, Vector FileLines) {
t'f ]+ac{0        // take the Datapool file and read it into a Vector51Testing软件测试网"{0[q1]i.\
        // do this only once per test
/D M!Ph-^y}b G0        int fileLineCounter = 0;
V3K9o~"Pw0       51Testing软件测试网g'I*f#^vad
        BufferedReader brInReader = null;
VC2Lp*Q0       51Testing软件测试网2W#r3MW/THf
        // read from the file51Testing软件测试网W%?1J1Yq2\O)]
        // try to setup a buffered reader and open the file
u^}[{W0        try  { brInReader = new BufferedReader(new FileReader(fileName));}
C1N8E1`6?vC0        catch(Exception error)51Testing软件测试网 d,[^8\sXW)`Y
        {
F(W%TIdI${rIx Bd0      //System.out.println("Error Opening DataPool File: " + error);
-o/qzl*]FB0      return 0;51Testing软件测试网+q dW oY Zg
  }
.W"uw'B;U%B'q0  
7F,[K:mH0  // read the file and place the lines in an array
^/lh"t)?Zk0  // get the first line of the file51Testing软件测试网^%H[.{g
  String sInLine = ReadLine(brInReader);51Testing软件测试网`7f/o oq `
  51Testing软件测试网%kH VQq/\L9~&sa
  // read through the file51Testing软件测试网0tq1\)q)j2l;a6S2d
  while (sInLine != null)
q y]8[ FUz"P0  {51Testing软件测试网e5z'H#Xt T
      //System.out.println("Storing '"+ sInLine+"'");51Testing软件测试网M,n#](};Z0|j,D
      FileLines.addElement(sInLine);51Testing软件测试网*T"y deVk
     51Testing软件测试网F.{:d5|+[ lC,Fo
      // read the next line
/^NH PJ0      sInLine = ReadLine(brInReader);
+o-CF%i/Z u|0     
f8B.akHH0      fileLineCounter++;
#b!|3T0z&q,_ o$s0  }51Testing软件测试网G:mx!Y dld!}
  
:d;R ?P Q0  // At this point, the FileLines Vector has all the lines
0J dFM HBJ @8x0  from the file and fileLineCounter
;M ?{L3i6r#s5WG7@0  51Testing软件测试网E/lD1n9j:GU
  // indicates the max index value for the array51Testing软件测试网$f ^.z ^:a7h-~#Clf
  return fileLineCounter;51Testing软件测试网&Ag2|!J7^tk^
  }51Testing软件测试网"Qe%A]N8^2UJ'{
  
;c"j;U8l9uJ.xF!e0  // ReadLine51Testing软件测试网z(^C7K0g,]8Xy zA
  // This method will read a line from a given file and return the string value51Testing软件测试网$j*X9^}T{0{.lL
  // ********************************************************************************51Testing软件测试网"Lxh[i}
  51Testing软件测试网HR)be#d%Q2^ t T
  private String ReadLine(BufferedReader brReader) {51Testing软件测试网3G%Qf,^'a{^j
      String sReadLine = "";
T`:B`2Q3?Lh0      try  {  sReadLine = brReader.readLine();}
7O{|EhA0      catch (IOException error)51Testing软件测试网_$M]}M
      {//System.out.println("DataPool.test Read Error: " + error);}
mViL:HAD0     
4F8m.MlOH0      return sReadLine;
wiL'Pf r0  }51Testing软件测试网 Q)i2XKX2Q
  // end of Read
TVo$zXw m0  }

UO#A:e.D2t Lh0

51Testing软件测试网3m)vn k JW
   在测试中实例化数据池对象51Testing软件测试网Z&R`*E'uR?H

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

51Testing软件测试网;Bx5o%s3cdO
列表2. MovieSearchDataPools例子51Testing软件测试网 Ugr1Y U
    
51Testing软件测试网%rv![3y B-G6~x"S

public class MovieSearchDataPools {
E5WC |$O:`dA0    static RPTDataPool Titles =51Testing软件测试网}-FvfP qo
        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieTitles.txt" );
G.ul sPB!B;u5c*C0       
M1i'{VN4q)U0    static RPTDataPool Directors =
!bu S?|iv"f0        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieDirectors.txt" );
]'fa'wIx'F;Z+r^0       51Testing软件测试网q/Sb2a"I`+F){
    static RPTDataPool Actors =
(w0P&D,dP:Cp3ld5R0        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieActors.txt" );
La)] ^b AX!H9u.E0    }
51Testing软件测试网gs3]] E6t&uC


4Q w9QS3K(O[-}0
   使用自定义代码从一个数据池中取回数据

)E#UG0c5}0

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


By4[yMO;Z1dC0
列表3:使用getaDataPoolItem方法51Testing软件测试网$Zgg"Ii\E#Z
    
k8qB^E(`0H9I9Y;q0package test;
51Testing软件测试网R'Y ML9ze*tW

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

%C Vb5Y/bX~f0

public class GenerateRandomTitle implements
!e/Z-@!k1P0    com.ibm.rational.test.lt.kernel.custom.ICustomCode2 {
W8vs/kg(V m:Qw0   51Testing软件测试网(BU J9R]W1cNk
    /**
fFvN6Tn0    * Instances of this will be created using the no-arg constructor.
b!I;ll-O5d0    */51Testing软件测试网 T/lEh Y?ZG]
    public GenerateRandomTitle() { } 
/R/Z1]7A u@O0   51Testing软件测试网FYgj lMj eV0O9f
    /**51Testing软件测试网H)Q C6F6Q1o
    * For descrīption of ICustomCode2 and ITestExecutionServices interfaces,
1[Tqn3_*y/_ \8B0    * see doc located at 
51Testing软件测试网H~]Il` O0PI,j

/rpt_prod/eclipse/plugins/com.ibm.rational.test.lt.kernel_/pubdoc51Testing软件测试网6`GEgfb*] ks0TX+I'E
    */51Testing软件测试网y&SNEO.ui;u8G
   51Testing软件测试网w qM+p/kk9I
public String exec(ITestExecutionServices tes, String[] args) {51Testing软件测试网)?q#d+T jZ%mO
    return MovieSearchDataPools.Titles.getaDataPoolItem();51Testing软件测试网a.a|Bp}+L
    }
i[L2X:j#t0   51Testing软件测试网8X h[t"yGPh
}
51Testing软件测试网4u7XGb0HS eF
   你可以使用来自搜索电影的HTTP请求中的自定义代码模块中的输出结果。51Testing软件测试网2J Q$W-d+O_U6x#b

 

/o `{T&y C-{!zkH0

 

6x3JMR!hX:^c5{0

TAG: Rational

 

评分:0

我来说两句

Open Toolbar