仅修改Command类实现测试继承类的多线程并行执行适配(最少代码改动)
如何仅修改Command类适配多线程并行自动化测试
嘿,这个场景我太熟悉了——要改10万行测试用例代码简直是噩梦,还好我们完全可以只通过修改Command类来搞定多线程适配,不用碰那些测试用例!
先理清楚当前的核心问题
你现在的Command类里用了一个静态的String driver字段,这完全不支持多线程隔离,而且click方法里试图用字符串调用click()的逻辑本身就有问题。加上测试用例里已经写死了传driver参数的调用方式,我们得在兼容原有调用的前提下,把线程安全的逻辑塞进去。
解决方案:修改Command类
我们要做的就是把Command类的逻辑完全切换到依赖WebDriverFactory的ThreadLocal驱动,同时兼容原有测试用例的方法调用签名:
public class Command { // 删掉原来那个没用的静态String driver字段 // 完全兼容原有方法签名,忽略传入的driver参数,直接取线程安全的驱动实例 public void click(WebElement element, String driver) { getThreadSafeDriver().click(element); } // 封装一个工具方法,统一获取线程隔离的WebDriver private WebDriver getThreadSafeDriver() { WebDriver threadDriver = WebDriverFactory.getDriver(); if (threadDriver == null) { throw new IllegalStateException("WebDriver还没初始化!请先调用WebDriverFactory.setDriver()指定浏览器"); } return threadDriver; } // 如果你还有其他操作方法(比如sendKeys、clear),都按这个模式改 public void sendKeys(WebElement element, String text, String driver) { getThreadSafeDriver().findElement(element).sendKeys(text); } }
顺便完善WebDriverFactory(支持Firefox)
你的工厂类目前只支持Chrome,得补上Firefox的逻辑才能满足TestcaseTwo的需求:
public class WebDriverFactory { private static ThreadLocal<WebDriver> driver = new ThreadLocal<>(); public static void setDriver(String browser ) { WebDriver webDriver; if(browser.equalsIgnoreCase("Chrome")) { WebDriverManager.chromedriver().setup(); System.setProperty("webdriver.chrome.silentOutput", "true"); ChromeOptions options = new ChromeOptions(); options.addArguments("--incognito"); webDriver = new ChromeDriver(options); } else if (browser.equalsIgnoreCase("Firefox")) { WebDriverManager.firefoxdriver().setup(); FirefoxOptions options = new FirefoxOptions(); options.addArguments("-private"); // 对应Chrome的隐身模式 webDriver = new FirefoxDriver(options); } else { throw new IllegalArgumentException("不支持的浏览器类型:" + browser); } driver.set(webDriver); } public static WebDriver getDriver() { return driver.get(); } // 新增:测试结束后清理驱动,避免内存泄漏 public static void quitDriver() { WebDriver currentDriver = getDriver(); if (currentDriver != null) { currentDriver.quit(); driver.remove(); // 从ThreadLocal里移除当前线程的实例 } } }
为什么这个方案能解决问题?
- 完全不用碰测试用例:测试用例里的
click(element,driver)调用原封不动,Command类的方法签名完全兼容,只是内部把传入的无效driver参数忽略了,改用线程安全的实例 - 天然支持多线程:所有操作都依赖
WebDriverFactory里的ThreadLocal驱动,每个测试用例线程都有自己独立的浏览器实例,不会互相干扰 - 逻辑更健壮:新增的
getThreadSafeDriver()方法还加了空值检查,能提前发现未初始化驱动的问题
内容的提问来源于stack exchange,提问作者Sameera De Silva
相关产品推荐
相关产品推荐

