Selenium中用例失败重试整个类的重试逻辑实现(含核心类代码)
Selenium 测试类级重试逻辑核心代码解析
我来帮你拆解这两个实现类级重试的核心代码,一步步看它们是怎么配合工作的:
1. TestRetry 类:单个用例的重试开关
这个类是重试逻辑的基础,它实现了TestNG的IRetryAnalyzer接口,负责判断单个失败的测试用例要不要重试。
完整代码&逐行解析
public class TestRetry implements IRetryAnalyzer { // 记录已经重试的次数,初始从0开始 int counter=0; // 设定最多重试2次(算上原执行,这个用例最多跑3次) int retryLimit=2; @Override public boolean retry(ITestResult result) { // 如果重试次数还没到上限 if (counter < retryLimit) { // 打日志记录:哪个用例要重试,这是第几次重试 TestReporter.logStep("Retrying Test " +result.getName()+" for number of times: "+(counter+1)); // 重试次数加1 counter++; // 返回true,表示同意重试这个用例 return true; } // 重试次数到上限了,返回false,不再重试 return false; } }
不过要注意:这个类本身只能管单个用例的重试,要实现“类里只要有一个用例失败,就重试整个类”,还得靠下面的RetryListener来搭架子。
2. RetryListener 类:类级重试的总指挥
你给的代码片段不完整,但这个类一般会实现TestNG的IAnnotationTransformer接口(有的还会结合ITestListener),它的作用是把单个用例的重试逻辑绑定到整个测试类上,并且监听类的执行结果,触发类级别的重试。
核心逻辑说明
IAnnotationTransformer的transform方法可以在TestNG跑测试前,动态修改所有@Test注解的属性——我们就是靠这个方法,把TestRetry绑定到测试类的所有用例上。
如果要实现“任一用例失败重试整个类”,通常还要结合ITestListener来监听整个类的执行状态:
- 先给所有用例绑定
TestRetry,保证单个用例失败会先重试 - 监听类里的用例失败事件,一旦有失败,记录这个类的重试次数
- 当类的重试次数没到上限时,触发整个类的所有用例重新跑一遍
补全后的典型实现示例
public class RetryListener implements IAnnotationTransformer, ITestListener { // 用Map记录每个测试类的重试次数 private Map<String, Integer> classRetryCount = new HashMap<>(); // 设定整个类最多重试2次 private int maxClassRetry = 2; @Override public void transform(ITestAnnotation annotation, Class<?> testClass, Constructor<?> testConstructor, Method testMethod) { // 给所有@Test方法都绑定TestRetry重试分析器 annotation.setRetryAnalyzer(TestRetry.class); } @Override public void onTestFailure(ITestResult result) { // 获取当前失败用例所属的类名 String className = result.getTestClass().getName(); // 如果这个类还没记录过重试次数,就初始化为0 classRetryCount.putIfAbsent(className, 0); int currentCount = classRetryCount.get(className); // 如果类的重试次数还没到上限 if (currentCount < maxClassRetry) { // 打日志记录这个类要重试了 TestReporter.logStep("Class " + className + " has failed cases, will retry for " + (currentCount + 1) + " times"); // 更新这个类的重试次数 classRetryCount.put(className, currentCount + 1); // 这里可以加触发类重跑的逻辑,比如通过TestNG的XmlSuite重新执行整个类 } } }
最后要注意的生效方式
要让这两个类起作用,得在TestNG的配置xml里注册监听器:
<listeners> <listener class-name="你的包名.RetryListener"/> </listeners>
另外,重试次数别设太多,不然测试跑起来会特别慢,反而影响效率~
内容的提问来源于stack exchange,提问作者user9586244
相关产品推荐
相关产品推荐

