虚拟机与本地环境测试性能对比:虚拟机测试异常缓慢
问题排查与优化方案
核心问题排查方向
- 虚拟机资源受限:Jenkins所在虚拟机CPU、内存或网络带宽不足,无头Chrome启动及页面加载时资源抢占导致阻塞。
- 网络环境差异:虚拟机与测试目标站点间网络延迟高,或存在未正确配置的代理,导致
driver.get()请求长时间等待。 - ChromeDriver与浏览器版本不兼容:代码中注释了Linux平台的driver路径,推测虚拟机为Linux环境,若ChromeDriver与Chrome版本不匹配,会引发初始化或页面加载异常耗时。
- 无头模式参数缺失优化项:当前仅配置基础无头参数,未启用性能相关的资源限制、禁用非必要功能等配置。
- Maven全量构建耗时:
clean install会执行编译、打包、依赖下载等全流程,若虚拟机依赖下载慢或构建资源占用高,会间接拖慢测试执行速度。
落地优化方案
1. 优化Chrome无头模式启动参数
更新startBrowser()方法中的ChromeOptions,添加性能优化参数,适配多系统环境:
@Before public WebDriver startBrowser(){ loggerManager.info("Test is starting..."); ChromeOptions options = new ChromeOptions(); // 根据系统自动选择driver路径,避免硬编码 String driverPath = System.getProperty("os.name").toLowerCase().contains("win") ? "src/main/resources/drivers/winChromedriver.exe" : "/usr/bin/chromedriver"; System.setProperty("webdriver.chrome.driver", driverPath); // 无头模式核心优化参数 options.addArguments("--headless=new"); // 新版无头模式,性能更优且兼容更多特性 options.addArguments("--remote-allow-origins=*"); options.addArguments("--ignore-ssl-errors=yes"); options.addArguments("--ignore-certificate-errors"); options.addArguments("--disable-gpu"); // 禁用GPU渲染,减少资源消耗 options.addArguments("--no-sandbox"); // 关闭沙箱,避免权限问题及额外内存占用 options.addArguments("--disable-dev-shm-usage"); // 解决Linux下/dev/shm内存不足导致的卡顿 options.addArguments("--disable-extensions"); // 禁用浏览器扩展 options.addArguments("--blink-settings=imagesEnabled=false"); // 非必要时禁用图片加载,大幅提速 options.addArguments("--disable-javascript"); // 测试场景不需要JS时可禁用,根据实际调整 if (driver == null){ driver = new ChromeDriver(options); } driver.manage().window().setSize(new Dimension(1920, 1080)); // 替代maximize,避免窗口调整耗时 return driver; }
2. 精简Maven执行命令
避免全量构建,仅执行测试阶段,减少前置步骤耗时:
mvn -s .m2/settings.xml test -Dcucumber.filter.tags="@test"
若必须执行install,可添加-DskipTests=false确保仅运行指定测试,同时检查.m2/settings.xml中的镜像源是否为国内高速镜像,加速依赖下载。
3. 协同运维排查虚拟机环境
- 确认虚拟机CPU(≥2核)、内存(≥4G)分配是否满足Chrome运行需求。
- 检查虚拟机网络是否直连测试站点,或是否配置了正确的代理规则,消除网络延迟。
- 验证ChromeDriver与Chrome版本是否匹配(执行
chromedriver --version和google-chrome --version对比,需对应大版本一致)。
4. 测试代码细节优化
- 确认
driver单例模式生效:当前代码的if (driver==null)判断可避免每个场景重启浏览器,但需确保Cucumber钩子的作用域为全局(可通过@Before(order=1, value="@test")指定作用域)。 - 为页面操作添加显式等待:避免依赖隐性等待导致的不必要阻塞,但核心仍需解决网络和资源瓶颈。
内容的提问来源于stack exchange,提问作者Jano Marek
相关产品推荐
相关产品推荐

