我有这样的测试:
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
这是为什么?如何在每次测试重试时让它们运行?
答案 0 :(得分:2)
此行为符合设计。
@BeforeClass
:在调用当前类中的第一个测试方法之前,将运行带注释的方法。
setup
,则会打印初始化。setup
将永远不会再次运行,直到重新加载同一个类才能执行。
@AfterClass
:在已经运行当前类中的所有测试方法之后,将运行带注释的方法。
tearDown
,它将在所有测试方法(包括当前类中的所有重试尝试)都已运行并且打印完成之后运行。注意:如果必须重试测试方法,则retry(ITestResult result)
返回,否则返回false。因此,是否必须重试测试方法将受retry
方法的约束。 @BeforeClass
和@AfterClass
的行为保持不变。
希望这澄清。
答案 1 :(得分:0)
注释
org.testng.annotations.BeforeMethod
和
org.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;
}
}
}