TestNG的retryAnalyzer只在@Test方法中定义时起作用,不适用于类中的@Test方法。

5

这个工作正常,测试失败(由于haltTesting()),并且会重复2次。

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();
    }
} 

但是因为我在一个类中有多个测试,所以我将repeatAnalyzer定义在类级别上。

@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();
    }
} 

但是测试没有重复,文档说:

类级别的@Test注释的效果是使此类的所有公共方法成为测试方法,即使它们没有被注释也一样。如果您想添加某些属性,仍然可以在方法上重复使用@Test注释。

所以应该是可能的,还是我的期望不正确?


类级别的@Test注解的作用是使得该类中所有公共方法都成为测试方法,即使它们没有被注释。这应该在@Test和retryAnalyzer()的javadoc中进行说明。 - Anderson
2个回答

2

我的解决方案是在@BeforeSuite方法中为所有方法设置一个retryAnalyzer。 但不要在beforeMethod中设置它,因为那样每次调用都会重新创建一个新的计数器=>无限循环。

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

你为什么要为每个方法实例化一个新的TestRepeat类,还是使用一个单一对象代替所有方法更好呢?(也就是说,使用单例模式或者在for循环之前创建一个新的TestRepeat()对象) - RockMeetHardplace
TestRepeat 实现了 IRetryAnalyzer 接口,但是在 NetBeans 中使用 method.setRetryAnalyzer(TestRepeat.class); 会出现错误(我不是 Java 专家 :/),错误信息为 incompatible Types Class<TestRepeat> cannot be converted to IRetryAnalyzer - MushyPeas

1
你可以实现IAnnotationTransformer监听器,并在命令行、配置文件或类级别注册监听器。
public class MyAnnotationTransformer implements
        IAnnotationTransformer {
    @Override
public void transform(ITestAnnotation testAnnotation, Class clazz, Constructor testConstructor,
        Method method) {
            testAnnotation.setRetryAnalyzer(TestRepeat.class);
}
...
}

注册课程级别:

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

我认为这篇博客文章和上面的答案一样值得更多的关注。https://www.swtestacademy.com/retry-failed-tests-testng-iretryanalyzer/ - Changgull Song

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接