Я использую JUnit 4.10 для запуска наборов тестов и реализовал правило «повторить неудачный тест» в соответствии с удивительными заметками Мэтью Фаруэлла в Как немедленно повторно запустить неудачные тесты JUnit? пост. Я создал класс "RetryTestRule" со следующим кодом:
public class RetryTestRule implements TestRule {
private final int retryCount;
public RetryTestRule(int retryCount) {
this.retryCount = retryCount;
}
@Override
public Statement apply(Statement base, Description description) {
return statement(base, description);
}
private Statement statement(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
Throwable caughtThrowable = null;
// retry logic
for (int i = 0; i < retryCount; i++) {
try {
base.evaluate();
return;
} catch (Throwable t) {
caughtThrowable = t;
System.err.println(description.getDisplayName() + ": run " + (i + 1) + " failed");
}
}
System.err.println(description.getDisplayName() + ": Giving up after " + retryCount
+ " failures");
throw caughtThrowable;
}
};
}
}
При использовании этого, как правило, внутри тестового случая он работает отлично, но кажется неоптимальным использовать нотацию @Rule в каждом тестовом случае набора вместо одной нотации в определении Suite, поэтому после небольшой проверки я попробовал новую нотацию @ClassRule в моем классе Suite:
@RunWith(Suite.class)
@SuiteClasses({
UserRegistrationTest.class,
WebLoginTest.class
})
public class UserSuite {
@ClassRule
public static RetryTestRule retry = new RetryTestRule(2);
}
Проблема в том, что это не работает так, как ожидалось: неудачные тесты не повторяются. Кто-нибудь пробовал это и знает решение? Очень ценим помощь!