基于RFT的自动化测试层次

上一篇 / 下一篇  2011-08-24 17:02:56 / 个人分类:自动化测试—框架思想

        简易自动化测试设计 之一

      —基于RFT的自动化测试层次

   序言:基于RFTswing界面的自动化测试,这里不是说怎么去使用工具,而是怎么将RFT融入到自动化测试设计中,其实RFT在整个设计中只是一个辅助的角色,如果时间允许的话,谁也不想用这么昂贵还这么不灵活的RFT,接下来,你读完这个系列后,你就知道为什么我这么说了。

一、简易自动化测试架构说明

很多人都应该了解了GUI自动化测试的通用架构划分如下:

1、 对象层AppObject,存储基于find()搜索控件的具体方法,我分成了两大类,一类是通用的基本java控件、一类的不同产品线的相应的自己拓展的控件类。

2、 方法层AppLib,存储简单的操作函数,在这里,我分成了两大类:LibMethod类,Lib类用于对象的基本操作方法,Method类存储用于一些基本的自己拓展的操作方法,例如:外部文件读写操作、日志写出操作、模拟键盘鼠标操作(Robot类拓展)等。

3、 用例层AppCase,调用测试方法进行测试用例的组织,不同的产品线对应不同的测试集,一个简单的测试功能模块对应一个测试用例。

 

二、简易自动化测试架构的实例

以下可以看一个整体的简单实例操作:

1、 AppObject文件夹中有一个object.java文件,存储一系列的通用的控件查找方法:

实例如下:

////////按钮组件//////////    

        //用于搜索其上的按钮

        //输入:按键名称

        //类别:GuiTestObject

        public GuiTestObject getButton(String buttonName)

        {

                   RootTestObject root = getRootTestObject();

                  TestObject[] to = root.find(atDescendant(".class","javax.swing.JButton","accessibleContext.accessibleName",buttonName));

                  

                  return new GuiTestObject(to[0]);

}

///////文本框组件//////         

//用于搜索文本输入框

         //输入:无

         //类别:WTextField

        public WTextField getTextField(String LabelName)

        {

                   RootTestObject root = getRootTestObject();

                  TestObject[] to = root.find(atDescendant(".class","javax.swing.JTextField",".priorLabel",LabelName));

                  return new WTextField(to[0]);

}

      aGuiTestObject是直接继承于RFT的所有对象的父类TestObject,其里面包含了一些简单的操作,而我只想用Buttonclick方法,所以我这里就直接返回的是GuiTestObject类。

     bRootTestObject也是直接继承与RFTTestObject,不过它与GuiTestObject类不同的是,它是直接指向被测的应用程序的,即是被测试应用程序的控件的一个全部的view,是按数据结构中的树的方式进行储存的,其中有方法为find(),可以基于属性用来在这个RootTestObject中查找你所需要的控件。

      cfind()方法查找的方式有三种,我重点说一下atChildatDescendant,前者是在查找根节点的直接子对象、而后者是查找所有的子对象。后面当然是要查找的控件的具体的属性了,在这里,我们可以定义一个基本不变的属性,然后定义一些需要在测试用例中改变的属性,例如:按钮,这里我设计的就是基于按钮名字来进行查找了,如果名字一样的话,你就得用一个别的方式了,例如:index

      dWTextFieldIBMITCL提供的一些控件包裹类,其实就是继承了一些RFT的基本类,然后自己写了一些方法而形成的类罢了,你也可以自己拓展一些控件类嘛。

2AppLib文件夹中有一个Lib.java的文件,其类存储对查找到的控件对象操作的基本方法。

实例如下:

//下面是对对象的初始化

public AppObject.Rc_Object getObject = new AppObject.Rc_Object();

//下面是对共同方法的实例化

public AppLib.Rc_Method getMethod = new AppLib.Rc_Method();

//////////////////////按钮组件操作/////////////////////////////

   //采用动态搜索的方法进行找到Button组件,并且执行click操作

        //输入:ButtonName

    public void ChooseButton (String buttonName)

        {

         getObject.getButton(buttonName).click();

         sleep(3);

         try {

       //向外部日志写其完成测试的步骤

                  getMethod.logWriter("完成"+ buttonName + "ChooseButton方法;");

        } catch (Exception e) {

           //可以调用异常处理模块进行异常处理

   }

   }

//////////////////////文本框组件操作/////////////////////////////   

        //采用动态搜索的方法进行找到TextField组件,并且执行click操作

        //输入:TextFieldName

         public void ChooseTextField (String LabelName,String TextName)

        {

      sleep(3);

          getObject.getTextField(LabelName).setText(TextName);

          //JAVA的语句将其UserName拆分成一个一个的字符进行输入

          try {

                  getMethod.logWriter("完成" +LabelName+" ChooseTextField方法");

        } catch (Exception e) {

                  //可以调用异常处理模块进行异常处理

        }

        }

          aChooseButton (String buttonName)方法就是找到一个名字为buttonName的按钮进行点击操作。ChooseTextField (String LabelName,String TextName)方法就是找到一个前缀名为LabelName的文本框进行输入TextName

          b、此处有一个getMethod.logWriter是用于向外部LOG写入具体的控操作信息的。当然你也可以不写在方法中,写在测试用例中也可以,不过需要其返回一个button的名称,然后在测试用例中一个方法获得这个name,然后再将信息写到日志中,个人认为后者方式较好,因为其可拓展性强。

          c、这里以前设计的是在此抓取异常,然后进行异常处理操作,你可以选择调用一个共同的异常模块,我的异常处理方式是:抓取到异常,则关闭整个测试程序,重新进行下一个测试用例。

3AppTestCase文件夹中有一系列产品线的文件夹,然后每个文件夹对应每个功能模块,这里就不多说了,根据自身公司部门的情况决定吧。

 

三、一些需要注意到的地方

1、 用动态搜索的方法是脱离RFT的对象库的,所以无需使用RFT的对象映射机制了。

2、 你可以在外部基于测试方法进行测试用例的编写。

3、 因为整个系列只用了RFT中的RationalTestScript类中的方法,所以我本想直接用eclipse导入含有这个类的jar包,然后基于eclipse进行其测试用例的编写,但没成功,因为其回放的机制中还用到了很多具体的类,这些就是不可见的了,看样子商业工具在这方面做的很严密啊。

4、 根据这样,你就可以想尽办法,利用RFT提供的CMD接口,将RFT隐藏起来吧。

5、 其实一个自动化测试框架而言,RFT最好能做到成为其框架的一个插件,所以用到的RFT东西越少就越好了。

6、 想想原理挺简单的,可是自己摸索的时候发现却要走了很多弯路,但是摸索的过程对于以后对整个测试活动理解还是很有帮助的,所以,个人觉得,不要怕走弯路,关键要摸索。

  

四、自动化测试平台中的模块

1、 自动化测试控制端模块(包括界面控制端)

2、 自动化测试执行驱动模块(也可以说是agent端)

3、 自动化测试分布式模块(其是最主要的模块,它可以将所有的模块联系起来)

4、 自动化测试工具架构模块

5、 自动化测试服务器模块

6、 邮件服务模块

7、 ……

每一个模块可以说是一个服务,以一个主模块为主,有一个主要的机架,然后各个小型模块。围绕这个机架,就最终形成了一个“简易自动化测试平台”

                                  


TAG:

引用 删除 wangkuibj   /   2014-11-28 16:31:24
5
散步的SUN的个人空间 引用 删除 散步的SUN   /   2012-01-31 16:10:21
hi
buttonName是具体的字符串,就是按钮的名称
这个方法是用来搜索对应按钮的
而在用例层中,我个人觉得,为了提高复用性,可以这样做
一个经常变的按钮名称,可以将其一个变量代替。然后在外部文件中,读取某一个名称赋给这个变量,这也是一种数据驱动的思想吧。这样,按钮名称改了的话,你可以只去改相应的外部文件中对应的按钮名称
2、
原帖由wn0112于2012-01-31 15:28:14发表
SUN兄:
public GuiTestObject getButton(String buttonName);
buttonName是具体的字符串吗?那么此函.
wn0112的个人空间 引用 删除 wn0112   /   2012-01-31 15:28:14
SUN兄:
public GuiTestObject getButton(String buttonName);
buttonName是具体的字符串吗?那么此函数应用到10个脚本中,如果以后变了,是不是要修改10处呢?还是说你有其它的应对方法?
kou_dou的个人空间 引用 删除 kou_dou   /   2011-09-09 17:33:10
像RFT这样的商业工具,如果想把它剥离出来感觉很难,虽然使用.find()方法似乎脱离了对象映射,但实际上RFT内部还有很多错综复杂的类关系,少导入一个包都会报错,这也可能是RATIONAL的一种保护措施吧。
现在还是想尽可能减少对商业自动化测试工具的依赖,像楼主所说的做成插件的形式。但一直没有找到很好的突破口,可能接下来应该尝试一些开源的东东吧。。。
感谢楼主分享,受益匪浅!
xin_晴的个人空间 引用 删除 xin_晴   /   2011-08-26 14:59:35
您好,我是51Testing软件测试网的编辑,您的本篇博文被推荐至51Testing软件测试网首页发表:http://www.51testing.com/html/30/n-243730.html
感谢您关注并支持51Testing博客,期待您更多的优秀原创博文。
@槽神刘叫兽 引用 删除 lyscser   /   2011-08-25 13:44:31
没油没盐,删了白删……
 

评分:0

我来说两句

Open Toolbar