Функциональный/интеграционный тест веб-сервиса с Junit

Вопрос направлен на то, чтобы найти лучшее решение, чем мое.

У меня есть следующие ТРЕБОВАНИЯ для моих интеграционных тестов:

  1. Каждый интеграционный тест реализован в одном тестовом классе.
  2. Методы в тестовом классе должны выполняться по порядку.
  3. Каждый метод является одним из этапов интеграционного/функционального тестирования.
  4. Если тестовый метод терпит неудачу, все другие тестовые методы в тестовом классе должны быть пропущены, потому что нет смысла искать последующие ошибки.

МОЕ РЕШЕНИЕ выглядит так:

Я просто наследую каждый тестовый класс от моего абстрактного тестового класса:

package myPackage;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.junit.Before;
import org.junit.Rule;
import org.junit.rules.TestWatcher;

public abstract class FailFastTest {

    private final static List<Class<?>> FAILED_CLASSES = new CopyOnWriteArrayList<Class<?>>() ;

    private final Class<? extends FailFastTest> thatClass = this.getClass();

    @Rule
    public final TestWatcher onFailedRule = new TestWatcher() {
        protected void failed(Throwable e, org.junit.runner.Description description) {
            FAILED_CLASSES.add(thatClass);
        };
    };

    @Before
    public final void beforeMethod() {
        final boolean failed = FAILED_CLASSES.contains(thatClass);

        if(failed) {
            System.out.println(thatClass + " FAILED. Aborting test.");
            org.junit.Assume.assumeTrue(!failed);
        }
     }
}

У кого-нибудь есть идея получше? Моя ПРОБЛЕМА: я не могу запустить такой тестовый класс несколько раз параллельно, потому что имя класса сигнализирует о пропуске...

НЕТ! Это не дубликат! Я стараюсь писать функциональные тесты, которые используют разные (веб-)сервисы в определенном порядке. Вопрос "Как протестировать сервлет?" совсем другое!

Так или иначе. Я перешел на TestNG. TestNG поддерживает все мои требования и отлично работает. Мне больше не нужен мой клей-код!


person eventhorizon    schedule 27.08.2015    source источник
comment
Не могли бы вы использовать TestNG? Это позволяет заказывать тесты, упрощая вам достижение того, что вы ищете.   -  person manish    schedule 27.08.2015
comment
@manish: у меня была та же идея (переход на TestNG, но я пока не нашел хороших примеров для своих требований. Может быть, я слишком туп, чтобы использовать Google :-) Если у вас есть хорошая документация для функционального тестирования веб-сервисов с помощью TestNG, это Было бы очень любезно с вашей стороны рассказать мне о них ;-)   -  person eventhorizon    schedule 27.08.2015
comment
Я думаю, что вам больше всего нужен способ заказывать тесты и пропускать тесты, если какие-либо предыдущие не пройдены. Порядок — это просто добавление priority к @Test. @Test(priority = 1) будет выполняться перед @Test(priority = 2) и так далее. Пропуск — это добавление dependsOnMethods к @Test. @Test(priority = 1) public void first() {}, @Test(priority = 2, dependsOnMethod="first") public void second() {} гарантируют, что second будет запущен только в случае успеха first. Вы можете просто пропустить использование priority, если используете только dependsOnMethod.   -  person manish    schedule 27.08.2015
comment
возможный дубликат Как выполнить модульное тестирование сервлета?   -  person Raedwald    schedule 27.08.2015
comment
@Raedwald: ИМХО, это не дубликат. Первоначальный вопрос совсем другой, и решение тоже будет другим.   -  person eventhorizon    schedule 27.08.2015
comment
@manish: СПАСИБО! Я попробую это. Как насчет параллельного тестирования разных тестовых классов?   -  person eventhorizon    schedule 27.08.2015
comment
официальная документация по TestNG достаточно обширна и охватывает все, что вам нужно для запуска тесты параллельно.   -  person manish    schedule 27.08.2015
comment
СПАСИБО! С этого момента используйте TestNG :-)   -  person eventhorizon    schedule 27.08.2015