TestNG retryAnalyzer only works when defined in me

2019-02-15 15:37发布

问题:

This works as supposed, test fails (due to haltTesting()) and is repeated 2x

public class A0001_A0003Test extends TestControl {

    private Kunde kunde = Kunde.FR_WEHLITZ;

    @Test(retryAnalyzer = TestRepeat.class, groups = {TestGroups.FAILED}, description = "verify adress")
    public void testkundenDaten_Angaben() throws Exception {
        bifiTestInitial();
        testActions.selectKunde(kunde);
        haltTesting();
    }
} 

but because i have multiple tests in one class, i defined the repeatAnalyzer on class level

@Test(retryAnalyzer = TestRepeat.class)
public class A0001_A0003Test extends TestControl {

    private Kunde kunde = Kunde.FR_WEHLITZ;

    @Test(groups = {TestGroups.FAILED}, description = "verify adress")
    public void testkundenDaten_Angaben() throws Exception {
        bifiTestInitial();
        testActions.selectKunde(kunde);
        haltTesting();
    }
} 

but then the test is not repeated, the documentation says:

The effect of a class level @Test annotation is to make all the public methods of this class to become test methods even if they are not annotated. You can still repeat the @Test annotation on a method if you want to add certain attributes.

So it should have been possible or am I expecting the wrong outcome?

回答1:

You can implement IAnnotationTransformer listener and register listener cmd line or in config file or at class level.

public class MyAnnotationTransformer implements
        IAnnotationTransformer {
    @Override
public void transform(ITestAnnotation testAnnotation, Class clazz, Constructor testConstructor,
        Method method) {
            testAnnotation.setRetryAnalyzer(TestRepeat.class);
}
...
}

To register at class level:

@Listeners(value=MyAnnotationTransformer.class)
public class A0001_A0003Test extends TestControl {
...
}


回答2:

My solution was to set a retryAnalyzer for all methods in the @BeforeSuite method. But do not set it in beforeMethod because then it will be re-created each invocation with a new counter => endless loop.

@BeforeSuite(alwaysRun = true)
public void beforeSuite(ITestContext context) {
     TestRepeat testRepeat = new TestRepeat();
     for (ITestNGMethod method : context.getAllTestMethods()) {
         method.setRetryAnalyzer(testRepeat);
     }
}