使测试自动化脚本与域无关以重用测试脚本

上一篇 / 下一篇  2012-10-08 10:53:32 / 个人分类:自动化测试

(PYs8e{+t%]/Rp y1K-O0  简介:测试自动化中,会将测试脚本和相关的测试框架绑定到接受测试的应用程序底层域。然后,判断是否可以跨域使用框架提供的相同记录对象、脚本和可重用函数就成为了一个难题。要克服这个问题,关键是使得自动化测试脚本与域无关。其结果是,可以跨不同的测试应用程序域使用相同的应用程序对象、测试脚本和可重用函数,无需考虑它们是否是 HTML、Java、Microsoft .NET、MicrosoftWindows等。51Testing软件测试网ul4s{8d$M.`C#Q G

51Testing软件测试网h?]D0B/C TA

  问题:域依赖性阻碍了脚本的重用51Testing软件测试网 p d1`:E A4\B

f |8a|,[ F"RBN/|0  无论测试自动化开发人员通过记录回放还是传统描述性编程来创建脚本,测试脚本和可重用函数都会绑定到接受测试的应用程序的底层域。那么,我们如何确保编写功能的工作(例 如,将文本设置到某个 Edit Box)在每次域转变时都不会重复?今天,您可能正在为某个基于 Web 的应用程序编写测试脚本,并且每次都以 HTML 格式针对域进行记录和编写脚本。随后,您可能需要使用您之前已经编写代码的相同功能,但要跨一个基于 Java 的应用程序。

r ];aj+JLR051Testing软件测试网&uqh)l0A4h N

  当我们使用记录回放机制时,所有与应用程序交互的测试对象都被记录和存储在IBMRational? Functional Tester 对象映射中。图 1 显示了一个这样的示例,其中应用程序域被硬编码为 Java。

\/Th} y)s+W z2y0

0u/Ei H!x[Hh0  图 1. 以 Java 作为应用程序域的一个对象映射51Testing软件测试网0U7^6z p:T$UZ

T&}6k,p`R0

  类似地,如果使用描述性编程机制开发测试脚本,函数会被绑定到某个特定的应用程序域。在这种情况下,实现测试函数可重用性就会变得具有挑战性。

Z5OP%w @*B0

  因此,最好使脚本和底层测试对象与应用程序域无关。

a8],c^J'v)N0

  解决方案:使用描述性编程实现跨域兼容性

$ZB3~3BH4nfDcB_0

   Rational Functional Tester 提供一种动态机制,在脚本回放过程中获得测试对象的引用。find() API 使这一点成为可能,因为它引用接受测试的应用程序中的对象时,无需在测试对象映射中记录或硬编码该对象。该 API 找到父测试对象或顶层测试对象,并查找一个匹配的子对象。51Testing软件测试网$W#d8Xbk"f$R6y%w-p:Q

  使用 find() API 识别域或顶层对象51Testing软件测试网%jw9ku f [

  鉴于这一点,通过描述性编程实现测试自动化框架以及使用 find() API 可以有助于识别接受测试的应用程序的域或顶层对象,并相应地找到该对象下面的一个匹配的子测试对象。清单 1 中的代码说明了该过程。51Testing软件测试网+yeW+QRq!HG)c&h

  清单 1. 为当前应用程序设置测试域值51Testing软件测试网Q1GC(F8M

51Testing软件测试网$k \oM K%s;}

 String myDomainName = "";

-F O0L)k:^1j!M+U051Testing软件测试网"G6c.cKi

//For HTML Browser - Set the Application Domain Name
,wK{}-v^0myDomainName = "Html.HtmlBrowser";
51Testing软件测试网Kd^P-BT.l0L

51Testing软件测试网8E9T3{*Eb'F}s3r%D(jL

OR51Testing软件测试网qX?/MS8V q|

51Testing软件测试网 `] kv} N

//For HTML Dialog - Set the Application Domain Name51Testing软件测试网"G2q3Ti%NH\{{
myDomainName = "Html.Dialog";
51Testing软件测试网ff8oMj&s

%~*vgm$kx0OR

^o(l\Y.O051Testing软件测试网bk&\2t+W[

//For Swing JDialog - Set the Application Domain Name
:s1P EWM@+x.g0myDomainName = "javax.swing.JDialog ";
51Testing软件测试网,G$\#gt tg8G.rj

sI]1Kw:zH0OR51Testing软件测试网 o9\+drT

g.MF~vJ.`0//For Swing JFrame. - Set the Application Domain Name
*Q#RX fF(C6rdP.|0myDomainName = "javax.swing.JFrame";
51Testing软件测试网U)Ho%WE(g8w-[9d3iY+SZ

2KSO9d3D~*e0OR51Testing软件测试网Db8x(t&x6f

51Testing软件测试网k,T-OA?D ]

//For Custom Parent Objects - Set the Application Domain Name
RRP-S#a2GY@5j#@%K0myDomainName = " com.ibm.retail.rma.res.ui.config.MasterAgentInfoDlg ";
51Testing软件测试网"?*jYZe!h,N(?1W UU

   在 Rational Functional Tester 代码中,当应用程序域被设置后,顶层测试对象可以被解析为它所要映射到的父对象类型。清单 2 中的代码片段说明了这一点。在本例中,如果域是 HTML Browser,顶层对象被解析为 BrowserTestObject;如果域是 HTML Dialog,顶层对象被解析为 TopLevelTestObject,等等。51Testing软件测试网%M~pfzVF

51Testing软件测试网/DJ}qR:\XBfH
51Testing软件测试网!E f)R%{kk @K

  清单 2. 将父对象解析为应用程序域

|Zk)m+S%tq [051Testing软件测试网!pH rcSLr0C

51Testing软件测试网"H\b%QcM$G)gz

*_Jg L)]9I;dF0/* Parse the Top Level Test Object to the corresponding test object type based
%To9Go:G`&|Q6|0 * on the domain name that was set
hBs2{#S5`0 */

1i/o+@E jcj'h051Testing软件测试网mL ka^-__6ZOx

TestObject myDomain;

%V8ls-s1R051Testing软件测试网8WuOp d^-E

if (myDomainName.equalsIgnoreCase("Html.HtmlBrowser")) {
)_n$S-VBqf4| zl0 myDomain = (BrowserTestObject)51Testing软件测试网X`Y%GjP
   returnTO(".class", "Html.HtmlBrowser");
[1jQ3S]~*G;e0}
*xM3`JG0else if (myDomainName.equalsIgnoreCase("Html.Dialog")) {51Testing软件测试网 d8eF7j#L6D
 myDomain = (TopLevelTestObject)51Testing软件测试网;e6u}U:w'?tB7zh
   returnTO(".class", "Html.Dialog");
o5LfAS7QU0}51Testing软件测试网"T1K(A q9s5nT)hq0f6d
else if (myDomainName.equalsIgnoreCase("javax.swing.JDialog")) {51Testing软件测试网zb2~ f? X I
 myDomain = (TopLevelTestObject)51Testing软件测试网TO Y B;rYY
   returnTO(".class","javax.swing.JDialog");
{?+@ z6y0}
5rxg"P|f!Z0else if (myDomainName.equalsIgnoreCase("javax.swing.JFrame")) {51Testing软件测试网2sC9o)MQ5a
 myDomain = (TopLevelTestObject)51Testing软件测试网 j4Wp#B1O
   returnTO(".class", "javax.swing.JFrame");51Testing软件测试网-LR&{0L"\d
}
FQ0`8P2}8vTBo9X0else if (myDomainName.equalsIgnoreCase
)Ta:f,w-~-C`0j1Gy0  ("com.ibm.retail.rma.res.ui.config.MasterAgentInfoDlg")) {51Testing软件测试网3\8R5IZ(A5h&ms Hu
 myDomain = (TopLevelTestObject)
3~s7fk#Lfv|N0   returnTO(".class",51Testing软件测试网$MK!| Z_`~&J
   "com.ibm.retail.rma.res.ui.config.MasterAgentInfoDlg");51Testing软件测试网K V*Lh{
}
51Testing软件测试网a.wTUr^ ~:zG"P\

51Testing软件测试网$U&u4W&xf'hJ

/* This function returns the 1st instance of a test object based on the
5R4L&~&K^nOa6`f0 * recognition property and the property value provided.  If the test object
8ae#y1~,u4H[m!l0 * is not found null will be returned.
J0`&A.Y7i u']0 */51Testing软件测试网qu3d]`Rj t#g,@(F
public TestObject returnTO(String recognitionProperty,
O#QG_4Rey K{0                            String recognitionPropertyValue,) {51Testing软件测试网'|2pqFy|Bc
  51Testing软件测试网eLh-|6A&r
 RootTestObject rTO = getRootTestObject();51Testing软件测试网IeAy}T7K
 TestObject[] TOs = rTO.find(atDescendant(recognitionProperty, propValue));
A0qE9E L^g T0h0 TestObject returnTO = null;51Testing软件测试网 BH vEL(b\q
 int numOfObjects = TOs.length;51Testing软件测试网 P'wTr T]4Mf8J
 if (numOfObjects >= 1)51Testing软件测试网c7Z1o,GP
  returnTO = TOs[0];51Testing软件测试网7d7iT JwYP
 
H8\}N$[@z:N0 return returnTO;
Xn/^0{^$I9]j[0}
51Testing软件测试网x$f7t#`xq8Rl x3|

+EZ,cXb r*D|0  在将顶层测试对象解析为正确的父测试对象类型后,使用 find() API 将有助于获得该对象下面的子对象的引用。然后,您可以编写一个通用的可重用函数,该函数将以跨域的方式工作。清单 3 中的代码显示一个示例,其中定义了通用 setText 函数,无论应用程序域是 HTML、Java、.NET,还是基于当前图形化用户界面技术的任何其他域,该函数均有效。

1m0H1uojbW u ]0

0}]NuUw)i0  清单 3. 通用的跨域 setText() 函数

8_cB ls;Q Q!S.y051Testing软件测试网4c7W2ma2du0V*v[

0`iZhn(V0
51Testing软件测试网 V)[u.Fz@

public boolean setTextGuiTestObject(TestObject myDomain,51Testing软件测试网,I WU1Bz` p6^ b$X3c
                    String recognitionProperty,51Testing软件测试网 yb8I9A.z
                    String recognitionPropertyValue,51Testing软件测试网t"O Wamj
                    String valueToSet) {51Testing软件测试网:f3r"k8ju
 boolean status = true;
F5{|q s0  51Testing软件测试网oj ^5kt`+pJ
 try {
_nUb}mC-_0  TestObject[] TOs = null;
!u W/t4]C H0Tdp0  TOs = myDomain.find(atDescendant
z o&B9y5M }(KB%S0    (recognitionProperty, recognitionPropertyValue));51Testing软件测试网)p$Boja`M/k$@
  int numOfObjects = TOs.length;

p5jwV0ne%MBq0

t${2Bu(@ w}0G}0S3a`0  if (numOfObjects >= 1) {
oq#PS,{,zU6uO0    
.Gx-OZi2l)M:u0   TextGuiTestObject myGTO1 = null;
{;Y5j k)J*?bv B0   51Testing软件测试网6n.L O6bgZ8c
   myGTO1 = (TextGuiTestObject) TOs[0];
6lL? gv(W0   myGTO1.waitForExistence(2500, 0.10);
n-I+t1jfB rq;c0   if (myGTO1.exists()) {51Testing软件测试网 o/slhC h kaF
    System.out.println("Setting Text: " + valueToSet);
o4Pw hpZ5R*rxb l ^0    myGTO1.click();
y2p/wgW#T0    myGTO1.setText(text);
+x.txP0L*w L `0   }51Testing软件测试网MttRocH
  }51Testing软件测试网6L iQ8S7I
  myGTO1.unregister();51Testing软件测试网(z Az#H:x%~o
 }51Testing软件测试网!p)r#~*_ g)w }
 catch (Exception e) {51Testing软件测试网Xo,sbx^u
  System.out.println("Unable to set Text :: " + e.toString());51Testing软件测试网\w%[ H` qd
  status = false;51Testing软件测试网*_$m9J*W}8{
 }
3R2c/{:o3K H0 return status;
;l _tl/c/[b0}

W-l({3v*n0

$} rW IW_0  在本例中,该函数没有绑定到任何应用程序域。相反,在将值设置到 Text Box 之前,应用程序域作为一个输入参数被传递给该函数。因此,只要提供了正确的域、标识属性以及要设置的值,自动化脚本就能够在任何域的编辑框中设置文本。

A#U.miZ4xf%J051Testing软件测试网Y"Z O v1G3Ol

  当应用程序域经常改变时使用该方法51Testing软件测试网MAy H}v

51Testing软件测试网8lV6j$g{'|H\

  然而,该自动化测试脚本开发模型还解决了另一个方面的问题。51Testing软件测试网3hS'kqV$~1C9K ZWT

51Testing软件测试网t:zgC~0{*q D

  在自动化测试中,接受测试的应用程序常常会从一个域转变到另一个域。以下是一个示例场景:51Testing软件测试网]#WZ)s1}!db9b0|I

51Testing软件测试网,T4mGG9Qb

  ● 您在一个 HTML、基于 Web 的应用程序上开始自动化。在这种情况下,顶层测试对象是:HTML.Browser。

;w F z9oY(~/sq1Mk051Testing软件测试网s-XAuQ Up7H6m

  ● 在脚本中,某个操作启动了一个 HTML 对话框。从 Rational Functional Tester 的透视图可看到,顶层测试对象现在已经转移到 HTML Dialog。51Testing软件测试网WO ~[R*uI

T nL o4Wb0  ● 在更多导航之后,这个基于浏览器的应用程序会启动了一个 Java Swing 对话,其中顶层测试对象已转换为 javax.swing.JDialog。

q*F P D6td0

n2B7Q L Pmt0  在所有这些情况中,如果有一个通用的操作将文本设置到各自顶层测试对象下面的子对象,这种使函数与域无关的方法将会有很大的帮助。您需要做的只 是传递与该操作相关的域。就是说,您首先传递一个 HTML.Browser、HTML.Dialog,然后再传递 javax.swing.JDialog。代码清单 4 说明了这一点。51Testing软件测试网Y$m_ fF

51Testing软件测试网*k0f@;\3b!{[1jQ

  清单 4. 顶层应用程序域经常改变的情况

q*k!C*a5gQPUVm051Testing软件测试网4Rn8C3|7i N/H

51Testing软件测试网s?B5xt/[/ew

51Testing软件测试网9~V_0Cr)P

 TestObject myDomainName;
K6M0kMU+t[;zOF0String myDomainName = "";
51Testing软件测试网6q0tXwyX%^R;v

p;f"LU#ve0/*
P GKV'k`8UMm:j-f0 * Step 1 - Set value to the text box in Html.Browser
*|)N'PFJ0 */51Testing软件测试网5m2Qs#W D!O~R%u
myDomainName = "Html.HtmlBrowser";51Testing软件测试网 l7s?{6~,EX5F
if (myDomainName.equalsIgnoreCase("Html.HtmlBrowser")) {
oEA^/C0 myDomain = (BrowserTestObject)returnTO(".class", "Html.HtmlBrowser");51Testing软件测试网U%Ua/Q)y E
}
(O.w,A\1s&rH;L^ L0setTextGuiTestObject(myDomain, ".id", "hostname", "StoreServer");

T.nXVe_`w| g051Testing软件测试网3dR#S'GL


#}9X3o3Rug&F0~A0/*51Testing软件测试网DxQL)W(k MU
 * Step 2 - Set value to the text box in Html.Dialog51Testing软件测试网 EWb,UVp__
 */
(d#zoI8J/_b0myDomainName = "Html.Dialog";
y&z Vq(@E0if (myDomainName.equalsIgnoreCase("Html.Dialog")) {51Testing软件测试网\9F3b cr5w
 myDomain = (TopLevelTestObject)returnTO(".class", "Html.Dialog");51Testing软件测试网7x0gg3EWp$~
}51Testing软件测试网 O~wO\*hh H@
setTextGuiTestObject(myDomain, ".id", "searchIP", "9.124.45.43");
51Testing软件测试网 @7@\bSb3W

%b7A4BL0q Is051Testing软件测试网xf;a5yz5HK n
/*51Testing软件测试网Z)C5{wJe3^
 * Step 3 - Set value to the text box in javax.swing.JDialog51Testing软件测试网\ V ] YA ME h*G9hC
 */51Testing软件测试网w]5].FU2o,?!C
myDomainName = "javax.swing.JDialog";51Testing软件测试网1gf-rC"a;A
if (myDomainName.equalsIgnoreCase("javax.swing.JDialog ")) {51Testing软件测试网&t+bjcE dt
 myDomain = (TopLevelTestObject)returnTO(".class", "javax.swing.JDialog");51Testing软件测试网FG_.~"on6H|;W
}51Testing软件测试网5PNd`2}{7h
setTextGuiTestObject(myDomain, ".id", "searchPort", "9443");

;~)s/z})P*S c+?0g0
51Testing软件测试网Y3QpKvi@;h?q9}

  在一个频繁改变的应用程序域场景中,该方法非常有效。自动化脚本和函数变成可重用,因而减少了冗余。51Testing软件测试网N1c2t o,oYfo `

4j(\G5QP&u0  该方法的价值的总结51Testing软件测试网 u;YO H{-tN]

'FTZb9t%L3g0  您可以在商用或开源的任何自动化工具中有效地使用本文中所描述的方法。使您的脚本与域无关并不只是实现脚本的可重用性。当在某个域(如 HTML)中构建的应用程序功能被转移到另一个域(如 Java)时,它还可以使脚本运行稳定。但无论如何,在您编写测试脚本之后,它都可以在相同产品生命周期的多个版本中使用。

vffo#a%d3W*K"X051Testing软件测试网 JWC!j0Mt.E A\$K G5`'kg

  此外,由于这些通用函数的可重用性是使用跨域方法的结果,这些脚本和函数不会被绑定到特定产品或应用程序域。

@ \"}.]bhw0

TAG:

 

评分:0

我来说两句

Open Toolbar