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