下面简单介绍下testNG的失败重跑的实现方法:

1.首先编写一个类,实现IRetryAnalyzer类,重写其中的retry方法。

public class TestNGRetry implements IRetryAnalyzer {

    private int retryCount = 1;//设置当前的重跑次数
    private static final int maxRetryCount = 3;//设置最大重跑次数,定义为常量。

    @Override
    public boolean retry(ITestResult iTestResult) {
        if (retryCount<=maxRetryCount){
            System.out.println("it's the "+retryCount+"times retry.And the current case is"+iTestResult.getName());//输出当前的重跑次数以及当前的正在重跑的用例名称。

            retryCount++;//重跑之后,次数+1
            return true;//当return true之后,代表继续重跑
        }
        return false;//return false之后,代表停止重跑
    }

    public void reSetCount(){
        retryCount=1;
    }

}

在完成这个方法的重写之后,其实已经可以实现失败用例重跑了。前提是,用例上注解设置如下:

@Test(retryAnalyzer= TestNGRetry.class)
当然,我们是期望所有的用例执行失败之后,都可以重跑,所以就需要考虑执行时动态修改我们用例的注解。testNG已经给实现了,我们只
需要编写一个类去实现IAnnotationTransformer,并重写方法transform
public class RetryListener implements IAnnotationTransformer {
    @Override
    public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
        IRetryAnalyzer retryAnalyzer = iTestAnnotation.getRetryAnalyzer();//获取到retryAnalyzer的注解
if (retryAnalyzer == null){ iTestAnnotation.setRetryAnalyzer(TestNGRetry.class); } } }//如果注解为空,则动态设置注解,以确保用例失败后重跑。
在testNG的xml配置文件中配置上述监听器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="NeuronIOSSystemTest" parallel="true"
    thread-count="2">
    <listeners>
        <listener
            class-name="com.neuron.util.TestRunnerListener" />
        <listener class-name="com.nervos.neuron.retry.RetryListener"/>
    </listeners>

    <test verbose="2" name="Neuron iOS App System Test"
        preserve-order="true" enabled="true">
        <classes>
            <class name="com.xxx.xxx.xxxTest" />

        </classes>
    </test>
</suite>

综上,失败用例重跑机制基本实现。但是在执行的时候,会发现一个问题:

使用了dataProvider并且提供多个数据的时候,这个重跑次数是共用的,就会导致dataProvider提供的第一个数据执行失败后,重跑3次。如果提供的第二个数据再次失败了,就不会再重跑了。

或者dataProvider提供的第一个数据执行失败后,重跑第一次的时候又成功了。提供的第二个数据再次失败了,就只重跑2次。

所以,在用例执行失败和用例执行成功后,都需要重置当前的重跑次数。

public class TestRunnerListener extends TestListenerAdapter {
    @Override
    public void onTestSuccess(ITestResult tr) {
        TestNGRetry retryAnalyzer = (TestNGRetry) tr.getMethod().getRetryAnalyzer();
        retryAnalyzer.reSetCount();
        finish(tr);
    }


    @Override
    public void onTestFailure(ITestResult tr) {
     TestNGRetry retryAnalyzer = (TestNGRetry) tr.getMethod().getRetryAnalyzer();
        retryAnalyzer.reSetCount();
        finish(tr);
    }
}

以上,完全实现了失败用例的重跑机制。




01-04 03:10