在我们执行自动化的过程中,会有这么一种情况:用例及功能本身没问题,因为网络突然中断或者其他外界因素,导致本可以执行成功的用例也被记录为失败。
所以,我们在自动化脚本中加入了用例失败重试机制,依靠监听用例执行的结果,进行重复执行,并且只会记录一次结果。
1、导入依赖
(备注:这里导入的testng要用比较新的版本(我用的是7.0.0),老版本有bug,在后续讲到的多线程重试的时候会混乱执行)
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.0.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-java-commons</artifactId> <version>2.12.1</version> <scope>test</scope> </dependency>
<build> <plugins> <plugin> <!-- maven-surefire-plugin 配合testng/junit执行测试用例的maven插件 --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> <configuration> <!-- 测试失败后,是否忽略并继续测试 --> <testFailureIgnore>true</testFailureIgnore> <suiteXmlFiles> <!-- testng配置文件名称 --> <suiteXmlFile>testng.xml</suiteXmlFile> </suiteXmlFiles> <!--设置参数命令行 --> <argLine> <!-- UTF-8编码 --> -Dfile.encoding=UTF-8 <!-- 配置拦截器 --> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> <systemProperties> <property> <!-- 配置 allure 结果存储路径 --> <name>allure.results.directory</name> <value>${project.build.directory}/allure-results</value> </property> </systemProperties> </configuration> <dependencies> <!-- aspectjweaver maven坐标 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <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; }