测试编写者和测试架构师之间的区别是什么?有一个很经典的回答是这样的:初级工程师调试代码,高级工程师调试系统

有位作者正是沿着这个思路,不再追问“我怎样才能让这个测试跑得更快?”,而是转向一个更深层的问题:“到底是什么拖慢了运行它的系统?”。基于这一视角,他对常用的 Selenium 进行了提速实践,结果出乎意料——在没有改动任何测试逻辑的情况下,整体速度提升了4倍!

打开网易新闻 查看精彩图片

今天我们就来拆解他的实践过程。

第一步:分析 Selenium 的底层环境

Selenium 的速度受其底层环境制约,主要包括

  • 运行测试的机器性能;
  • Grid 与浏览器之间的网络延迟;
  • 选择器、等待及数据读取涉及的 I/O 开销;
  • 线程同步机制。

这些正是我们可以着手优化的关键因素。

打开网易新闻 查看精彩图片

第二步:逐步调整变量

接下来,就是针对上述因素,一步一步地进行调优实验了。

1. 迁移到无头容器(从本地浏览器)

以前在本地启动浏览器,各大浏览器如Chrome、Firefox、Edge,它们争抢CPU就像幼儿抢糖果。后来作者使用Selenium Grid+ Docker将它们容器化,配合headless Chrome。突然间,资源争用消失了。每个测试套件在自己的容器中运行 → 并行扩展变得轻而易举。

速度提升: 1.7倍

额外收益:不再有"WebDriver无法连接"的随机失败。

如下图:

打开网易新闻 查看精彩图片

一行命令启动。完整的大规模测试执行。

打开网易新闻 查看精彩图片

无需手动设置,无需等待,无任何负担。

2. 通过本地Grid切换到Remote WebDriver

在本地运行浏览器实例时,会遇到文件系统I/O限制,特别是如果测试写日志或截图。

通过启动远程Selenium Grid(即使在同一网络),繁重的浏览器工作在别处进行。

测试代码仍然在开发机器上运行——浏览器不在。

网络开销最小。性能提升巨大。

速度提升: 1.3倍

3. 一次性缓存所有静态资源

Selenium测试反复访问登录页面、Dashboard和相同的静态资源。

每次运行都会一次又一次地获取相同的JS和CSS包。

解决方案:使用Service Workers或简单的代理缓存(如Nginx)来提供缓存内容。

无需浏览器hack,无需编辑测试。

速度提升: 0.5倍 (特别是UI密集型应用)

Nginx配置片段:

打开网易新闻 查看精彩图片

4. 在Suite级别并行化,而非Test级别

将每个test并行化听起来不错——直到Chrome标签页开始互相吞噬。

作者将测试分组为执行时长相似的suite(如Login、Search、Reports),并让这些suite在并行线程中运行。

4个线程 = 4个独立的浏览器会话 = 没有CPU崩溃。

TestNG示例:

打开网易新闻 查看精彩图片

速度提升: 1.5倍

额外收益:多次运行间性能一致。

5. 优化Wait策略(不改动测试)

这个很巧妙。

作者没有改变一行WebDriverWait代码,但改变了基础driver中wait的实现方式。

他用事件驱动wait替换了轮询wait,使用Selenium内部的ExpectedConditions包装自定义日志。

不再是"每500ms检查一次",现在它等待真实的DOM信号(如DOMContentLoaded、AJAX完成)。

速度提升: 0.6倍

额外收益: 漏报减少40%。

打开网易新闻 查看精彩图片

总结:

Selenium不是慢,环境才是慢的主要原因。

大多数开发者过度优化他们的测试代码,却忽略了生态系统,如:

  • 磁盘I/O
  • 日志开销
  • 浏览器启动时间
  • 网络延迟
  • CPU限流

整体过程如下图:

打开网易新闻 查看精彩图片

☑️转岗软件I测试/野路子技能提升

☑️想了解更多涨薪技能提升方法

✔️可以到我的个人号:atstudy-js

即可加入领取 ⬇️⬇️⬇️

转行、入门、提升、需要的各种干货资料

内含AI测试、 车载测试、AI大模型开发、BI数据分析、银行/游戏测试、AIGC

打开网易新闻 查看精彩图片