Вопрос направлен на то, чтобы найти лучшее решение, чем мое.
У меня есть следующие ТРЕБОВАНИЯ для моих интеграционных тестов:
- Каждый интеграционный тест реализован в одном тестовом классе.
- Методы в тестовом классе должны выполняться по порядку.
- Каждый метод является одним из этапов интеграционного/функционального тестирования.
- Если тестовый метод терпит неудачу, все другие тестовые методы в тестовом классе должны быть пропущены, потому что нет смысла искать последующие ошибки.
МОЕ РЕШЕНИЕ выглядит так:
Я просто наследую каждый тестовый класс от моего абстрактного тестового класса:
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 поддерживает все мои требования и отлично работает. Мне больше не нужен мой клей-код!
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