TestNG重试类不运行@BeforeClass或@AfterClass方法

时间:2016-07-29 19:57:37

标签: java testng

我有这样的测试:

public class Test1 extends AbstractTest {

    @Test(retryAnalyzer=Retry.class)
    public void test(){
        System.out.println(this.getClass().getName() + " running.");
        Assert.fail();
    }

}

使用这样的设置和拆解方法:

public class AbstractTest {

    @BeforeClass(alwaysRun = true)
    public void setup() {
        System.out.println(this.getClass().getName() + " initialized");
    }

    @AfterClass(alwaysRun = true)
    public void tearDown(){
        System.out.println(this.getClass().getName() + " complete");
    }

}

这样的重试类:

public class Retry implements IRetryAnalyzer {

    private int retryCount = 0;
    private int maxRetryCount = 1;

    public boolean retry(ITestResult result) {
        if (retryCount < maxRetryCount) {
            retryCount++;
            return true;
        }
        return false;
    }

}

但是尽管将alwaysRun设置为true,但setup和tearDown方法在测试方法之前和之后都没有运行。这是一些控制台输出:

tests.Test1 initialized
tests.Test1 running.
tests.Test1 running.
tests.Test1 complete

这是为什么?如何在每次测试重试时让它们运行?

3 个答案:

答案 0 :(得分:2)

此行为符合设计。

  

@BeforeClass:在调用当前类中的第一个测试方法之前,将运行带注释的方法。

  • 如果是setup,则会打印初始化
  • setup将永远不会再次运行,直到重新加载同一个类才能执行。
  

@AfterClass:在已经运行当前类中的所有测试方法之后,将运行带注释的方法。

  • 在您的情况下,它是tearDown,它将在所有测试方法(包括当前类中的所有重试尝试)都已运行并且打印完成之后运行。

注意:如果必须重试测试方法,则retry(ITestResult result)返回,否则返回false。因此,是否必须重试测试方法将受retry方法的约束。 @BeforeClass@AfterClass的行为保持不变。

希望这澄清。

答案 1 :(得分:0)

注释 org.testng.annotations.BeforeMethodorg.testng.annotations.AfterMethod将按您的要求运行 - 换句话说,在每次调用测试方法之前运行设置和拆除代码,无论它是否是由重试触发。

@BeforeMethod@AfterMethod的TestNG javadoc中的完整文档。

答案 2 :(得分:0)

截至目前,TestNG不支持重试配置方法(例如beforeMethod,beforeTest等。)https://github.com/cbeust/testng/issues/1444

如果配置方法失败,则测试将跳过/失败。

您可以使用一些逻辑在@BeforeMethod或@BeforeTest中重试您的代码。

int count = 0;
int maxTries = 3;

@BeforeMethod
public void beforeMethod(){
while(true) {
try {
// Some Code
// break out of loop, or return, on success
} catch (SomeException e) {
// handle exception
if (++count == maxTries) throw e;
}
}
}