测试编写者和测试架构师之间的区别是什么?有一个很经典的回答是这样的:初级工程师调试代码,高级工程师调试系统。
有位作者正是沿着这个思路,不再追问“我怎样才能让这个测试跑得更快?”,而是转向一个更深层的问题:“到底是什么拖慢了运行它的系统?”。基于这一视角,他对常用的 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
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.