always_fly 发表于 2019-1-24 15:44:25

自动化测试 - RFT系列教程4:RFT是如何识别控件的(二) 对象库与脚本

上一节里面我们介绍了如何使用工具抓取控件(对象),现在大家一定很好奇,那些抓下来的对象最终以什么样的形式保存了下来呢?这一节我们就将接触脚本和对象库是以什么样的形式保存在你的硬盘里面的。

回到上一节的例子,我们已经新建了一个RFT的项目并在其中新建了一个空的脚本(名字叫RFT_03_001),然后在脚本里面抓取的google主页上面的Google Search按钮,并使用逻辑的对象名称button_googleSearchsubmit,下面我们就逐步在硬盘上找到他们。

RFT项目本质上就是一个Java的项目

我们现在所在的是名叫Functional Test的Perspective,我们可以通过Window->Open Perspective->Java(或者Other里面查找)切换到Java Perspective,在这个perspective下面,你可以清楚地看到一个RFT的项目其实就是一个Java项目(如下图RFT_4_001),只不过是多了一些文件和文件夹。



从上图我们看到这样几个文件夹Peferenced Libraries、(default package)、resources、templates和一个文件RFT_03_001.testsuite

Peferenced Libraries:就是该项目所引用的Lib,包括RFT自带的jar也包括我们自己加的jar
(default package):这是一个默认的package,如果没有指定Test Folder,所有的测试脚本都会创建在这里
resources:这是本节最重要的一个package,它里面一般不存放脚本,但是存放更加重要的对象库,下面会详细介绍
templates:这是存放项目中template文件的地方,在后面讲到template使用的时候会再次接触他
文件RFT_03_001.testsuite:主要用于配合Rational其他工具使用,如ClearCase

首先是脚本文件:

脚本文件本身就是一个java类(RFT_03_001.java), 同时它有继承一个叫RFT_03_001Helper的类, 在RFT里面任何一个脚本(类)都继承一个**Helper类

// RFT_03_001 class
public class RFT_03_001 extends RFT_03_001Helper
{
        public void testMain(Object[] args)
        {
                button_googleSearchsubmit().click();
        }
}
在上面的代码里面, testMain是脚本执行的入口, 任何脚本的执行都是从它的testMain方法开始的。

public abstract class RFT_03_001Helper extends RationalTestScript
{

        protected GuiTestObject button_googleSearchsubmit()
        {
                return new GuiTestObject(
                        getMappedTestObject("button_googleSearchsubmit"));
        }

        protected GuiTestObject button_googleSearchsubmit(TestObject anchor, long flags)
        {
                return new GuiTestObject(
                        getMappedTestObject("button_googleSearchsubmit"), anchor, flags);
        }

        protected RFT_03_001Helper()
        {
                setScriptName("RFT_03_001");
        }
       
}
Helper类里面主要有两种函数,一个是构造函数,这里给该脚本设置了名字,另两个是返回对应控件的对象(TestObject) 方法,一般一个对象对应两个方法(通过重载可以接收不同的参数,后面我们会再提到他们的一些特殊应用),这样继承该Helper类的脚本就可以使用这样的方法来操作被测控件了,如脚本testMain方法里面的button_googleSearchsubmit().click();就表示点击该按钮。在返回TestObject的方法里面,有一行代码是getMappedTestObject("button_googleSearchsubmit"),这个意思就是在TestObject Map(对象库)里面寻找名字叫做button_googleSearchsubmit的TestObject(对象)。

现在我们就来看看储存对象库的文件: RFT_03_001.rftdef和RFT_03_001.rftxmap。

这两个文件本质都是XML文件,RFT_03_001.rftdef则是定义了被测对象的逻辑名称,如button_googleSearchsubmit,而RFT_03_001.rftxmap则储存了被测对象的特征或者属性值,如title,class,type等,然后他们通过id来保证两个文件的一致性。

RFT_03_001.rftdef的内容如下,这里面只有一个对象,他的逻辑名字是button_googleSearchsubmit,它对应的id则是4.1Ec2yhmgqeP1:lWG7b:MJAx5jS:8WW(这个id是RFT自动生成的)

<!-- RFT_03_001.rftdef -->
<?xml version="1.0" encoding="UTF-8"?>
<ScriptDefinition L=".ScriptDefinition">
        <ScriptName>RFT_03_001</ScriptName>
        <Language>java</Language>
        <Map>resources/RFT_03_001.rftxmap</Map>
        <Datapool />
        <DatapoolIterator></DatapoolIterator>
        <HelperSuper></HelperSuper>
        <ScriptNameMap L=".ScriptDefinitionNameMap">
                <TestObject L=".ScriptDefNameMapElement">
                        <Name>button_googleSearchsubmit</Name>
                        <ID>4.1Ec2yhmgqeP1:lWG7b:MJAx5jS:8WW</ID>
                        <Role>Button</Role>
                        <Deleted>false</Deleted>
                </TestObject>
        </ScriptNameMap>
        <Properties L=".PropSet"></Properties>
        <ScriptEncoding>Cp1252</ScriptEncoding>
        <KeywordName></KeywordName>
</ScriptDefinition>
下面是RFT_03_001.rftxmap的内容,这里一共记录了五个对象的特征和属性,包括我们在对象库里面看到的按钮及其它的父控件(parent TestObject),如IE,Web页面,Form,Table等,在这里面你可以找到我们在RFT_03_001.rftdef里面有逻辑名称的按钮的id,这样所有的信息都联系了起来。

<!-- RFT_03_001.rftxmap -->
<?xml version="1.0" encoding="UTF-8"?>
<ObjectMap L=".ObjectMap">
        ... ...
        <Attribute L=".Attribute">
                <Name>.MtoSet</Name>
                <Value L=".ObjectMapSet">
                        ... ...
                        <MTO L=".MTO">
                                <Id>4.1Ec2yhmgqeP1:lWG7b:MJAx5jS:8WW</Id>
                                <Name>GoogleSearchsubmit</Name>
                                <Parent>3.1Ec2yhmgqeP1:lWG7b:MJAx5jS:8WW</Parent>
                                <TO>GuiTestObject</TO>
                                <Dom>Html</Dom>
                                <Class>Html.INPUT.submit</Class>
                                <Role>Button</Role>
                                <Proxy>.html.PushbuttonProxy</Proxy>
                                <State>true</State>
                                <Prop L=".MtoProp">
                                        <Key>.id</Key>
                                        <Val></Val>
                                        <Wt>90</Wt>
                                </Prop>
                                <Prop L=".MtoProp">
                                        <Key>.type</Key>
                                        <Val>submit</Val>
                                        <Wt>95</Wt>
                                </Prop>
                                <Prop L=".MtoProp">
                                        <Key>.value</Key>
                                        <Val>Google Search</Val>
                                        <Wt>100</Wt>
                                </Prop>
                                ... ...
                        </MTO>
                </Value>
        </Attribute>
        ... ...
</ObjectMap>
结论这样每当我们抓取一个控件并给他赋予逻辑名称的时候,RFT都会在RFT_03_001.rftxmap和RFT_03_001.rftdef里面加入相应的特征信息,并且在Helper类里面添加可以返回该对象(TestObject)的两个方法,供脚本调用。

页: [1]
查看完整版本: 自动化测试 - RFT系列教程4:RFT是如何识别控件的(二) 对象库与脚本