提高框架的稳定性:使用失败重试技术
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;
}
}
}













网友评论