Ответ 1
Что случилось с вызовом System.exit()
?
У меня есть набор тестов JUnit в форме:
@RunWith(Suite.class)
@Suite.SuiteClasses( { xx.class, yy.cass })
public class AllTests {
public static Test suite() {
TestSuite suite = new TestSuite(AllTests.class.getName());
//$JUnit-BEGIN$
//$JUnit-END$
return suite;
}
}
Затем он вызывает тесты ванили:
public class xxx {
@Test
public void test () throws {
...
У меня есть ситуация, когда я хочу остановить оставшуюся часть тестового набора, если в первом тесте произошла ошибка или сбой. Но ошибки/сбои в других - все в порядке, и набор должен заполнить как можно больше других тестов. В основном первый провал теста указывает на то, что безопасно запускать остальные.
Возможно ли это?
Что случилось с вызовом System.exit()
?
Сначала вам нужен junit RunListener:
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;
public class FailureListener extends RunListener {
private RunNotifier runNotifier;
public FailureListener(RunNotifier runNotifier) {
super();
this.runNotifier=runNotifier;
}
@Override
public void testFailure(Failure failure) throws Exception {
super.testFailure(failure);
this.runNotifier.pleaseStop();
}
}
Затем подготовьте пакет:
public class StopOnFailureSuite extends Suite {
public StopOnFailureSuite(Class<?> klass, Class<?>[] suiteClasses) throws InitializationError {
super(klass, suiteClasses);
}
public StopOnFailureSuite(Class<?> klass) throws InitializationError {
super(klass, klass.getAnnotation(SuiteClasses.class).value());
}
@Override
public void run(RunNotifier runNotifier) {
runNotifier.addListener(new FailureListener(runNotifier));
super.run(runNotifier);
}
}
И запустите свой пакет:
@RunWith(StopOnFailureSuite.class)
@Suite.SuiteClasses({
FirstTestClass.class,
SecondTestClass.class,
...
})
Если это первый тест, попробуйте переместить его проверку на @BeforeClass и выбросить исключение, если оно не выполнено. Тогда в этом случае будет выполняться только метод @AfterClass.
Конечно, таким образом вам не хватает всех артефактов артефактов, созданных в методах (установках) тестирования.
На основе ответа от Hiro2k (спасибо!) я использовал следующее решение. Это немного хак, но он работает.
Тест, который может предотвратить запуск других тестов, находится в верхней части списка @Suite.SuiteClasses. Затем этот тест имеет следующее:
private static boolean shouldStopRestOfSuite = false;
@Test
public void test () throws Throwable {
try {
... run some test code...
}
catch (Throwable e) {
shouldStopRestOfSuite = true;
throw e;
}
}
Обратите внимание, что вышеприведенное значение необходимо уловить Throwable (не исключение), чтобы оно ловило ошибки утверждения. Он также перебрасывает ошибку, поэтому он регистрируется JUnit для анализа.
Тогда есть еще один тестовый метод:
@Test
public void testKillIfNeeded () throws Exception {
if (!shouldStopRestOfSuite) {
return;
}
System.out.println ("Test suite killed due to dangerous error / failure");
System.exit(1);
}
Вышеуказанное выполняется вторым и уничтожит процесс JUnit.
Используя этот метод, JUnit-тест не завершится с ошибкой/ошибкой, если проблема не выполнена, но ошибка/ошибка регистрируется для анализа JUnit и дальнейшие тесты не будут выполняться.
Не слишком красиво, но он выполняет эту работу:)
Как и ваш ответ, но используя @Before
в тесте интеграции, я сделал что-то вроде этого:
public class FooTest {
private static boolean bar;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
bar = false;
}
@Before
public void setUp() throws Exception {
assertTrue(bar);
}
@Test
public void test() {
System.out.println("something");
assertTrue(true);
}
@Test
public void test1() {
System.out.println("Something2");
assertTrue(true);
}
}
Привет!
Во-первых, вы должны поймать ошибку и проверить ее до запуска второго теста.
@Rule
public ErrorCollector collector = new ErrorCollector();
1. Добавить ошибку.
collector.addError(new Throwable("first thing went wrong"));
2. Проверьте перед зависимым прогоном.
collector.checkThat(getResult(), not(containsString("ERROR!")));
Ссылка - ErrorCollector
Выполняете ли вы тесты с помощью ant?
Вы можете написать собственный тестовый прослушиватель. Вы можете установить это в ant http://ant.apache.org/manual/Tasks/junit.html (enableTestListenerEvents).