基于 IBM Rational Functional Tester 实现高效的自动化测试日志框架

452111 8年前
   <h2><strong>引言</strong></h2>    <p>随着自动化测试覆盖率的增加,自动化测试项目本身的代码复杂性也会相应提高。不同于其他软件开发项目,UI 自动化测试有其特性,它是模拟人手工来执行测试套件,验证产品质量的一种软件项目。它通过运行测试套件中的验证点,判断验证点是否通过来验证是否有缺陷产生;而缺陷的数量和缺陷在不同模块的分布对软件产品质量的定性分析和预测很重要。一个良好的自动化日志模块应该能有效的记录和反应这些缺陷信息,提供给所有关心质量项目人员他们所需要的质量指标。界面元素的变动和重新识别往往是自动化项目维护成本较高的原因之一,如何高效准确的识别和定位界面元素的变化很重要,一个好的日志模块应该能准确记录运行信息,捕获控件识别的情况,帮助测试开发工程师迅速的定位问题。下面基于 IBM Rational Functional Tester 介绍如何实现一个高效的 UI 自动化测试日志框架。</p>    <h2><strong>日志展示</strong></h2>    <p>在自动化测试过程中,测试开发人员侧重于脚本本身运行成功与否,会从多个角度关注测试脚本的运行状态:失败信息提示,待测系统信息,脚本运行服务器信息,测试数据信息。其他质量人员则会从产品角度关注缺陷分布情况和整体的产品质量:测试脚本(通常一个脚本对应一个用例)所属功能范围,缺陷总数目,缺陷在各个功能模块的分布。</p>    <p>日志模块应该能在运行完毕测试用例以后输出相应的信息,这些信息可以以全局变量的形式记录在 Test Logger 当中。每启动一个 Test Case,相应的初始化一个 Test Logger,记录这个用例不同维度的测试指标,当一个脚本运行完毕以后,应当自动的把这些信息以用户期望的形式输出。在每个 Test Case 里都应当有一个 Test Logger 初始化和终止的方法来初始化和记录这些信息。</p>    <p>IBM Rational Functional Tester 支持多种类型的日志展示:</p>    <ul>     <li>文本 - 在 Functional Tester 脚本窗口中显示 ASCII 格式的日志。</li>     <li>HTML - 在您的缺省浏览器中显示 HTML 格式的日志。</li>     <li>TPTP - 在 Functional Tester 脚本窗口中显示使用 TPTP 的日志。</li>     <li>XML - 在您的缺省浏览器中显示 XML 格式的日志。</li>     <li>Test Manager - 在 Test Manager 的测试日志窗口中显示 Functional Tester 日志信息。必须关联 Functional Tester 项目和当前的 Rational 项目,以显示和管理 Test Manager 中的日志。</li>    </ul>    <p>通过设置 RFT 首选项(窗口->首选项->功能测试->回放-)日志记录)可以配置日志的选项,包括日志的显示类型,是否在脚本运行后自动展示日志,屏幕快照的记录和显示,是否记录 GUI 操作等等。用户可以根据项目需要进行相应的配置。</p>    <p>图 1. RFT 配置日志首选项</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/7594cca3a51dd731b6566d28b6ca864f.png"></p>    <h2><strong>日志定制化</strong></h2>    <p>除了以上几种标准日志格式外,IBM RFT 还可以创建定制的日志文件,使日志以用户指定的格式进行展示。创建定制化的日志文件主要有两个步骤:创建扩展的日志插件以及部署日志插件。RFT 可以通过创建日志插件来扩展扩展点或者编写特定的方法来定制日志内容和展示,在 RFT 里创建日志插件的步骤如下:</p>    <p>打开 RFT,点击新建项目->新建插件项目,设定插件名称,按默认选项点击完成。插件项目新建成功以后点击 plugin.xml 进行配置。选中依赖项选项卡->必须的插件->添加插件,在插件中输入 com.ibm.rational.test.ft.playback, 点击确定保存。</p>    <p>图 2. RFT 创建插件项目和配置依赖项</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/c18a74bf87de0a174f987171c526f76a.png"></p>    <p>选中配置扩展想选项卡,添加所需的扩展插件。</p>    <p>图 3. 配置扩展项</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/33a99ead8aa38547b7dc042cf3177d07.png"></p>    <p>在窗口左侧窗格的项目文件夹中,选中 plugin.xml 单击导出,将插件项目导出为可部署的插件和片段,设置导出路径,即可完成插件的部署工作。</p>    <p>图 4. 部署扩展的日志插件</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/636a6484eaaf280a9e5d0230f35892d8.png"></p>    <h2><strong>日志错误信息定位</strong></h2>    <p>ITCL(IBM Test Community Leadership)框架是由 QSE(Quality Software Engineering)小组和 IBM 内部的自动化测试开发专家开发和维护的一套框架。此框架自底向上由三层框架构成:测试对象层(Test Object),测试任务层(Test Task),测试用例层(Test Case)。这三层分别只调用下层对象,形成的自动化测试代码具有良好的松耦合性。</p>    <p>ITCL 框架提供了:</p>    <ul>     <li>由 appobjects, tasks, testcases 组成的松耦合三层架构。</li>     <li>IBM 类包:包括测试脚本可直接调用的 logger, 恢复到特定状态的 recovery, 对应页面对象的捕捉器 widget 以及 RFT 里常用的 util 方法。</li>     <li>IBM 最佳实践: 哪些项目适合做自动化, 如何评估复杂度,自动化项目开发管理流程。</li>     <li>集成的 IDE</li>    </ul>    <p>ITCL 框架提供了从技术到流程的支持,为自动化的实现提供了一个高效的基石。基于 ITCL 框架可以很容易的构建松耦合,易维护的 UI 测试自动化代码。</p>    <p>图 5. ITCL 自动化框架</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b3e91bb6af9e035cb4469eafd86c9392.png"></p>    <p>测试对象层主要用于识别待测应用程序的测试元素(按钮,文本框,下拉框,导航…),主要包括静态识别和动态识别两种方式。由于动态识别的灵活性和易维护性,复杂度较高的项目一般采用动态识别的方式来识别对象。动态识别是通过界面元素的特定属性(包括元素类型,层次结构等等)来识别对象。通过构建一个统一的界面元素识别入口 Object Finder,并在识别入口处插入 Logger 记录识别的结果,即可记录所有的界面元素识别情况:正确则在日志中显示 Pass,错误则显示相应的错误识别消息和元素的识别属性。日志框架通过对界面元素识别情况的记录可以迅速的帮助测试开发人员定位到由于界面元素识别失败而造成的失误,大大减少了调试时间。下面以 RFT 为例说明如何构建一个统一的识别入口以及如何使用 Logger 记录识别情况(本文仅针对自动化测试中最常用的动态识别)。</p>    <p>测试任务层主要基于测试元素进行各种操作,不同软件程序的业务逻辑虽然千变万化,但都基于一套标准的鼠标和键盘操作。无论业务逻辑多么复杂,都是基于鼠标点击,文本输入,界面导航实现的。根据自动化测试项目的这些特点,将鼠标键盘的原子操作提取出来作为 Common Task,并在 Common Task 里插入 Logger 记录原子操作的正确性即可实现对 Task 层的运行的监控。</p>    <p>本文在 ITCL 基础上,通过实现对统一的对象识别入口和原子操作入口的监控和日志记录帮助自动化测试开发人员在开发和维护时迅速的定位错误。</p>    <p>图 6. 基于 ITCL 实现快速错误定位</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/9cae9f5b58c7eee4143569c01f7ae4e4.png"></p>    <p> </p>    <h2><strong>界面元素日志定位</strong></h2>    <p>动态识别是通过 find 方法和属性找到相应的对象,页面元素的属性可以映射为一个以特定分割符分割的文本串。因此对于任意页面元素,定义好了其属性识别串,即可按如下方法来进行页面元素识别,以 findObjectByProperties 作为唯一对象识别入口,并在其中插入 Logger 记录识别结果。下图以页面登陆为例说明:首先在对象识别库中(Object Repository)以文本形式记录登陆框识别属性,在对象识别时找到相应的属性识别字符串,调用 setPropertyGroup 解析字符串为属性组,将属性组输入到 find 方法中查找返回对象。如果有相应对象,则 Test Logger 在日志中显示 Pass,如果没有识别到相应对象,则显示 Fail。</p>    <p>清单 1.页面元素属性识别字符串</p>    <pre>  <code class="language-java">public class ObjRepository{          // 登陆页面   public static final String uname = ".gsTextclass=.text,.gsLoginNameId=username";   public static final String uPsd=".gsTextClass=.text,.gsLoginNameId=password";   public static final String loginBtn==".gsLinkClass=.Link,.gsLoginNameId=Login";         //其他页面    }</code></pre>    <p>清单 2.通过页面元素属性识别字符串识别待测应用程序元素</p>    <pre>  <code class="language-java">//根据属性对查找唯一符合条件的元素,并且记录查找结果到日志模块当中   public TestObject findObjectByProperties(String properties) {    TestObject to = null;        try {     Property[] propGroup = setPropertyGroup(properties);     TestObject[] tos = getRootTestObject()       .find(atDescendant(propGroup));     to = tos[0];     TestLogger.logPassInfo("Pass- Object( " + properties       + " ) is not found by ObjFinder);       return to;    } catch (Exception e) {     TestLogger.logErrorInfo("Fail- Object( " + properties       + " ) is not found by ObjFinder", e);     return null;    }   }            //解析元素识别字符串,将字符串映射为属性对            public Property[] setPropertyGroup(String properties) {    String[] strGroup = properties.split("split symbol");    Property[] propGroup = new Property[strGroup.length];    for (int i = 0; i < strGroup.length; i++) {     String[] propertyPair = strGroup[i].split("=");     String key = propertyPair[0];     String value = propertyPair[1];     propGroup[i] = new Property(key, value);    }    return propGroup;   }</code></pre>    <h2><strong>界面操作日志定位</strong></h2>    <p>依然以登陆页面为例,登陆任务会依次调用 Common Task 里的文本输入方法输入用户名和密码,并调用鼠标点击动作进行表单信息的提交。Common Task 会继续调用 Test Logger 里的 loggerForTextInput 执行登陆操作,并往日志里插入文本输入信息输入的状态。成功显示 Pass,如果失败则显示失误相关的信息,帮助监控所有操作执行的情况和准确定位失误的位置。</p>    <p>清单 3.界面操作识别定位</p>    <pre>  <code class="language-java">//登陆 Task       public class LoginOps extends LoginOpsHelper {     BrowserOps browserOps = new BrowserOps();   CommonOps commonOps = new CommonOps();   ObjRepository objRepo = new ObjRepository();     public void login(String uname, String psd) {    commonOps.setText(objRepo.unameText, uname);    commonOps.setText(objRepo.userPsdText, psd);    commonOps.clickButton(objRepo.loginBtn);   }        }         //Common Task        public class CommonOps extends CommonOpsHelper {     ObjFinder objectFinder = new ObjFinder();             //文本输入     public void setText(String properties, String text) {    WTextField wText = new WTextField(      objectFinder.findTextField(properties));    TestLogger.loggerForTextInput(wText, properties, text);   }              //鼠标点击   public void clickButton(String properties) {    WButton button = new WButton(objectFinder.findTextField(properties));    TestLogger.loggerForClickButton(button, properties);   }             //其他基本操作           }              //TestLogger         public class TestLogger extends TestLoggerHelper {           public void loggerForTextInput(WTextField t, String property,     String sInputText) {    try {     t.setText(sInputText);     TestLogger.logScriptInfo("Pass - Input Text: " + sInputText       + " into Text Widget (" + property + " )");    } catch (Exception e) {     TestLogger.errorHandler("Fail - Input Text: " + sInputText       + " into Text Widget (" + property + " )", e);    }   }</code></pre>    <h2><strong>结束语</strong></h2>    <p>本文基于 IBM Rational Functional Tester 实现了高效的自动化测试日志框架,对自动化测试开发人员具有一定的借鉴意义。本文从日志展示和定制化角度说明了如何针对项目不同的人员和项目的情况配置 RFT 日志选项以及如何通过 RFT 定制日志插件。本文也基于 ITCL 框架说明了如何构建日志模块,通过统一的对象识别入口和动作操作入口的监控,来帮助测试开发人员迅速定位错误,高效的开发和调试自动化程序。</p>    <h2> </h2>    <p> </p>    <p><a href="/misc/goto?guid=4959725325339745117" rel="nofollow,noindex">Rational 软件面向架构师、开发人员和工程师的参考资料</a></p>    <p>简介:</p>    <p>访问 IBM developer Works 中国网站 Rational 专区,获得关于 IBM Rational 软件交付平台(Rational Software Delivery Platform)产品的技术资源和最佳实践。</p>    <p><a href="/misc/goto?guid=4959725325439439528" rel="nofollow,noindex">IBM developerWorks 时事通讯</a></p>    <p>简介:</p>    <p>一份关于 developerWorks 指南、文章、下载、社区活动、网络广播和技术讲座的电子周刊。</p>    <p><a href="/misc/goto?guid=4959725325521379240" rel="nofollow,noindex">基于 IBM 自动化三层架构设计 web 应用的 RFT 脚本</a></p>    <p>简介:</p>    <p>从一个新的角度介绍了基于 Rational Functional Tester 开发的 Web 应用自动化测试框架。这种模式实现了数据和脚本分离,测试单元可以很大程度的复用,提高了脚本的利用率,同时也使脚本的可维护性大大提高。</p>    <p><a href="/misc/goto?guid=4959725325604690126" rel="nofollow,noindex">基于 Eclipse 实现 RFT 扩展验证工具包</a></p>    <p>简介:</p>    <p>Eclipse 实现 RFT 扩展验证工具包 MVPL 的一些主要功能和相关实现,并且将一些最佳实践和方法介绍给大家。并辅以一个具体实例来说明问题。</p>    <p><a href="/misc/goto?guid=4959725325688149722" rel="nofollow,noindex">实战 GUI 产品的自动化测试</a></p>    <p>简介:</p>    <p>自动化测试技术是保证产品质量的重要手段。随着敏捷开发方法的盛行和产品发布周期的缩短,产品对测试的要求也相应提高,因此自动化测试也变得比以前更加重要。在本文中,您将了解我们如何看待自动化测试,又是如何通过 RFT 来实现简单的测试目标。</p>    <p> </p>    <p>来自:http://www.ibm.com/developerworks/cn/rational/1611_xux_rft/index.html?ca=drs-</p>    <p> </p>