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

如何通过.xml参数控制TestNG测试失败重试的启用状态?

基于TestNG参数控制测试重试功能开关

你可以通过以下步骤,利用testng.xml中的retry参数灵活控制重试功能的开启/关闭:

1. 修正BaseClass,保存重试开关状态

修改BaseClass的setup方法,接收并解析retry参数,将其保存为静态变量供RetryAnalyzer调用:

package pages;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Parameters;

public class BaseClass {
    public static Logger logg = Logger.getLogger(BaseClass.class.getName());
    protected static WebDriver driver;
    // 新增静态变量,存储重试开关状态
    public static boolean isRetryEnabled;

    // 省略原有私有变量

    @BeforeMethod
    // 修正参数列表,添加retry参数
    @Parameters({ "browser", "environmentURL", "grid", "retry"})
    public void setup(String browserName, String env, String grid, String retry) throws MalformedURLException {
        // 将字符串参数解析为布尔值
        isRetryEnabled = Boolean.parseBoolean(retry);
        
        // 保留原有setup方法的初始化逻辑
        logg.info("Initializing browser setup");
        logg.info(browserName + " Session has started");

        if (grid.equalsIgnoreCase("true")) {
            logg.info("Remote session intiated");
            DesiredCapabilities capabilities = new DesiredCapabilities();
            capabilities.setCapability("browserName", "chrome");
            capabilities.setCapability("platform", "linux");
            driver = new RemoteWebDriver(new URL(MvnProperties.gridUrl), capabilities);
        } else {
            if (browserName.equalsIgnoreCase("Firefox")) {
                System.setProperty("webdriver.gecko.driver", "/usr/local/bin/geckodriver");
                driver = new FirefoxDriver();
            }
            if (browserName.equalsIgnoreCase("Chrome")) {
                System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
                driver = new ChromeDriver();
            }
            if (browserName.equalsIgnoreCase("Chrome Dev")) {
                System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriverdev");
                driver = new ChromeDriver();
            }
            if (browserName.equalsIgnoreCase("Edge")) {
                System.setProperty("webdriver.edge.driver", "/usr/local/bin/msedgedriver");
                driver = new EdgeDriver();
            }
        }
        logg.info("Waiting for browser to load");
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        logg.info("Maximizing window");
        driver.manage().window().maximize();
        logg.info("******** Browser has been initialized********");

        logg.info("Opening " + env + " environment");
        driver.get("*****");
        logg.info(env + " was reached");

        if (env.equals("stage")) {
            logg.info("Opening " + env + " environment");
            driver.get("*****");
            logg.info(env + " was reached");
            logg.info("*****");
            logg.info("*****");
            logg.info("*****");
            logg.info("*****");
            logg.info("*****");
        }

        if (env.equals("prod")) {
            logg.info("Opening " + env + " environment");
            driver.get("*****");
            logg.info(env + " was reached");
        }
    }

    @AfterMethod
    public void teardown() {
        logg.info("****** Test Finished: Beginning teardown ******");
        logg.info("Closing browser");
        driver.quit();
    }
}

2. 修改RetryAnalyzer,根据开关决定是否重试

在RetryAnalyzer的retry方法开头增加开关判断,若重试功能关闭则直接返回false:

package IRetryAnalyzer;

import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
import pages.BaseClass;

public class RetryAnalyzer extends BaseClass implements IRetryAnalyzer {
    private int count = 0;
    private static int maxTry = 3;

    @Override
    public boolean retry(ITestResult iTestResult) {
        // 优先判断重试开关,未开启则直接终止重试逻辑
        if (!BaseClass.isRetryEnabled) {
            logg.info("Retry功能已关闭,不执行重试");
            return false;
        }

        // 保留原有重试逻辑
        if (!iTestResult.isSuccess()) {                     
            if (count < maxTry) {                            
                count++;                                     
               logg.info("Test Failed: Retrying");
                iTestResult.setStatus(ITestResult.FAILURE);  
                return true;                                 
            } else {
                logg.info("Test Failed: Max retry count reached. Flagged as failed");
                iTestResult.setStatus(ITestResult.FAILURE);  
            }
        } else {
            iTestResult.setStatus(ITestResult.SUCCESS);      
        }
        return false;
    }
}

3. 调整TestNG XML配置,灵活控制开关

在testng.xml中修改retry参数的值,实现不同环境的开关控制:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite">
    <listeners>
        <listener class-name="listeners.TestListener" />
        <!-- 移除冗余的RetryAnalyzer listener注册,仅保留AnnotationTransformer -->
        <listener class-name="IRetryAnalyzer.AnnotationTransformer"/>
    </listeners>

    <test name="LoginTests">
        <parameter name="browser" value="Chrome" />
        <parameter name="grid" value="false" />
        <parameter name="environmentURL" value="stage" />
        <!-- 本地开发设为false关闭重试,CI/线上环境设为true开启重试 -->
        <parameter name="retry" value="false" />

        <classes>
            <class name="tests.LoginTests">
            </class>
        </classes>
    </test>
</suite>

关键说明

  • 原XML中注册RetryAnalyzer为listener是冗余操作,AnnotationTransformer已负责为测试方法绑定重试分析器,可直接移除该配置。
  • 通过静态变量传递开关状态,确保RetryAnalyzer能获取到当前测试的重试配置。

内容的提问来源于stack exchange,提问作者K White

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:15:30