1

我正在尝试运行参数化测试...试图像这里解释的那样实现它: 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。此外,它需要有一个构造函数,它要么只接受类,要么接受类和构建器。

需要帮助来修复它

更新

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

    [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

4

2 回答 2

3

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

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

于 2011-08-16T07:14:00.170 回答
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参数化测试的实际实现(该示例是虚构的)。

于 2011-08-15T21:06:47.370 回答