java+selenium+testng(三)用例失败重试机制
在我们执行自动化的过程中,会有这么一种情况:用例及功能本身没问题,因为网络突然中断或者其他外界因素,导致本可以执行成功的用例也被记录为失败。
所以,我们在自动化脚本中加入了用例失败重试机制,依靠监听用例执行的结果,进行重复执行,并且只会记录一次结果。
1、导入依赖
(备注:这里导入的testng要用比较新的版本(我用的是7.0.0),老版本有bug,在后续讲到的多线程重试的时候会混乱执行)
org.testng testng 7.0.0 test io.qameta.allure allure-java-commons 2.12.1 test
<build> <plugins> <plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-surefire-pluginartifactId> <version>2.22.1version> <configuration> <testFailureIgnore>truetestFailureIgnore> <suiteXmlFiles> <suiteXmlFile>testng.xmlsuiteXmlFile> suiteXmlFiles> <argLine> -Dfile.encoding=UTF-8 -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" argLine> <systemProperties> <property> <name>allure.results.directoryname> <value>${project.build.directory}/allure-resultsvalue> property> systemProperties> configuration> <dependencies> <dependency> <groupId>org.aspectjgroupId> <artifactId>aspectjweaverartifactId> <version>${aspectj.version}version> dependency> dependencies> plugin> plugins> build>
2、设置用例失败重试的次数
实现IRetryAnalyzer接口的retry方法。
以代码为例,如果用例test01执行失败后,会进行重试1次,执行结果记录执行过1条用例,执行失败。
public class TestngRetry implements IRetryAnalyzer { // 最大重试次数限制 private int maxRetryCount = 1; // 当前正在重试次数 private int currentRetryCount = 0; private Logger logger = Logger.getLogger(TestngRetry.class); @Override public boolean retry(ITestResult result) { // retry返回true,执行重试机制,并且一直重试,所以判断需要重试的次数,分别返回 if (currentRetryCount < maxRetryCount) { logger.info("正在运行第【" + currentRetryCount + "】次"); currentRetryCount++; logger.info("即将运行第【" + currentRetryCount + "】次重试"); return true; } else { return false; } }
3、对要进行失败重置的用例方法添加testng注解
@Test(retryAnalyzer = TestngRetry.class) public void test() { System.out.println("test"); Assert.assertTrue(false, "test failed"); }
4、设置监听
<listeners> <listener class-name="com.listener.RetryListener"/> <listener class-name="com.listener.TestngListener"/> listeners>
5、在跑多条用例时,testng会有一个bug:所有用例会公用同一个重试次数。这里需要重写onTestSuccess和onTestFailure接口
public class TestngListener extends TestListenerAdapter{ @Override public void onTestSuccess(ITestResult tr) { super.onTestSuccess(tr); // 对于dataProvider的用例,每次成功后,重置Retry次数 TestngRetry retry = (TestngRetry) tr.getMethod().getRetryAnalyzer(); //retry.reSetCount(); } @Override public void onTestFailure(ITestResult tr) { super.onTestFailure(tr); // 对于dataProvider的用例,每次失败后,重置Retry次数 TestngRetry retry = (TestngRetry) tr.getMethod().getRetryAnalyzer(); retry.reSetCount(); } }
public void reSetCount() { currentRetryCount = 0; }