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

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

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

使用自定义代码对数据池进行随机访问
eyL4bB[0
51Testing软件测试网1u9T FY2J
[关键字]代码 数据池
MiSVaz L0    为了更加稳健的测试,可以用自定义代码使 Performance Tester 随机化。目前,Performance Tester 数据池中的元素只能按照顺序进行访问。这篇文章讨论了作者如何创建自定义的 Performance Tester 代码,并用随机数据访问来实现数据池。这篇文章提供的了 RPTDataPool 类,以及如何实现它的详细说明。
A pG7c#Q]z051Testing软件测试网sM/e|L0ab.m
    注意:这篇文章适用于 IBM® Rational® Performance Tester Version 6.1.2.002
d;_T/W:\nhPdQ0
/RH8Su;O0     好的测试不仅仅是重复执行相同的动作。为了更好的模拟实际用户的动作,测试人员可以利用IBM Rational Performance Tester 中的数据池。这是远超出使用静态记录测试的一步,因为它允许测试为每个执行来选择不同的变量。例如,无论什么时候应用软件要求用户输入搜索条件,比如一个电影的名字,一个标题或者标题的一个部分都可以从数据池中选择。51Testing软件测试网3[DY]8mY(S

*^-t.ir6|2P2Xe GB0    目前Rational Performance Tester数据池仅仅是顺序存储。在这个电影搜索的例子中,每次你运行这个测试时,相同电影名称的搜寻都是以相同的顺序来进行处理的。通过对要搜索的标题进行随机选择,可以提高测试的稳健性。
r_D&v+~h:l{%R051Testing软件测试网j4W K:A2U
    数据池文本文件
!n~;a}C6O0
t)mh)l"QlWV0    在i5/OS系统测试环境中,IBM测试自动化小组自从2004年就一直在将Mercury LoadRunner的脚本转换到 Rational Performance Tester。为了随机化i5/OS测试的变量选择,我们创建了一个 Rational Performance Tester自定义代码的包,来对数据池中的元素进行随机存储。这个执行一点都没有用到 Rational Performance Tester数据池的特性。相反,Rational Performance Tester DataPool 类读取的文本文件中包含要使用的数据池条目。
/?#u\6i'Ph5m)Z5c7x0
6?8ntH:H8_0     这个将选择元素随机化的数据池文件是一个每行仅包含一个元素的纯文本文件。用Rational Performance Tester来实现它的一个简单的方法,就是为测试项目的文本文件创建一个数据池文件夹。一个文件输出包括这些文本文件,因为它们被包含在 Rational Performance Tester项目中。当转换Mercury LoadRunner脚本时,你可以通过LoadRunner数据文件来实现。51Testing软件测试网1B}U3Bym
51Testing软件测试网o8L0F!c%?7g!U
RPTDataPool类51Testing软件测试网_i}4K*H1s6Ug
51Testing软件测试网)a;RW)pG$?Z
    这个文本数据的文件名传给创建者,整个文件在首次访问尝试时就被读取进入了 Java™ Vector 对象。为了从这个数据池中随机重新找到一个条目,可以使用getaDataPoolItem 方法。(参见列表1。)51Testing软件测试网"q-LRkL6M9?M

5@+Ntz1|T0注意事项51Testing软件测试网 w_4Pc"zzc

%n/V1sx VYO0    记住整个文件在测试的开始就已被读入存储器是十分重要的。巨大的数据池将会用到大量的内存,这将会降低加载和Rational Performance启动的速度。巨大的Rational Performance Tester测试数据池也会发生类似的情况。51Testing软件测试网"G9c*g9{ V#C
51Testing软件测试网.P*Lc:}'gd\
    你可以使用每行包含多个元素的数据池,但是用户必须在这个测试的自定义代码中增加一些功能来取出单个元素。
ui+BRH'I'mO#Do3E0
|!`u\hF@| _051Testing软件测试网(u{9`R%Z H\Wi
    列表1. getaDataPoolItem 方法51Testing软件测试网ww?K}8V v f#@2A
   
OWz5R/@ U0import .io.*;51Testing软件测试网5QBd PO(W fE
import .util.Vector;51Testing软件测试网X$Hdt3o%E
public class RPTDataPool {51Testing软件测试网KM{'n zgr"m4^
    private boolean DataPoolIsLoaded = false;51Testing软件测试网l6~3f#l ^UT F
    private String DataPoolFileName;
4F8x C Ho3?7b D0    private Vector DataPool;51Testing软件测试网+]+AmO#w I A)T7Jo
    private int DataPoolCount = 0;
]8Z5Y Lg0 51Testing软件测试网7bX%I}c"Ar
    public RPTDataPool( String fileName )  {51Testing软件测试网ch)o)a#`#`
        DataPoolFileName = fileName;
B{_j;Ru/cd8X(u$@0        DataPool = new Vector();
Y"p4t,Y4FO/?0        DataPoolCount = fillVector( DataPoolFileName, DataPool);
G3B}zc3^ xe1Q0        DataPoolIsLoaded = true;
` [,o8W5p,H4O4P[F0        }51Testing软件测试网;Rg)ia^4gE1ER
 
!I&~_IiI\)`?[0    public String getaDataPoolItem(  )  {
Q.F:`2~%y7J \1_9\9g/b*O0        if( !DataPoolIsLoaded ) {
$ZO~ERPjNyzC0            //System.out.println("loading:" + DataPoolFileName);
5m#E\~{*?ii0            DataPoolIsLoaded = true;51Testing软件测试网 \6Rlm?c!X B
        }
pn8Wrai0        return (String) DataPool.elementAt((int)
``h-Bl-vqs0          (Math.floor(Math.random() * (DataPoolCount))));
?3i [Y4eF-W0    }
YR;~*P3MK:lNt0   
vS\ Z-h!P0    private int fillVector( String fileName, Vector FileLines) {
d)[1t?;M^0        // take the Datapool file and read it into a Vector51Testing软件测试网 o3H:|9N`'m,\i._E
        // do this only once per test51Testing软件测试网 U/~%u%q,c$G5SC
        int fileLineCounter = 0;
7cDEMEB+i%JR"?6S0       
]R \]/h4L ^0        BufferedReader brInReader = null;51Testing软件测试网@;u z(e9h f!C
       51Testing软件测试网/sY%A`-z4T2o
        // read from the file51Testing软件测试网.Zzp1n5]%[
        // try to setup a buffered reader and open the file51Testing软件测试网{F_k.l-\ }
        try  { brInReader = new BufferedReader(new FileReader(fileName));}51Testing软件测试网e Ce y I
        catch(Exception error)51Testing软件测试网#a'F|;R"P@
        {51Testing软件测试网?r _!d5o9E
      //System.out.println("Error Opening DataPool File: " + error);
Bm IiR8~P0      return 0;
9L!@{)w"K;b#?/S0  }51Testing软件测试网,K(\{&jr%|n
 
]CP {@yR0  // read the file and place the lines in an array
Ho?pN.P0  // get the first line of the file
2aJP:bv&me0  String sInLine = ReadLine(brInReader);51Testing软件测试网&Q:x"GkV)F:A
 
Q"S Uer0P0  // read through the file
k:vn\$M['C!] G(z0  while (sInLine != null)
e_?6O5LX([X0  {51Testing软件测试网Z!u(p9Ha
      //System.out.println("Storing ’"+ sInLine+"’");51Testing软件测试网JpN.?#AU%j/q.M
      FileLines.addElement(sInLine);
&wn\+H?5{tru6l6_0     
T/t/OJ | z0I0      // read the next line51Testing软件测试网_s!I^;["D
      sInLine = ReadLine(brInReader);
M8}ize6I0     51Testing软件测试网;ay J6Kw-^+f,_
      fileLineCounter++;51Testing软件测试网 `#uR%SM8Hn
  }
sFBR6v T6F0 
;h)E5dG.h4o_7HU ~0  // At this point, the FileLines Vector has all the lines
m$p+} i_E9{0  from the file and fileLineCounter51Testing软件测试网c5D6F)B4oG0g
 51Testing软件测试网 TwHkQ!ui1J'_
  // indicates the max index value for the array
Z wTA%z'r0  return fileLineCounter;51Testing软件测试网y.x?1gf
  }
+rD%j-T J2Y&xw IN0 51Testing软件测试网Yl"X7l?z;d
  // ReadLine
jNh5hW G0  // This method will read a line from a given file and return the string value51Testing软件测试网^)dj"VH
  // ********************************************************************************
aqFQ[mgbN0 51Testing软件测试网/G:m{*G1f:p
  private String ReadLine(BufferedReader brReader) {
o&?!|Q$q6R5{0      String sReadLine = "";
X/R:})b"V-t~f+@0      try  {  sReadLine = brReader.readLine();}51Testing软件测试网~@6CXsg)S
      catch (IOException error)51Testing软件测试网Pdd Y,a9SO
      {//System.out.println("DataPool.test Read Error: " + error);}51Testing软件测试网4f-wb'w(M?
     
*J8b~p-R0      return sReadLine;
x*h)D0N2o t"w0  }
:YX P(hX9X:k|)Z-Dn4K0  // end of Read51Testing软件测试网q0Eq:rM
  }
8]~x:aI'nM0
LiXZAl&R0
|;H#l&gKp4p0    在测试中实例化数据池对象
/f7|j.V}s;c/f0
gqf/nAC0n$sN0    为Rational Performance Tester测试项目创建一个特殊的类来实例化这个数据池的对象。这里,用MovieSearchDataPools来举例说明,这个电影搜索项目需要三个不同的数据池(请看列表2)
#Z d5n)h#V051Testing软件测试网~,]e1N-|_/je }5[-M c

e-CG8Py0列表 2. MovieSearchDataPools 例子51Testing软件测试网?|+McZa#}'C(b/`
   
%X&Ay:{&bQ2kQ!n p051Testing软件测试网ZQ{4dvn8A.M
public class MovieSearchDataPools {
H| ]"q:M$XC0    static RPTDataPool Titles =
v caUT;b0        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieTitles.txt" );
(^6AK_L3j*oU0       
1[F7u k0~0    static RPTDataPool Directors =
G S:IyO0        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieDirectors.txt" );51Testing软件测试网*|2R`r3D/iqA%ZBa4k;j
       
k"Bgod~ vn\0    static RPTDataPool Actors =51Testing软件测试网+L#wSs4g5y dx
        new RPTDataPool("C:\\Workloads\\ MovieSearch\\ Datapools\\MovieActors.txt" );51Testing软件测试网1We\ h2iUg ~
    }51Testing软件测试网/o }3K6X5I
51Testing软件测试网b7Q p"Ar.L

{ |6BI"[0    使用自定义代码从一个数据池中取回数据51Testing软件测试网 V^OYo\
51Testing软件测试网!~ V6M)x$cBC'O
    要取回一个元素,在一个自定义代码模块中使用getaDataPoolItem方法。用这个电影搜索的例子来取回一个任意电影的标题名称,如列表3所示。51Testing软件测试网%],D2Q8L}#_
51Testing软件测试网l?&q a.M,}k \5F
51Testing软件测试网"d?y(I7r]*X n D3W
列表 3: 使用 getaDataPoolItem 方法
B8W g2YQ0   51Testing软件测试网"F-LW$O8u+v apF
package test;51Testing软件测试网8t/xd1gJ8m y

$ZV9w J^;a0import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices;
z(yU;T6w&A x`&G0
"`Z8J |U,e#gL#Q0public class GenerateRandomTitle implements
&mj0y(Z2g/@w0    com.ibm.rational.test.lt.kernel.custom.ICustomCode2 {
C[`b4o-Y0   
-y8@2JT3C0    /**
W |;lU_lp0    * Instances of this will be created using the no-arg constructor.
7I{O|hxo B0    */51Testing软件测试网Jo0q e}6Zw/j6U)HU"L
    public GenerateRandomTitle() { }51Testing软件测试网)z!g@T|)vi&\
   
'w x(a^k0i0    /**
xDh$O"V^v"l0    * For descrīption of ICustomCode2 and ITestExecutionServices interfaces,
$G$J \6d6g3VT0J(E0    * see doc located at 51Testing软件测试网:p"S6_? d0W
51Testing软件测试网_Ex+zoy^
/rpt_prod/eclipse/plugins/com.ibm.rational.test.lt.kernel_/pubdoc51Testing软件测试网cZC6J"PaJ
    */51Testing软件测试网yEHl#a,]4F0z9P;wp
   51Testing软件测试网$?X B0]({*atk
public String exec(ITestExecutionServices tes, String[] args) {51Testing软件测试网5]w0\)Ad ~;?
    return MovieSearchDataPools.Titles.getaDataPoolItem();
J"g_0R1g OJ1b0    }51Testing软件测试网/zJnpD6f
   
4bHK _;`0}
tyDwg#~G051Testing软件测试网e/RrPA_fY2Oy

!_X m9QB A;LU0    你可以使用来自搜索电影的HTTP请求中的自定义代码模块中的输出结果。
E0K _2\&w2W;e051Testing软件测试网~%a i5rq4j"?

TAG: 数据池 datapool 随机化

 

评分:0

我来说两句

Open Toolbar