Java TestNG重试类没有';t运行@BeforeClass或@AfterClass方法

Java TestNG重试类没有';t运行@BeforeClass或@AfterClass方法,java,testng,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 {

我有一个这样的测试:

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

}
使用如下设置和拆卸方法:

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

}
还有一个重试类,如下所示:

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

}

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

此行为符合设计要求

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

  • 如果是
    设置
    ,它将打印初始化
  • 安装程序
    将永远不会再次运行,直到重新加载相同的类以供执行
@AfterClass
:在运行当前类中的所有测试方法之后,将运行带注释的方法

  • 在您的情况下,它是
    tearDown
    ,它将在所有测试方法(包括当前类中的所有重试尝试)运行并打印完成后运行
注意:
重试(ITestResult result)
如果必须重试测试方法,则返回true,否则返回false。因此,测试方法是否必须重试将由
retry
方法控制。
@BeforeClass
@AfterClass
的行为保持不变


希望澄清。

此行为符合设计要求

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

  • 如果是
    设置
    ,它将打印初始化
  • 安装程序
    将永远不会再次运行,直到重新加载相同的类以供执行
@AfterClass
:在运行当前类中的所有测试方法之后,将运行带注释的方法

  • 在您的情况下,它是
    tearDown
    ,它将在所有测试方法(包括当前类中的所有重试尝试)运行并打印完成后运行
注意:
重试(ITestResult result)
如果必须重试测试方法,则返回true,否则返回false。因此,测试方法是否必须重试将由
retry
方法控制。
@BeforeClass
@AfterClass
的行为保持不变

希望这能澄清问题。

注释
org.testng.annotations.BeforeMethod
org.testng.annotations.AfterMethod
将按照您的要求运行—换句话说,在每次调用测试方法之前运行安装程序并分解代码,而不管它是否由重试触发

注释的完整文档在TestNG javadoc中
org.testng.annotations.BeforeMethod
org.testng.annotations.AfterMethod
将按照您的要求运行—换句话说,在每次调用测试方法之前运行安装程序并分解代码,而不管它是否由重试触发


TestNG javadoc中针对和的完整文档。

截至目前,TestNG不支持重试配置方法(例如BeforeThod、beforeTest等)

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

您可以使用一些逻辑在@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;
}
}
}

到目前为止,TestNG不支持配置方法的重试(例如beforeMethod、beforeTest等)

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

您可以使用一些逻辑在@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;
}
}
}

您描述的是testng应该如何工作。为什么需要它?您描述的是testng应该如何工作。你为什么需要它?使用“BeforeMethod”和“AfterMethod”正是我所需要的。非常感谢。使用“BeforeMethod”和“AfterMethod”会按照我需要的方式工作。非常感谢。使用IConfigurable接口不再准确。使用IConfigurable接口不再准确。