• 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;
     }
  • 相关阅读:
    管理心理学[9095]
    汽车文化[1196]
    小四轴——空心杯电机引起的电源干扰
    38 时序电路扩展2
    37 时序电路扩展1
    36 时序电路的动态特性分析2
    35 时序电路的动态特性分析1
    34 同步时序电路的设计方法2
    33 同步时序电路的设计方法1
    60. 第k个排列
  • 原文地址:https://www.cnblogs.com/x495122903/p/13365152.html
Copyright © 2020-2023  润新知