FlexUnit可以说是Junit的一个复制,因为它们具有太多的相似性,不过说白了,其实所有的单元测试都是一个样,主要的方法就是通过输入来比较输出的结果是否正确。虽说原理是这么简单,但是一个好的单元测试框架,可以为编程人员带来很好的方便,在FlexUnit中,当然也有一个很有的框架。要使用FlexUnit,先须先下载FlexUnit.swc,这是一个集成的单元测试包,下载后导入即可使用。请先看看一个简单的例子:
public class MyCircle
{
private var _radiusX:int;
private var _radiusY:int;
private var _r:int;
private var _length:Number;
private var _area:Number;
public function MyCircle() {
this._r = 0;
this._radiusX = 0;
this._radiusY = 0;
this._length = 0;
this._area = 0;
}
public function get radiusX():int { return _radiusX; }
public function set radiusX(value:int):void {
_radiusX = value;
}
public function get r():int { return _r; }
public function set r(value:int):void {
_r = value;
}
public function get radiusY():int { return _radiusY; }
public function set radiusY(value:int):void {
_radiusY = value;
}
public function get length():Number {
_length = 2 * _r * Math.PI;
_length = Math.round(_length);
return _length;
}
public function get area():Number {
_area = Math.PI * _r * _r;
return _area;
}
}
我们有一个待测试的类MyCircle,现在我们要测试两个函数:get length()(周长)、get area()(面积)。为了测试,我们编写了如下的测试类:
import flexunit.framework.Assert;
import flexunit.framework.TestCase;
public class MyCircleTest extends TestCase
{
public function MyCircleTest(methodName:String) {
super(methodName);
}
public function testLength():void{
var myCircle:MyCircle = new MyCircle();
myCircle.r = 50;
var result:Number = myCircle.length;
Assert.assertEquals(result,Math.round(Math.PI * 100));
}
public function testArea():void{
var myCircle:MyCircle = new MyCircle();
myCircle.r = 50;
var result:Number = myCircle.area;
Assert.assertEquals(result,50*50*Math.PI+1);
}
}
MyCircleTest类是TestCase的一个子类,一般的情况下,我们都要继承TestCase这个类,TestCase是运行多个测试方法的装置,它有一个methodName的属性,表示用来测试的方法名, textLength()、textArea()分别的测试MyCircle的length、area的方法。方法里,我们用到了Assert类,Assert可以说是一个用来判断结果的测试类,它提供了很多方法,如:
- assertEquals(),如何参数相等就运行正确,不等就会抛出一个错误
- assertNull( ) ->判断参数是否为Null;
- assertUndefined( ) ->判断参数是否未定义;
- ...
在一切都建立好后,再编写mxml:
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" xmlns:flexui="flexunit.flexui.*">
<mx:Script>
<![CDATA[
import flexunit.framework.TestSuite;
import flexunit.flexui.TestRunnerBase ;
private function init():void
{
var suite:TestSuite = new TestSuite();
suite.addTest(new MyCircleTest("testLength"));
suite.addTest(new MyCircleTest("testArea"));
testRunner.test = suite;
testRunner.startTest();
}
]]>
</mx:Script>
<flexui:TestRunnerBase id="testRunner" width="100%" height="100%" />
</mx:Application>
在这里,我们定义了一个变量suite,它的类型为TestSuite,TestSuite是一个装载测试的容器,也就是说,我们的要把我们的测试类分别加到这个容器上,如:
suite.addTest( new MyCircleTest( "testLength" ) );
suite.addTest(new MyCircleTest("testArea"));
在new MyCircleest(“testLength”);语句中,我们那函数testLength()的方法名作为参数,那么在TestCase里,就把methodName属性赋值为”testLength”,那么就表明了在这个TestCase对象里,我们要调用的测试方法是testLength( )。
之后,我们新建一个TestRunnerBase类的实例testRunner,TestRunnerBase是Panel的子类,那么它就是一个可显示的组件,它的test属性我们附值为suite,接着我们就可以开始测试了,也就调用testRunner的startTest()函数。
上图就是我们那见到的运行结果,如果测试全面通过,即图的右方会出现“√”的符号,如果测试不通过,就会出现如图所示:
图右方的文字写出了错误的详细说明,通过它显示的数据,我们可以很清晰的看到那个类的那个方法出错,从而友好地帮助编程人员测试代码。
文章转自:http://hi.baidu.com/s_addies/blog/item/6d76ea17aa80671e972b43d8.html