java+selenium+testng(三)用例失败重试机制

在我们执行自动化的过程中,会有这么一种情况:用例及功能本身没问题,因为网络突然中断或者其他外界因素,导致本可以执行成功的用例也被记录为失败。

所以,我们在自动化脚本中加入了用例失败重试机制,依靠监听用例执行的结果,进行重复执行,并且只会记录一次结果。

 

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;
 }

 

posted @ 2020-07-23 11:07  小町  阅读(859)  评论(0编辑  收藏  举报