下面简单介绍下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); } }
以上,完全实现了失败用例的重跑机制。