读《实战GUI产品的自动化测试》:第一步——了解自动化测试,简单RFT的录制回放实例
1、了解自动化测试,什么是自动化测试?(可以参数百度百科“自动化测试”)
2、了解自动化测试
* 自动化测试如何改善产品的质量
* 自动化测试无法完全替代手工测试
* 自动化测试无法发现新的问题——适合用来回归测试
* 自动化测试覆盖率并非越大越好——从产品测试的需求入手,定制自动化测试策略,可复用的,无改动的模块可以使用自动化测试。
* 自动化测试是需要成本的—— 因为自动化测试的投入也是很大的。这里面需要考虑到自动化与手工的投入与产出比。
3、如何进行自动化测试?
自动化测试最主要的三个问题(针对GUI软件C/S架构):
第一个:如何获取要操作的GUI元素。
第二个:如何操作GUI元素。
第三个: 如何设置验证点与如何验证。
另外,B/S架构的自动化测试,利用HTML语言与DOM模型结合,可以实现GUI元素的操作。
4、安装RFT后,动手做个小实例。了解RFT的工具原理。
第一步: 安装RFT工具。
第二步: 认识RFT工具。找到“配置”——》“配置应用程序进行测试”,这个菜单进行配置,需要测试的软件(这里使用自带小DEMON)。
第三步: 实践RFT工具的录制、回放功能。
下面转载一个实例过程:
Rational Functional Tester(简称 RFT)是 IBM 提供的强大的自动化功能和回归测试工具,至于其具体如何强大本文就不赘述了,您可以参考文末参考资料里给出的 RFT 的产品专题。现身说法,Lotus Notes 的大量的自动化测试脚本都是建立在 RFT 之上,包括功能测试、性能测试和本地化测试。对于我们来说,RFT 是一个值得信赖的工具。RFT 的特性很多,以下仅列出我们所关注的一部分关键特性:
- 支持多种应用程序,包括 Win32 Native、Eclipse、.Net, 浏览器和其他一些应用
- 支持使用 Java 和 VB.NET 进行脚本开发
- 支持操作的录制和回放
- 和 Eclipse 紧密集成,支持方便的开发和调试
- 通过插件可以和 ClearCase 紧密集成
- 易于扩展,可以灵活的适应被测程序的需求
下图展示了 RFT 的使用界面,如果您曾经使用过 Eclipse,您将会对此感到非常亲切。
图 3. RFT 使用界面
在 RFT 的众多特性中,录制和回放是非常值得一提的功能,测试人员可以直接通过录制屏幕操作来生成测试脚本,然后通过回放来执行测试。有经验的测试人员也可以通过它来快速生成有用的代码片段。
下面让我们来看一看如何使用 RFT 录制功能来生成上一章中的测试用例的脚本:
- 运行我们的 CD 订购程序:C:\Program Files\IBM\SDP\FunctionalTester\FTSamples\ ClassicsJavaA.jar。实际上,这是 RFT 自带的一个示例程序。(RFT 在安装后会对系统 JVM 进行配置,所以我们不再需要对普通的 SWT 程序安装额外插件,直接运行就可以了)
- 在一个空白的 RFT 测试脚本中,点击 "Script->Insert Recording" 菜单,RFT 将弹出“Recording”对话框,启动脚本录制。
- 手工操作我们的 CD 订购程序,选择条目,点击“Place order”按钮,然后点击 Cancel 关闭弹出的“Member Logon”对话框。
- 执行完毕后,在 Recording 对话框中点击停止按钮,录制就会终止。RFT 会生成测试用例步骤所对应的代码。如图 4 所示。
图 4. RFT 录制生成的测试脚本
您可以通过点击“Script->Run”菜单来运行新生成的脚本,一切都很简单。
如果您足够细心,就能够在图 4 中发现更多的信息。RFT 在生成脚本的同时,会把从应用程序捕获的 UI 信息保存在映射文件(object map)里面,比如 tree2 和 placeOrder。而在生成的脚本中将直接使用对象上的方法,这些方法在底层将会最终映射到具体的鼠标和键盘事件。
图 5 展示了 RFT 本身的录制流程如,对于每个脚本,都有独立的映射文件。RFT 会从映射文件里面查找,如果找不到当前测试对象,会把测试对象的信息加入到映射文件里面。
图 5. 录制流程
如果您更细心的话,您会发现 RFT 的录制完成了捕获和操作的功能,而没有生成验证相关的代码,因为这些需要您随后自己补齐。如果您对如何更高效的做验证感兴趣的话,欢迎关注我们的后续文章。
本地生成的脚本如下:
1 package baidu; 2 import resources.baidu.testHelper; 3 import com.rational.test.ft.*; 4 import com.rational.test.ft.object.interfaces.*; 5 import com.rational.test.ft.object.interfaces.SAP.*; 6 import com.rational.test.ft.object.interfaces.WPF.*; 7 import com.rational.test.ft.object.interfaces.dojo.*; 8 import com.rational.test.ft.object.interfaces.siebel.*; 9 import com.rational.test.ft.object.interfaces.flex.*; 10 import com.rational.test.ft.object.interfaces.generichtmlsubdomain.*; 11 import com.rational.test.ft.script.*; 12 import com.rational.test.ft.value.*; 13 import com.rational.test.ft.vp.*; 14 import com.ibm.rational.test.ft.object.interfaces.sapwebportal.*; 15 /** 16 * Description : Functional Test Script 17 * @author lenovo 18 */ 19 public class test extends testHelper 20 { 21 /** 22 * Script Name : <b>test</b> 23 * Generated : <b>2014-10-18 上午2:01:44</b> 24 * Description : Functional Test Script 25 * Original Host : WinNT Version 6.1 Build 7601 (S) 26 * 27 * @since 2014/10/18 28 * @author lenovo 29 */ 30 public void testMain(Object[] args) 31 { 32 startApp("ClassicsJavaA"); 33 34 // Frame: ClassicsCD 35 tree2().click(atPath("Composers->Haydn->Location(PLUS_MINUS)")); 36 tree2().click(atPath("Composers->Haydn->Location(PLUS_MINUS)")); 37 tree2().click(atPath("Composers->Haydn->Location(PLUS_MINUS)")); 38 tree2().click(atPath("Composers->Haydn->Symphonies Nos. 94 & 98")); 39 tree2().click(atPath("Composers->Haydn->Symphonies Nos. 99 & 101")); 40 tree2().click(atPath("Composers->Schubert->Location(PLUS_MINUS)")); 41 tree2().click(atPath("Composers->Schubert->Die schone Mullerin, Op. 25")); 42 placeOrder().click(); 43 44 // Frame: Member Logon 45 memberLogon().close(); 46 47 // Frame: ClassicsCD 48 classicsCD(ANY,MAY_EXIT).click(atPoint(611,5)); 49 } 50 }