我想重新运行一个包含@BeforeMethod的测试类,当它的任何一个@Test失败时.我已经实现了TestNG重试逻辑来重新运行失败的测试用例,但我想运行整个类. 有可能这样做. 为此,您需要在testNg.xml中
为此,您需要在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)
但是,要避免将此属性添加到所有测试方法中
采取此链接引用的以下方法
‘TestNG retryAnalyzer only works when defined in methods @Test, does not work in class’ @Test‘
@BeforeSuite(alwaysRun = true) public void beforeSuite(ITestContext context) { for (ITestNGMethod method : context.getAllTestMethods()) { method.setRetryAnalyzer(new RetryAnalyzerImpl()); } }
这应该有希望为您提供testng-results.xml报告.