flexunit: параметризованные тесты

Я пытаюсь запустить параметризованные тесты... Пытался реализовать его так, как описано здесь: 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

2 ответа

Решение

[Parameters] метаданные указывают, что параметры передаются в конструктор теста, поэтому класс теста вызывается для каждого параметра. У вас также есть dataProvider устанавливается для конкретного метода тестирования, поэтому метод тестирования также вызывается один раз для каждого параметра. Два вызова теста и два вызова метода заканчиваются выполнением четырех тестов.

Решение состоит в том, чтобы использовать [Parameters] метатег, который определяет данные, которые будут использоваться для всего тестового класса, или использовать dataProvider для каждого метода испытаний, но не для обоих с одинаковыми данными в одно и то же время.

Вам не хватает статической ссылки на 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 для параматеризованных тестов (этот пример вымышленный).

Другие вопросы по тегам