当任何一个@BeforeMethod失败时,我想重新运行一个测试类,包括它的@Test。我已经实现了TestNG重试逻辑来重新运行失败的测试用例,但我想运行整个类。
发布于 2014-09-11 21:17:47
这样做是可能的。为此,您需要在testNg.xml中将org.testng.ITestListener的实现注册为侦听器
<listeners>
<listener class-name="com.xyar.OnTestFailureClass" />
</listenersOnTestFailureClass必须实现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)但是,为了避免将此属性添加到您的所有测试方法中,请使用此链接“”引用的以下方法。
@BeforeSuite(alwaysRun = true)
public void beforeSuite(ITestContext context) {
for (ITestNGMethod method : context.getAllTestMethods()) {
method.setRetryAnalyzer(new RetryAnalyzerImpl());
}
}这将有望为您提供testng- report ts.xml报告。
发布于 2014-09-11 15:53:33
请看一下: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>https://stackoverflow.com/questions/25781098
复制相似问题