如何通过.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
相关产品推荐
相关产品推荐

