You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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来监听整个类的执行状态:

  1. 先给所有用例绑定TestRetry,保证单个用例失败会先重试
  2. 监听类里的用例失败事件,一旦有失败,记录这个类的重试次数
  3. 当类的重试次数没到上限时,触发整个类的所有用例重新跑一遍

补全后的典型实现示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:26:13