Как я могу разделить абстрактные тесты в JUnit? - PullRequest
0 голосов
/ 18 февраля 2010

У меня есть абстрактный тестовый сценарий "AbstractATest" для интерфейса "A". У него есть несколько методов тестирования (@Test) и один абстрактный метод:

protected abstract A unit();

, что обеспечивает тестируемое устройство. Нет, у меня есть несколько реализаций "A", например "DefaultA", "ConcurrentA" и т. Д.

Моя проблема: Тестовый набор огромен (~ 1500 лок) и растет. Поэтому я хотел разделить его на несколько тестовых случаев. Как можно организовать / структурировать это в Junit 4 без необходимости иметь конкретный контрольный пример для каждой реализации и абстрактный контрольный пример.

Я хочу, например, "AInitializeTest", "AExectueTest" и "AStopTest". Каждый является абстрактным и содержит несколько тестов. Но для моего конкретного "ConcurrentA" я хочу иметь только один конкретный контрольный пример "ConcurrentATest".

Надеюсь, моя "проблема" ясна.

EDIT
Похоже, мое описание не было таким, что ясно .
Можно ли передать ссылку на тест?
Я знаю параметризованные тесты, но они требуют статических методов, что неприменимо к моей настройке. Подклассы абстрактного тестового набора принимают решение о параметре.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2010

Вы можете ввести параметр в методы тестирования и использовать один @DataProvider, создавая экземпляры всех классов для тестирования.Хорошо, все в одном тесте.

0 голосов
/ 09 марта 2010

Я не знаю, решали ли вы это уже, но я бы посоветовал вам сохранить один абстрактный тест, но экстернализовать реализации методов в этом абстрактном классе.

Например,создайте класс с вашими тестами Initialize

public class InitializeTester {
    protected static void testInitializeA(A unit) {
        ...
                assertSomething ...
    }

    protected static void testInitializeB(A unit) {
        ...
                assertSomething ...
    }

}

A класс с вашими тестами Execute:

public class ExecuteTester {
    protected static void testExecuteA(A unit) {
        ...
                assertSomething ...
    }

    protected static void testExecuteB(A unit) {
        ...
                assertSomething ...
    }

}

Тогда ваш реальный абстрактный тестер:

public abstract class ATester {
    @Test
    public void testInitializA() {
        InitializeTester.testInitializeA(unit());
    }

    @Test
    public void testInitializB() {
        InitializeTester.testInitializeB(unit());
    }

    @Test
    public void testExecuteA() {
        testExecuteTester.testExecuteA(unit());
    }

    @Test
    public void testExecuteB() {
        testExecuteTester.testExecuteB(unit());
    }

    abstract protected A unit(); 
}

Вы можете закончитьу абстрактного тестового класса есть много методов, но все они будут очень короткими, поскольку они передают управление вашим классам Tester.

0 голосов
/ 18 февраля 2010

Почему бы не позволить каждому конкретному тестовому коду инициализировать конкретный экземпляр для тестирования с помощью метода, вызываемого через @Before.т.е. вы инициализируете новый экземпляр конкретного экземпляра до для каждого теста.Затем абстрактный класс тестирования может предоставить тесты, работающие с этим экземпляром (на который ссылается защищенное поле в абстрактном классе).

Таким образом, у вас будет один тестовый класс на конкретный экземпляр, и они просто предоставят новый экземплярпроверить против.Абстрактный класс теста, из которого они получены, предоставляет все тесты.Когда вы создаете новый конкретный тип, вам просто нужен новый конкретный тестовый класс для создания экземпляра этого класса.

...