flexunit: параметризованные тесты - PullRequest
1 голос
/ 15 августа 2011

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

Нужна помощь, чтобы исправить это

UPDATE

I 'Мы обновили код, чтобы он выглядел следующим образом

    [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 ]

3 голосов
/ 16 августа 2011

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

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

2 голосов
/ 16 августа 2011

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

...