我正在使用 TestNG 进行测试。在某些测试中,会生成测试数据,因此在
afterMethod
中我正在检查是否生成了额外的数据。如果是这样我就删除它。但有时出于某种原因,数据删除请求不会返回成功的响应,并且我遇到了异常。在这种情况下,课堂上所有接下来的测试用例都将被跳过。如果AfterMethod
中出现一些异常,有没有办法不跳过课堂上的剩余测试?或者是否可以重新运行跳过的测试?
@AfterMethod(alwaysRun = true)
public void clearData() throws Exception {
throw new Exception();
}
@Test
public void testOne() {
//Do something
}
@Test
public void testTwo() {
//Do something
}
try-catch
将是最好的解决方案,因为方法生成的任何异常都应由该方法而不是 testng
框架处理。
@AfterMethod
public void clearData() throws Exception {
try{
// do something....
} catch(Exception e) {
// do nothing....
}
}
但是可以通过一些变通方法(很长的一个!)来重新运行跳过的测试。 (注意:我仍然建议使用
try-catch
方法)。
创建一个
AfterSuite
方法,并将 alwaysRun
设置为 true
。
public class YourTestClass {
private static int counter = 5; //desired number of maximum retries
// all your current code.......
@AfterSuite(alwaysRun = true)
public void afterSuite(ITestContext ctx) {
IResultMap skippedTests = ctx.getSkippedTests();
while(skippedTests.size() > 0 && (counter--) > 0) {
List<XmlInclude> includeMethods
= skippedTests.getAllMethods()
.stream()
.map(m -> new XmlInclude(m.getMethodName()))
.collect(Collectors.toList());
XmlClass xmlClass = new XmlClass(this.getClass().getName());
xmlClass.setIncludedMethods(includeMethods);
XmlTest test = ctx.getCurrentXmlTest();
List<XmlClass> classes = test.getXmlClasses();
classes.remove(0);
classes.add(xmlClass);
TestRunner newRunner = new TestRunner(new Configuration(),
ctx.getSuite(),
test,
false,
null,
new ArrayList<>());
newRunner.run();
Set<String> newPassed = newRunner.getPassedTests().getAllResults()
.stream()
.map(ITestResult::getName)
.collect(Collectors.toSet());
IResultMap passedTests = ctx.getPassedTests();
Iterator<ITestResult> iter = skippedTests.getAllResults().iterator();
while(iter.hasNext()) {
ITestResult result = iter.next();
if(newPassed.contains(result.getName())) {
result.setStatus(ITestResult.SUCCESS);
passedTests.addResult(result, result.getMethod());
//remove the test from list of skipped tests.
iter.remove();
}
}
}
}
}