zoukankan      html  css  js  c++  java
  • TestNG 中失败用例重跑机制

    1、首先编写Java类实现IRetryAnalyzer接口

    public class OverrideRetry implements IRetryAnalyzer {
    private int count = 1;
    private int max_count = 3;

    @Override
    public boolean retry(ITestResult result) {
    System.out.println("执行用例:"+result.getName()+",第"+count+"次失败");
    if (count < max_count) {
    count++;
    return true;
    }
    return false;
    }
    }

    2.编写重跑监听

    public class RetryListener implements IAnnotationTransformer {

    public void transform(ITestAnnotation annotation, Class testClass,Constructor testConstructor, Method testMethod) {

    IRetryAnalyzer retry = annotation.getRetryAnalyzer();
    if (retry == null) {
    annotation.setRetryAnalyzer(OverrideRetry .class);  // 这个类名一定要和上方的对上

    }
    }
    }

    testng.xml中加一个监听

       

    <listeners>
    <listener class-name="com.traapi.request.Teacher.RetryListener ">
    </listener>
    </listeners>
    <test name="test">
    <classes>
    <class name="com.traapi.request.Teacher.RetryTest">
    <methods>
    <include name="test1"/>
    <include name="test2"/>
    </methods>
    </class>
    </classes>
    </test>

    已上 就 可以 实现失败重跑了,但是,用例重跑之后,失败的结果也记录在运行结果中了,测试结果中运行的用例数增加了,不利于我们查看测试结果。因此,我们还需要把重复的用例去掉。 

    解决办法就是重写onFinish

       

    public class TestngListener extends TestListenerAdapter {
        private static Logger logger = Logger.getLogger(TestngListener.class);

    @Override
    public void onTestFailure(ITestResult tr) {
    super.onTestFailure(tr);
    logger.info(tr.getName() + " Failure");
    }

    @Override
    public void onTestSkipped(ITestResult tr) {
    super.onTestSkipped(tr);
    logger.info(tr.getName() + " Skipped");
    }

    @Override
    public void onTestSuccess(ITestResult tr) {
    super.onTestSuccess(tr);
    logger.info(tr.getName() + " Success");
    }

    @Override
    public void onTestStart(ITestResult tr) {
    super.onTestStart(tr);
    logger.info(tr.getName() + " Start");
    }

    @Override
    public void onFinish(ITestContext testContext) {
    super.onFinish(testContext);
    Iterator<ITestResult> listOfFailedTests = testContext.getFailedTests().getAllResults().iterator();
    while (listOfFailedTests.hasNext()) {
    ITestResult failedTest = (ITestResult) listOfFailedTests.next();
    ITestNGMethod method = failedTest.getMethod();
    if (testContext.getFailedTests().getResults(method).size() > 1) {
    listOfFailedTests.remove();
    } else {
    if (testContext.getPassedTests().getResults(method).size() > 0) {
    listOfFailedTests.remove();
    }

    }
    }
    }
    }

    重新添加监听

    <suite name="Suite1" verbose="1">
    <test name="CheckName">
    <classes>
    <class name="com.luray.testsuite.CheckStockList" />
    </classes>
    </test>
    <listeners>
    <listener class-name="com.luray.testngsetting.RetryListener" />
    <listener class-name="com.luray.testngsetting.TestngListener" />
    <listener class-name="org.uncommons.reportng.HTMLReporter" />
    <listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
    </listeners>

    </suite>

    这次就只记录最后一次结果了

    Ok  了

  • 相关阅读:
    LeetCode 258. Add Digits
    LeetCode 257. Binary Tree Paths
    LeetCode 周赛 184
    js算法初窥05(算法模式02-动态规划与贪心算法)
    js算法初窥04(算法模式01-递归)
    js算法初窥03(搜索及去重算法)
    js算法初窥02(排序算法02-归并、快速以及堆排序)
    js算法初窥01(排序算法01-冒泡、选择、插入)
    用js来实现那些数据结构16(图02-图的遍历)
    用js来实现那些数据结构15(图01)
  • 原文地址:https://www.cnblogs.com/lixiaowei395659729/p/8745051.html
Copyright © 2011-2022 走看看