【前言】早在半年前的项目之处就想采用TDD的开发方式,最起码也要做到较完备的自动化测试。当时调研了很久找到一个叫FunFx的开源框架。可惜这个框架的试用之路并不平坦。最初找到的只有文档,照着文档做,失败了。看到文档上还是Flex2的,换成Flex2,编译都通不过,原来Flex2需要lcds的license只好回到flex3。被逼无奈去看代码,我的Ruby水平是二把刀,尽管改代码了,但还是通不过。怀疑是不是不支持Flex3,而且项目进度又容不得我们慢慢研究,只好自己写了一个功能有残次的测试框架,凑付着用,后来因为框架的扩展速度慢慢跟不上开发的速度,最终连写自动化测试用例的计划也放弃了。随着FunFx出了0.0.2,又对这个测试框架产生了一点希望,再次搭建的结果还是一度失败,经过不懈努力,总算在大年三十的下午运行了第一个Hello World!。
【正题:搭建TDD测试环境】(下面我说的过程是我个人运行的过程,应该是运行FunFx的充分条件,但不保证都是必要条件,如果有人发现哪个步骤是不必要的。请在回复中指出。)
FunFX是一个基于Ruby的自动化测试框架,所以,我们必须要装Ruby,我安装的Ruby版本是Ruby-186-26。我的Ruby IDE是eclipse上的RDT插件。我的操作系统是笔记本自带的Vista Home Basic,因此我的IE是ie7。我的Flex IDE是Flex Builder 3 beta3。
运行环境就这些,那么开始讲解搭建过程吧。我们从下载开始说起,首先,我们要去
RubyForge下载FunFx 0.0.2,那是一个zip文件,记得要把Source包也下载下来,在后面我会说到它的用处。
下载完毕之后,将其解压,我们可以看到三个文件:
- AutomationGenericEnv.xml
- FunFX-0.0.2.gem
- FunFXAdapter.swc
接下来,我们在FlexBuilder3中新建一个工程:LearnFunFx,在libs文件夹里加入下面三个swc文件:
- automation_agent.swc
- automation.swc
- FunFXAdapter.swc
这里面的前两个swc文件来自flex的sdk里面。后面的一个就是FunFx里面的swc,但是这个swc有可能是无法使用的,因为它是为flex 2编译的,这时就需要我们前面下载的源代码文件了。源代码文件解压开之后可以找到FunFXAdapter文件夹。里面就是FunFXAdapter.swc的源代码(包括测试代码)。将其编译成swc(如果你不会编译成swc,请查阅相关文章或自己琢磨,给你个提示,可以用library project)。将我们自己编译出来的swc文件拷到libs里。这样我们就收集全了所有的类包。
接着将AutomationGenericEnv.xml拷贝到src文件夹下,然后在LearnFunFx.mxml中加入如下代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
]]>
</mx:Script>
<mx:Button id="test" x="255" y="146" label="Button" click="Alert.show('Hello World!');"/>
</mx:Application>
代码实现的功能很简单,单击按钮,弹出Hello World!的对话框。
代码准备完了,接下来是编译了。下面我们在我们的工程:LearnFunFx上点击右键:选择Properties,再选择Flex Compiler,在Additional compiler arguments文本框中输入:-include-libraries "XXXX\LearnFunFx\libs\automation.swc" "XXXX\LearnFunFx\libs\automation_agent.swc" "XXX\LearnFunFx\libs\FunFXAdapter.swc"
XXX表示工程根文件夹,自己补齐。
接下来,一个囫囵的swf文件就被编译出来了。这里还有一个问题,html文件里面的Object标签一定要有一个name属性,其值要跟id一样,这就需要我们改html-template文件夹下的index.template.html了。我的做法是把body标签里的js代码删掉,只留下html标签版本的,然后在Object标签里面加上一个属性:name="${application}"。再次编译一个,将 bin文件夹下的所有文件拷到一个web应用中。
flex端的处理完毕了,接下来是Ruby,还记得那三个文件吗?
在三个文件所在的文件夹中地址栏里运行cmd(这是vista的小技巧,其他的windows可以通过传统的方式进入cmd窗口,并进入该文件夹),在命令行上输入:
gem install FunFX-0.0.2.gem等待一小会儿,屏幕上提示:Successfully installed FunFX,
version 0.0.2,表示已经安装成功。
然后进入Eclipse 新建一个ruby项目LearnFunFx,也将AutomationGenericEnv.xml拷到源文件同级目录下,新建LearnFunFxTest.rb,输入代码:
require 'test/unit'
require 'funfx'
class LearnFunFxTest < Test::Unit::TestCase
def setup
@ie = Funfx.instance
@ie.start(true)
@ie.speed = 1
@ie.goto("http://localhost/.../LearnFunFx.html", "LearnFunFx")
end
def test_control
@ie.button("test").click
end
end
“...”是web应用的名字,自己补齐。代码非常简单,功能是打开网页,找到名为LearnFx的swf,点击id为test的按钮。在运行之前,我们还要做一件事,不然的话,我们之前的所有努力都白费了。打开IE,按下alt,选择“工具”-> “Internet选项”,点击“安全”tab页,将“本地Intranet”安全级别设为低,将http://localhost加入可信站点,并将可信站点的安全级别设为低。(这里是我不确定是否多做了什么的地方之一)。做了这些之后,ruby调用js就不会被浏览器阻拦了。(刚才试了一下,运行完测试用例之后再改回去也不会被阻拦了,搞得我很郁闷,但是在我修改这里之前,确实是无法运行的。)
然后我们运行该测试用例,我们就会看到一个浏览器窗口被弹出,swf中的按钮被按下,一个Hello World!的对话框弹出。一切成功:)
(完)