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接口不再准确。