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

如何在Jenkins上自动重跑Selenium+TestNG套件的失败测试用例

针对TestNG+Jenkins环境的Selenium失败用例自动重跑方案

兄弟,我太懂你这种收尾阶段的痛了——UI自动化测试不稳定简直是家常便饭,重构又赶不上项目周期,只能先靠重跑机制救急。结合你用的TestNG+Jenkins栈,我给你分享几个落地性强的方案,都是我踩过坑后验证有效的:

一、TestNG层面实现用例级自动重跑

TestNG本身就自带失败重跑的能力,不用额外加复杂依赖,两种方式任选:

1. 注解方式(快速针对特定用例)

直接在你觉得不稳定的测试方法/类上加上@Test(retryAnalyzer = RetryAnalyzer.class),然后自己实现这个重跑逻辑类:

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

public class RetryAnalyzer implements IRetryAnalyzer {
    private int retryCount = 0;
    private static final int MAX_RETRY_COUNT = 2; // 最多重跑2次,按需调整

    @Override
    public boolean retry(ITestResult result) {
        if (retryCount < MAX_RETRY_COUNT) {
            retryCount++;
            System.out.println("重试第" + retryCount + "次,目标用例:" + result.getName());
            return true;
        }
        return false;
    }
}

这种方式的好处是灵活,你可以给那些你知道特别容易抽风的用例单独加重跑,不会连累所有用例。

2. 全局监听器方式(批量覆盖所有用例)

如果想让所有@Test注解的用例自动继承重跑逻辑,不用一个个加注解,就写个全局监听器:

import org.testng.IAnnotationTransformer;
import org.testng.annotations.ITestAnnotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class RetryListener implements IAnnotationTransformer {
    @Override
    public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
        IRetryAnalyzer retry = annotation.getRetryAnalyzer();
        if (retry == null) {
            annotation.setRetryAnalyzer(RetryAnalyzer.class);
        }
    }
}

然后在你的testng.xml里配置这个监听器:

<listeners>
    <listener class-name="com.yourpackage.RetryListener"/> <!-- 替换成你的实际包路径 -->
</listeners>

这样所有用例都会自动触发重跑逻辑,一劳永逸。

二、Jenkins层面实现任务级重跑

有时候失败不是用例本身的问题,而是Jenkins节点资源不够、网络波动这类环境问题,这时候可以在Jenkins层面加任务级重跑:

  • 先装个Retry Failed Builds插件,然后在任务配置里找到「Retry failed builds」选项:
    • 设置Maximum number of retry attempts(比如2次)
    • 可以勾选「Retry only if build failed due to specific causes」,指定只重跑因测试失败导致的构建失败,排除编译错误这类非测试问题
  • 如果用Pipeline脚本,还能写更灵活的逻辑,比如只重跑失败的测试套件:
pipeline {
    agent any
    stages {
        stage('Run UI Tests') {
            steps {
                script {
                    def maxRetries = 2
                    def buildPassed = false
                    for (int i = 0; i <= maxRetries; i++) {
                        try {
                            sh 'mvn test -DsuiteXmlFile=testng.xml' // 替换成你的实际测试执行命令
                            buildPassed = true
                            break
                        } catch (Exception e) {
                            if (i == maxRetries) {
                                throw e // 最后一次失败就抛出异常,标记构建失败
                            }
                            echo "测试失败,正在进行第${i+1}次重跑..."
                        }
                    }
                }
            }
        }
    }
}

三、额外优化小技巧

  • 重跑时一定要记录重跑日志,在RetryAnalyzer里把重跑原因、次数写入测试报告,方便后续排查哪些用例高频失败,针对性优化
  • 重跑次数别设太多(建议2-3次),次数太多会拉长构建时间,反而拖慢团队效率
  • 可以结合TestNG的@BeforeMethod和@AfterMethod,在重跑前重置测试环境(比如清空浏览器缓存、重新登录),减少环境残留导致的失败

内容的提问来源于stack exchange,提问作者Tina Pan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:05:09