Sto utilizzando JUnit 4.10 per l'esecuzione di test suite e ho implementato una regola "riprova tentativo fallito" seguendo le fantastiche note di Matthew Farwell nel post How to Re-run failed JUnit tests immediately?. Ho creato una classe "RetryTestRule" con il seguente codice:Come applicare una JUnit @Rule per tutti i casi di test in una suite
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;
}
};
}
}
Quando si utilizza questo come regola all'interno di un banco di prova funziona perfettamente, ma non sembra ottimale per utilizzare la notazione @Rule in ogni caso di test di un suite invece di una singola annotazione nella definizione Suite, così dopo aver controllato un po 'ho provato la nuova notazione @ClassRule nella mia classe Suite:
@RunWith(Suite.class)
@SuiteClasses({
UserRegistrationTest.class,
WebLoginTest.class
})
public class UserSuite {
@ClassRule
public static RetryTestRule retry = new RetryTestRule(2);
}
il problema è che questo non funziona come previsto: superato i test non vengono riprovate . Qualcuno ha provato questo e conosce una soluzione? L'aiuto è molto apprezzato!
Potrebbe essere un duplicato: http://stackoverflow.com/questions/7639353/how-to-define-junit-method-rule-in-a-suite – pholser
Non lo trovi affatto preoccuparti che la tua unità i test falliscono casualmente? – Tobb