如何在 testNG 中重新运行跳过的测试?

问题描述 投票:0回答:2

我正在使用 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
}
java testng
2个回答
1
投票

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();
                }
            }     
        }
    }
}

0
投票

https://stackoverflow.com/a/68281350/24931040

上述解决方案(Aftersuite方法)对我不起作用。

测试忽略错误

© www.soinside.com 2019 - 2024. All rights reserved.