当其中任何一个@BeforeMethod
失败时,我想重新运行包含@Test
的测试类。我已经实现了TestNG重试逻辑来重新运行失败的测试用例,但我想运行整个类。
答案 0 :(得分:15)
可以这样做。 为此,您需要在testNg.xml中将org.testng.ITestListener的实现注册为侦听器
<listeners>
<listener class-name="com.xyar.OnTestFailureClass" />
</listeners
OnTestFailureClass
必须实施org.testng.ITestListener
。
按如下方式实施onTestFailure:
public void onTestFailure(ITestResult result) {
XmlSuite suite = new XmlSuite();
suite.setName("rerunFailedTestClasses");
XmlTest test = new XmlTest(suite);
test.setName(result.getTestName());
List<XmlClass> classes = new ArrayList<XmlClass>();
classes.add(result.getTestClass().getXmlClass());
test.setXmlClasses(classes) ;
List<XmlSuite> suites = new ArrayList<XmlSuite>();
suites.add(suite);
TestNG tng = new TestNG();
tng.setXmlSuites(suites);
tng.run();
}
<强>注意强>
你必须有充分的理由重新运行测试。当您确定第二次迭代将导致成功时,必须重新进行测试。
如果不是这种情况,那么您将进入一个无限循环,其中失败的测试将继续执行并失败。
此外,如果您想要无论测试结果如何都只运行测试用例n次,那么您必须在onTestFailure
方法中为计数器构建逻辑。
<强> ----------------------------- UPDATE -------------- ---------------------- 强>
发现了更优雅的解决方案 实现IRetryAnalyzer接口。此接口由TestNG提供,专门用于重试失败的测试。它提供了重试必须完成的次数。
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
public class RetryAnalyzerImpl implements IRetryAnalyzer{
private int retryCount = 0;
private int maxRetryCount = 3;
public boolean retry(ITestResult result) {
if(retryCount < maxRetryCount)
{
retryCount++;
return true;
}
return false;
}
}
您需要使用以下注释
@Test(retryAnalyzer=Retry.class)
但是,要避免将此属性添加到所有测试方法中 采取此链接引用的以下方法 &#39; TestNG retryAnalyzer only works when defined in methods @Test, does not work in class' @Test &#39;
@BeforeSuite(alwaysRun = true)
public void beforeSuite(ITestContext context) {
for (ITestNGMethod method : context.getAllTestMethods()) {
method.setRetryAnalyzer(new RetryAnalyzerImpl());
}
}
这应该有希望为您提供testng-results.xml报告。
答案 1 :(得分:2)
请看一下:http://testng.org/doc/documentation-main.html#rerunning所有失败的测试都包含在单独的xml套件中,可以重新运行。
<suite name="allSuites">
<suite-files>
<suite-file path="yourSuite.xml" />
<suite-file path="testng-failed.xml" />
...
</suite-files>
</suite>