flexunit:参数化测试

时间:2011-08-15 17:51:06

标签: flex flexunit4

我正在尝试运行参数化测试...正在尝试实现它,就像它在这里解释的那样: http://docs.flexunit.org/index.php?title=Parameterized_Test_Styles

以下是我的测试用例

import org.flexunit.runners.Parameterized;

[RunWith("org.flexunit.runners.Parameterized")]
public class ArrayBasedStackTests
{       
    [Paremeters]
    public static var stackProvider:Array = [new ArrayBasedStack(), new LinkedListBasedStack()] ;

    private var _stack:IStack;

    public function ArrayBasedStackTests(param:IStack)
    {
        _stack = param;
    }


    [Before]
    public function setUp():void
    {
    }

    [After]
    public function tearDown():void
    {
    }

    [Test ( description = "Checks isEmpty method of the stack. For empty stack", dataProvider="stackProvider" )]
    public function isEmptyStackPositiveTest():void
    {
        var stack:IStack = _stack;
        assertEquals( true, stack.isEmpty() );
    }

但是这段代码在初始化错误后抛出:

  

错误:自定义运行器类org.flexunit.runners.Parameterized应该   链接到项目并实施IRunner。还需要它   一个构造函数,它只接受类,或类和a   助洗剂。

需要帮助解决问题

更新

我已经更新了代码,所以它看起来像这样

    [RunWith("org.flexunit.runners.Parameterized")]
public class ArrayBasedStackTests
{       
    private var foo:Parameterized;

    [Parameters]
    public static function stacks():Array
    {
        return  [ [new ArrayBasedStack()], [new LinkedListBasedStack()] ] ;
    }

    [Before]
    public function setUp():void
    {
    }

    [After]
    public function tearDown():void
    {
    }

    [Test ( description = "Checks isEmpty method of the stack. For empty stack", dataProvider="stacks")]
    public function isEmptyStackPositiveTest(stack:IStack):void
    {
        assertEquals( true, _stack.isEmpty() );
    }

有效。但结果有点奇怪。我有4个测试执行而不是2.(我在数据提供程序中有2个项目,因此无法获得为什么我有4个测试)。

输出

http://screencast.com/t/G8DHbcjDUkJ

2 个答案:

答案 0 :(得分:3)

[Parameters]元数据指定将参数传递给测试的构造函数 - 因此为每个参数调用测试类。您还为特定测试方法设置了dataProvider,因此每个参数也会调用一次测试方法。两次调用测试和两次调用方法最终运行四次测试。

解决方案是使用[Parameters]元标记指定要用于整个测试类的数据,或者对每个测试方法使用dataProvider,但不能同时使用相同的数据同时。

答案 1 :(得分:2)

您缺少对Paramaterized的静态引用,如下所示:

    import org.flexunit.runners.Parameterized;

[RunWith("org.flexunit.runners.Parameterized")]
public class MyTestNGTest
{       

    private var foo:Parameterized;
    ...

基本上,该错误意味着定义的[Runner]在运行时不可用,如果类中没有静态引用导致它被链接,则会发生这种情况。

在FlexUnit 4.5.1中,这种方法改为使用[Rule],如下所示:

public class MyTestNGTest
{
    [Rule]
    public function paramaterizedRule:ParamaterizedRule = new ParamaterizedRule();

    ...
 }

但是,我似乎无法看到IMethodRule对于参数测试的实际实现(这个例子是虚构的)。