java - How to apply a JUnit @Rule for all test cases in a suite -
java - How to apply a JUnit @Rule for all test cases in a suite -
i using junit 4.10 running test suites, , have implemented "retry failed test" rule next matthew farwell's awesome notes in how re-run failed junit tests immediately? post. created class "retrytestrule" next code:
public class retrytestrule implements testrule { private final int retrycount; public retrytestrule(int retrycount) { this.retrycount = retrycount; } @override public statement apply(statement base, description description) { homecoming statement(base, description); } private statement statement(final statement base, final description description) { homecoming new statement() { @override public void evaluate() throws throwable { throwable caughtthrowable = null; // retry logic (int = 0; < retrycount; i++) { seek { base.evaluate(); return; } grab (throwable t) { caughtthrowable = t; system.err.println(description.getdisplayname() + ": run " + (i + 1) + " failed"); } } system.err.println(description.getdisplayname() + ": giving after " + retrycount + " failures"); throw caughtthrowable; } }; } }
when using rule within test case works perfectly, seems not optimal utilize @rule notation in every test case of suite instead of single notation in suite definition, after checking bit tried new @classrule notation in suite class:
@runwith(suite.class) @suiteclasses({ userregistrationtest.class, weblogintest.class }) public class usersuite { @classrule public static retrytestrule retry = new retrytestrule(2); }
problem not work expected: failed tests not beingness retried. have tried , knows solution? help much appreciated!
@classrule
s executed 1 time per class, not 1 time per method. have executed 1 time per method, need utilize @rule
doing, or follow reply how define junit method rule in suite?.
to reuse existing rule, can add together rule list of rules run, using runrules
class follows:
public class myrunner extends blockjunit4classrunner { public myrunner(class<?> klass) throws initializationerror { super(klass); } @override protected void runchild(final frameworkmethod method, runnotifier notifier) { description description= describechild(method); if (method.getannotation(ignore.class) != null) { notifier.firetestignored(description); } else { runrules runrules = new runrules(methodblock(method), arrays.aslist(new testrule[]{new retrytestrule(3)}), description); runleaf(runrules, description, notifier); } } }
this using illustration above answer. combine 2 answers more fine grained control, creating retrytestrule if there annotation on test example.
java junit junit4
Comments
Post a Comment