Я использую JUnit 4.10 для запуска тестовых наборов, и я применил правило «повторить попытку теста» после замечательных заметок Мэтью Фарвелла в сообщении How to Re-run failed JUnit tests immediately?. Я создал класс «RetryTestRule» со следующим кодом:Как применить JUnit @Rule для всех тестовых примеров в наборе
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 обозначения в каждом тестовом случае люкс вместо одной записи в определении сюиты, поэтому после проверки немного, я попробовал новое @ClassRule нотацию в моем классе люкса:
@RunWith(Suite.class)
@SuiteClasses({
UserRegistrationTest.class,
WebLoginTest.class
})
public class UserSuite {
@ClassRule
public static RetryTestRule retry = new RetryTestRule(2);
}
Проблема в том, это не работает, как ожидалось: потерпел неудачу испытание не повторено , Кто-нибудь пробовал это и знает решение? Помощь очень ценится!
Возможно, это будет дубликат: http://stackoverflow.com/questions/7639353/how-to-define-junit-method-rule-in-a-suite – pholser
Вы совсем не беспокоитесь о том, что ваш блок тесты прерываются случайным образом? – Tobb