美文网首页
web_auto用例失败重试

web_auto用例失败重试

作者: testerPM | 来源:发表于2020-02-15 17:32 被阅读0次

提高框架的稳定性:使用失败重试技术


image.png

TestNG失败重试机制:
step1:新建java类TestngRetry 实现RetryAnalyzer接口,复写retry方法


package com.lemon.listener;

import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;

/**
 * TestngRetry类实现IRetryAnalyzer接口,返回True(要重试),返回False(不重试)
 * 不能一直返回true,会陷入死循环,一直重试 retry()方法只有当用例执行失败的时候才会被执行到此方法(这是testng框架内部是实现的)
 * 
 * @author TF
 *
 */
public class TestngRetry implements IRetryAnalyzer {
    private int maxRetryCount = 2;// 最大重试次数
    private int retryCount = 0;// 重试次数统计

    @Override
    public boolean retry(ITestResult result) {
        if (retryCount < maxRetryCount) {
            retryCount++;
            return true;
        } else {
            return false;
        }

    }

}


step2: LoginCases测试类Test注解新增属性:retryAnalyzer=TestngRetry.class


/**
     * 反向用例1 未注册 2 账号或者 密码错误(区分大小写,密码长度与正确的密码长度少一位和多一位)
     */
    @Test(priority = 2,dataProviderClass=LoginDatas.class, dataProvider = "loginDatas01",retryAnalyzer=TestngRetry.class,description="反向用例1,未注册,账号或者密码错误")
    public void login_failure01(String mobilephone, String pwd, String msg) {
        // 1实例化LoginPage
        LoginPage loginPage = new LoginPage();// 调用有参够造
        // 2输入手机号
        loginPage.inputMobilephone(mobilephone);
        // 3输入密码
        loginPage.inputPassword(pwd);
        // 4点击登录
        loginPage.clickLoginButton();
        // 5 断言 loginPage.getMsgText() 对象点方法 获取提示信息文本值
        String actualValue = loginPage.getMsgText();
        String expectedValue = msg;// 获取元素的文本的值
        Assert.assertEquals(actualValue, expectedValue);

    }


运行LoginCase,检查是否可以重试---是可以重试的
执行LoginCases,当存在用例执行失败时,会执行retry()方法(即失败的用例会再次重新被执行,当执行次数大于2,此用例还未主执行通过,就不再继续执行此用例,继续执行后续未执行的用例

那么问题是:login_failure01()方法存在用例执行失败,可以被重新执行,那其他测试方法也需要重试怎么办?
方法1:需要重试的方法,注解上都加retryAnalyzer=TestngRetry.class
方法2:配置全局变量---配置监听

-----------------------------------重试监听器配置如下----------------------------------------------

step3:新建RetryListener类implements 实现IAnnotationTransformer 接口,重写transform方法


package com.lemon.listener;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation;

/**
 * 新建RetryListener类implements 实现IAnnotationTransformer 接口,重写transform方法
 * Testng运行时可以动态修改(增加)Test注解对应的属性(retryAnalyzer=TestngRetry.class)
 * 
 * @author TF
 *
 */
public class RetryListener implements IAnnotationTransformer {

    @Override
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
        // 1.获取注解属性IRetryAnalyzer对象
        IRetryAnalyzer retryAnalyzer = annotation.getRetryAnalyzer();
        // 2.判断retryAnalyzer属性是否有值,如果没有,就增加retryAnalyzer=TestngRetry.class
        if (retryAnalyzer == null) {
            annotation.setRetryAnalyzer(TestngRetry.class);
        }
    }

}


step4:step3监听默认是没有生效的,所以需要配置监听器
在testng.xml配置文件中添加RetryListener监听器即可

<listeners>
        <listener class-name="com.lemon.listener.RetryListener"/>
    </listeners>

到此配置看结束

step5:既然配置了监听器,那么LoginCase类Test注解retryAnalyzer=TestngRetry.class属性就可以去掉了
此处造两条失败的case,执行看效果
(1)login_remeber();
(2)login_failure01
运行代码检查(1)和(2)是否都会重试 (可以重试)

运行方式:(1)testng.xml右键run as >TestNG suite
(2)maven test
不能直接运行LoginCases,直接运行,会加载不到testng.xm即监听就不会生效

注意:testng.xml执行前如果执行了maven clean,再执行testng.xlm如果报错,可以maven ->update project
再重新执行testng.xml就不报错了


image.png

----------------------------重试加日志-------------------------

日志导包:import org.apache.log4j.Logger;


package com.lemon.listener;



import org.apache.log4j.Logger;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;


/**
 * TestngRetry类实现IRetryAnalyzer接口,返回True(要重试),返回False(不重试)
 * 不能一直返回true,会陷入死循环,一直重试 retry()方法只有当用例执行失败的时候才会被执行到此方法(这是testng框架内部是实现的)
 * 
 * @author TF
 *
 */
public class TestngRetry implements IRetryAnalyzer {
    private int maxRetryCount = 2;// 最大重试次数
    private int retryCount = 0;// 重试次数统计
    private Logger logger=Logger.getLogger(TestngRetry.class);//import org.apache.log4j.Logger;
    

    @Override
    public boolean retry(ITestResult result) {
        if (retryCount < maxRetryCount) {
            logger.info("重试第"+(retryCount+1)+"次用例执行");
            retryCount++;
            return true;
        } else {
            return false;
        }

    }

}



相关文章

网友评论

      本文标题:web_auto用例失败重试

      本文链接:https://www.haomeiwen.com/subject/mujyfhtx.html