文章来源:http://www.cnblogs.com/raol/p/flexmonkey.html

我的有道云笔记:http://note.youdao.com/share/?id=22b79669c366c65e6bbdc5e541266b8f&type=note


1. 研究FlexMonkey的缘由, 关于自动化测试.

     每一次的迭代都需要大量的回归测试, 测试的点烦了, 开发的懒得点, 导致最后出来的版本BUG繁多, 为了进一步提高软件质量, 但也不能做重复工作,所以咱也研究一下自动化测试吧。
    项目介绍: XXX
    所用技术: Flex4+Java  
    现在主要关注UI, UI部分主要由html+swf文件组成。所以怎么测试呢? 工欲善其事, 必先利其器。那咱就先百度一把看看有哪些工具吧。
    经过搜索Flash Selenium ,Flex UI Selenium,Selenium Flex API,Fluorida、FunFx,FlexMonkey,RIATEST发现这些都是针对Flex进行录制的工具, 但是很多工具已经是昨日黄花, 其中Flash Selenium ,Flex UI Selenium,Selenium Flex API,Fluorida、FunFx,都支持Flex2, Flex3,之后没有再更新, FlexMonkey, QTP,RIATEST 都有Flex4的支持,其中又分,RIATEST只支持对纯Flex或者AIR的测试, 咱页面还有html呢, 先放弃QTP这个比较庞大, 体积就不小,还有一堆vb脚本, 没得选, 暂时先研究FlexMonkey吧。
   
    FlexMonkey官方网站上有5个产品,我这次主要关注了FlexMonkium这款工具,这款工具能与传统的Selenium进行整合,能集成在SeleniumIDE上进行录制网页上所有操作的行为,通过SeleniumIDE导出Junit4的单元测试代码,导出代码后,能加上数据的准备操作,以及验证flex页面上的数据是否准确,此套代码能在SeleniumServer上运行, 客户端需要导入SeleniumRC的Lib,能完好的与持续集成环境整合,导出测试报告。
 
    经过此次的前期调研工作, 发现FlexMonkey挺符合目前项目需要的。
    选定工具: FlexMonkey+selenium
      相关的一些文章:《Flex自动化功能测试工具大比拼》, 该文章中介绍了几种专业自动化测试工具。
     
 
2. 认识 FlexMonkium , 下载 FlexMonkium .
    上一篇文章已经确定了目标, 那咱就现在认识一下Flexmonkey,点击进入 官网, 什么,你点了, 还没打开?是的,官网奇慢, 慢如蜗牛, 慢的都怀疑FlexMonkey是不是没钱搞个好点的域名解析供应商, 但又想回来, 或许就天朝慢呢, 不知不觉中打开了, 点击TESTINGTOOLS可以看到这个菜单下有FoneMonkey, FlexMonkey, Flexmonium, 等,点击FlexMonium,点击download按钮, 下载进入如下页面:当然需要先注册。
    点击下载
  • FlexMonkium5.1.1.zip, 下载完之后别忘记安装FlexMonkeyConsole v5.1.1,到此软件准备完毕。为缓解蜗牛速度,
  • 下方附件提供下载已上传至有道:
 
 
2012/7/30 23:23
 
 
3. FlexMonkium介绍.
    打开FlexMonkium5.1.1.zip,可以看到libs, flexmonkium.xpi, user-extensions.js, 到这里不得不讲到selenium, flexmonkium是selenium-IDE的一个插件, 以增加flex的录制功能, selenium-IDE是FireFox的插件, 安装完selenium-IDE与flexMonkium插件后可以看到如图所示:
 
flexMonkium作为selenium-IDE的插件, 装完后在selenium-IDE的右上方可以看到Monkey的图标, 第一次你需要配置,如图:
 
点击FlexMonkium, 弹出MonkeyConsole配置地址:
 
到此处FlexMonkium软件配置完成, 现在还是不能录制Flex页面, 此处需要加上monkey和adobe提供的类库,在FlasHBuilder编译参数里加上-locale en_US  -include-libraries "../lib/automation_monkey4.x.swc" "${flexlib}/libs/automation/automation_spark.swc" "${flexlib}/libs/automation/automation.swc" "${flexlib}/libs/automation/automation_agent.swc" "${flexlib}/libs/automation/automation_dmv.swc"
重新编译编译完成后, 用FireFox浏览, 此时你可以进行录制了.
 
    附件: 
    
 
以下是FlexMonkium 遇到的问题的解决方法.
    1.右键行为
        2.自定义组件的事件录制
        3.表格数据的验证
 
4.  FlexMonkium 录制鼠标右键行为.
    在这里特别提出录制鼠标右键行为, 因为默认monkey,是不录制鼠标右键的事件的, 顺着思路往下找, 有很多文章介绍自定义组件的事件的录制, 需要配的东西N多, 所以能避开就避开, 这里介绍一种方法, 经过研究发现, monkey封装了一个事件, 这个事件可以调用Flex页面的属性为public的方法,  在这里可以直接用, 比如你的页面在初始化的时候已经创建菜单 下面是例子: 
    
编译环境: FlashBuilder4.6  FlexMonkey5.1
 
 
1. 在录制的事件中在<UIEvent command="Select" value="test"><arg value="label1"/></UIEvent>之前加入 <CallFunctionMonkeyCommand value="wwwe" prop="automationName" functionName="show" />
即可解决问题.
 
2. 利用js调用函数
在需要调用函数的页面中加入ExternalInterface.addCallback("showRightClick", showRightClick);
扩展user-extensions.js    
在test方法里调用proc.getString("isCallFlexMethod", new String[] {"showRightClick", "", ""}))即可
 

自动化测试之flexmonkey-页面flex元素识别机制

目前,项目组在做功能自动化的时候使用flexmonkey5对flex元素进行识别。经过研究,Flexmonkey遵循着这样的识别准则:

一.默认识别:

1.automationName

2.id

3.monkeyID

二.使用其他属性对识别

具体来说,

1.当元素拥有automationName时,默认以automationName来识别一个元素,automationName可以不用指出;

2.没有automationName的情况下,使用id来识别元素;

3.在没有automationName以及id的情况下,使用monkeyID来识别,flexmonkey官方文档建议使用1与2两种方式来识别元素;

4.除了这三个属性以外,还可以使用其他属性来识别元素,要求此属性能唯一标志出该元素。

目前在项目中的实际使用中发现,flex元素的属性存在这样的情况:

1.大多数元素都拥有automationName和id,且automationName与id相同;

2.拥有automationName和id,二者值不同;

3.只拥有automationName或者Id其中之一;

4.没有automationName与id。这种情况下,自动产生monkeyID。

在项目中发现,在同一个parentowner下,存在多个automationName与id都一样的元素时,默认只能识别到第一个元素。这个时候,有两个途径来解决同类元素的识别:

1.使用monkeyID

2.使用其他属性对

现在首先介绍下如何使用monkeyID来识别,使用monkeyID几乎可以识别所有的flex元素。MonkeyID,在以前的版本中叫automationID,是使用automation tree来定位元素的。

MonkeyID的格式:automationowner.classname.number

解释一下,automationowner是父类的名字,classname是该元素的类名,number是该元素在父类下的序数值,默认从1开始,这个也可以从flexmonkey的最新产品看出来,monkeytalk与fonemonkey中,monkeyID的产生就是以#1开始,第一个同类元素是#1,第二个是#2,以此类推。

如果两个元素拥有同样的automationName和id,默认flexmonkey将以automationName来识别元素,这样就会出现识别不到的情况,在这个情况下,因为工具录制不能产生monkeyID,我们就需要手工编写脚本,按照monkeyID的格式,强制使用monkeyID来识别元素。

另外,如果元素有以上三个属性外的唯一属性值,也可以修改下录制的脚本,使用唯一属性值来识别元素。但是这里需要注意,flexmonkey只能使用一个属性对来识别元素,该工具还做不到使用多个属性对识别。

 
5.  FlexMonkium 录制Flex自定义组件.
    自定义组件的解决方法很多, Monkey不厚道, 只说override function get automationValue():Array方法, 不见效果, 加上如下方法
                        override public function getAutomationChildAt(index:int):IAutomationObject 
override public function get numAutomationChildren():int 
override public function getAutomationChildren():Array
即可
 
6. Flex dataGrid 多选
按住shif多选一下示例是选中1-3行
<UIEvent command="SelectIndex" value="dataGrid"><arg value="1"/><arg value="1"/><arg value="0"/></UIEvent>
<UIEvent command="SelectIndex" value="dataGrid"><arg value="3"/><arg value="1"/><arg value="2"/></UIEvent>
按住Ctrl 多选,选第一行和第三行
<UIEvent command="SelectIndex" value="dataGrid"><arg value="1"/><arg value="1"/><arg value="1"/></UIEvent>
<UIEvent command="SelectIndex" value="dataGrid"><arg value="3"/><arg value="1"/><arg value="1"/></UIEvent>
 
7. 取Alert值
<VerifyProperty value=\"Alert\" prop="className" propertyString=\"text\" expectedValue=\"核对的字符\" propertyType=\"equals\"/>
 
6. Flex验证
    这里介绍几个常用的标签:
 
    Verify

Verify Expression

VerifyProperty见验证表格所选中的第一行数据的属性的用法

    VerifyGrid获取某个cell用来验证某个cell的值 自己代码搞定吧
        <VerifyGrid  value=\"grid\" row=\"0\" col=\"1\"/>
 
    选中单元格第一行默认的录制没有提供, 得自己写代码
        <UIEvent command=\"SelectIndex\" value=\"grid\"><arg value=\"1 \"/></UIEvent>
 
    验证表格所选中的第一行数据的属性 这个也是要自己代码搞定
          proc.doCommand("getFlexMonkeyValue"
        <VerifyProperty value=\"grid\" propertyString=\"selectedItem.name\" expectedValue=\"w\" propertyType=\"equals\"/>
 
7.  FlexMonkium 结合selenium RC实现自动化.
        此时所有准备工作已全部完成, 这时你可以像使用Selenium-IDE一样.
录制完成后可以选择回放,可以导出JUNIT, 选择导出时需注意, 选择菜单
 
怎么自动化测试
1. 以上都准备就绪后, 打开网站录制操作, 录制完成后导出JUNIT生成java文件, 
 
2. 测试环境搭建: 
准备如下文件列表:
   JDK5
   selenium-server-standalone-2.24.1.jar
   user-extensions.js
   selenium-java-2.24.1.zip
准备测试服务器: windows环境,安装好JDK, linux需运行在窗口模式下, 还需装有firefox浏览器
编译及运行TestCase服务器: windows  或者 linux
3. 启动服务器:
启动selenium-server
输入: java -jar selenium-server-standalone-2.24.1.jar -userExtensions user-extensions.js
4. 测试端TestCase代码需注意的地方: 如下: 
 
Flexmonkey提供的简单的API介绍
1.验证属性
VerifyProperty 标签的使用:
例子:
 
if (proc.getBoolean("isFlexMonkey", new String[] {"<VerifyProperty value=\"grid\" propertyString=\"dataProvider.length\" expectedValue=\"1\" propertyType=\"equals\"/>"})) break; 
 
value: 界面UI中Flex 元素的ID.
propertyString: 界面UI中Flex 元素的属性.
expectedValue: 期望值.
propertyType: 对比类型.
2.验证表格
 
VerifyGrid标签的使用:
 assertEquals("err", "OK,w", proc.doCommand("getFlexMonkeyValue", new String[] {"<VerifyGrid  value=\"grid\" row=\"0\" col=\"1\"/>", ""}));
 
3. 提一下Selenium
在以上代码中用到两种Selenium提供的命令如下:
proc.getBoolean(String commandName, String[] args);
返回验证后的Boolean值.
proc.doCommand(String commandName, String[] args);
返回所定位的元素的String类型的值.
5. 现在你可以尽情的写你的前置条件里的数据, 和做完操作后断言所期望的值.
 
 
8. 关于半自动化
    

附录说明:

1.FlexMonkey官方文档官方网站很难打开,提供以下链接.

http://note.youdao.com/share/?id=a5a4881475b3864f459776fdea34d31d&type=note

2.扩展组件加入自动化测试:

http://www.infoq.com/cn/articles/flexmonkey-deep-dive

3. Selenium学习的文档
<selenium私房菜>
http://www.cnblogs.com/hyddd/archive/2009/05/30/1492536.html

4.Flex持续集成:

http://note.youdao.com/share/?id=e73ab7201fd66c637887bacf655a76dc&type=note

FlexMonkey实战的更多相关文章

  1. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  2. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  3. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  4. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  5. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  6. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  7. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  8. Linux实战教学笔记07:Linux系统目录结构介绍

    第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...

  9. Linux实战教学笔记06:Linux系统基础优化

    第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...

随机推荐

  1. Java 8 Optional 类深度解析

    Java 8 Optional 类深度解析 身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只 ...

  2. 【Maven】安装及配置(Linux)

    本文介绍Linux环境下安装Maven 安装环境和软件 系统:Linux(CentOS) 软件:apache-maven-3.3.9-bin.tar.gz(解压版). 安装步骤 maven是基于Jav ...

  3. Devexpress VCL Build v2013 vol 14.1.5 发布

    What's New in 14.1.5 (VCL Product Line)   New Major Features in 14.1 What's New in VCL Products 14.1 ...

  4. Activiti中23张表的含义

    1.与流程定义相关的4张表: 2.与执行任务相关的5张表: 3.与流程变量相关的2张表

  5. 2018.09.23 atcoder Boxes and Candies(贪心)

    传送门 一道挺有意思的贪心. 从1到n依次满足条件. 注意要特判第一个数已经大于x的情况. 但是如何贪心吃呢? 如果靠左的数没有越界,我们吃靠右的数. 原因是下一次靠右的数就会成为靠左的数,相当于多贡 ...

  6. js splice方法

    处理数组的方法很多,javascript splice()算是最强大的了,它可以用于插入.删除或替换数组的元素.下面来一一介绍! 1.删除-用于删除元素,两个参数,第一个参数(要删除第一项的位置),第 ...

  7. POJ 3686 The Windy's (最小费用流或最佳完全匹配)

    题意:有n个订单m个车间,每个车间均可以单独完成任何一个订单.每个车间完成不同订单的时间是不同的.不会出现两个车间完成同一个订单的情况.给出每个订单在某个车间完成所用的时间.问订单完成的平均时间是多少 ...

  8. 事务不起作用 Closing non transactional SqlSession

    In proxy mode (which is the default), only external method calls coming in through the proxy are int ...

  9. 城市边界线预测(根据灯光指数)(PUL)

    1.EXEALL.m function EXEALL(FilePath, FileName)%执行所有流程% FilePath: 文件夹所在路径% FileName: 文件夹名称 FullPath = ...

  10. hdu 4957 贪心破木桶接水大trick

    http://acm.hdu.edu.cn/showproblem.php?pid=4957 拿n只破的木桶去接水,每只木桶漏水速度为a[i],最后要得到b[i]单位的水,自来水的出水速度为V,木桶里 ...