1. 首先下载所需的包,地址: http://tomorrow009.iteye.com/admin/blogs/579249 , 本文采用的是 4.0.0RC1.0 版本。
2. 将下载包解压后是一个名为 FlexUnit4TurnkeyRC_1.0 的 FLEX 工程,你可以直接导入到 FLEX BUIDER 中 作为参考示例。
3. 在 FLEX BUIDER 中建立一个项目,项目结构如下
最终截图:如附件图1
建立项目时需要将我们要用到的单元测试类包引入,类包路径为 FlexUnit4TurnkeyRC_1.0/ libs/ FlexUnit4.swc 和 FlexUnit4TurnkeyRC_1.0/ libs FlexUnit4UIListener.swc 。
最终截图:如附件图2
4. bl.as 是将要进行单元测试的目标类, testcase.as 是 bl.as 类测试用例类, suite.as 则可以将 testcase 作为资源引入,当进行大规模的整体测试时,此种做法的优势显而易见。
5. bl.as 代码如下:
package bl
{
public class bl
{
public function bl()
{
}
public function add(a:Number,b:Number):Number{
return a+b;
}
public function dec(a:Number,b:Number):Number{
return a-b;
}
public function isTrue(a:Boolean):Boolean{
return a;
}
public function isFalse(a:Boolean):Boolean{
return a;
}
}
}
6. testcase.as 代码如下
package testcase
{
import bl.bl;
import org.flexunit.asserts.assertEquals;
import org.flexunit.asserts.assertFalse;
import org.flexunit.asserts.assertTrue;
public class testcase
{
private static var b:bl;
public function testcase()
{
}
[BeforeClass]
public static function runBeforeClass(): void {
trace ( "runBeforeClass" );
b= new bl;
}
[AfterClass]
public static function renAfterClass(): void {
trace ( "runAfterClass" );
}
[Test]
public function aa(): void {
assertEquals(3,b.add(1,2));
}
[Test]
public function bb(): void {
assertEquals(3,b.dec(6,3));
}
[Test]
public function cc(): void {
assertFalse(b.isFalse( false ));
}
[Test]
public function dd(): void {
assertTrue(b.isTrue( true ));
}
}
}
这里用到的元标签 [BeforeClass] 、 [AfterClass] 、 [Test]
[BeforeClass] 的含义就是实例化此类之前先执行该标签指定的方法(该标签的第一个方法),所以我们需要将该标签指定的方法声明为 static.
[AfterClass] 的含义是当实例化此类之后,并且执行完此类的所有声明为 [Test] 的方法后,执行该标签制定的方法,所有此标签指定的方法也应该声明为 static.
所以该类的执行顺序为:
runBeforeClass()->testcase()->aa()->bb()->cc()->dd()->runBeforeClass();
testcase() 为构造函数
诸如 assertEquals() 等函数没有什么可讲的,如 junit 没什么不同。
7. suite.as 代码如下
package suite
{
import testcase.testcase;
[Suite]
[RunWith( "org.flexunit.runners.Suite" )]
public class suite
{
public var _testcase:testcase;
public function suite()
{
}
}
}
标签是告诉编译器如何编译,不作为最终编译代码。
[Suite]
[RunWith( "org.flexunit.runners.Suite" )] 含义为是说这里为单元测试的代理站点。
这里将 testcase 测试用例类作为属性引入,如果你有多个测试用例,那你就可以声明多个属性。
8. FlexDemoApp.mxml 代码
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=" http://www.adobe.com/2006/mxml " layout=" absolute " xmlns:flexUnitUIRunner=" http://www.adobe.com/2009/flexUnitUIRunner " creationComplete="init()" >
<mx:Script>
<![CDATA[
import mx.controls.List;
import suite.suite;
import org.flexunit.listeners.UIListener;
import org.flexunit.runner.FlexUnitCore;
public var core:FlexUnitCore;
public function init(): void {
core= new FlexUnitCore();
core.addListener( new UIListener(testrunbase));
core.run(suite);
]]>
</mx:Script>
<flexUnitUIRunner:TestRunnerBase width=" 100% " height=" 100% " id=" testrunbase " />
</mx:Application>
FlexUnit 为我们提供的单元测试的视图组件(当然你可以也可以自己写视图组件,视情况而定),当组件加载完毕后,我们执行了 init() 方法,这个方法的作用是 首先创建一个视图组件监听器,即 new UIListener(testrunbase) ,将该组件监听器做为参数传给 core.addListener() 方法,然后运行站点,当然你有多个站点,像如下运行
Core.run(suite1,suite2,...,suiteN);
最终截图:如附件图3