如何配置jest-puppeteer以同时运行2个Headless Chrome实例并行执行测试?
解决方案:Jest + Puppeteer 并行运行多浏览器实例
我之前在做Jest+Puppeteer并行测试时也踩过这个坑,跟你遇到的情况一模一样——明明设置了并行,却只有一个浏览器实例在干活。后来试了几个方法,终于搞定了,分享给你:
1. 确保每个测试用例拥有独立的浏览器实例
这是最关键的一点:不要全局共享一个浏览器实例,Jest的并行机制是基于worker的,每个worker会独立执行测试文件,所以要在每个测试的生命周期里单独创建和销毁浏览器。
步骤1:配置Jest的并行参数
修改你的jest.config.js,明确指定并行worker数量,同时延长测试超时时间(并行启动浏览器需要更多时间):
// jest.config.js module.exports = { setupFilesAfterEnv: ['./jest.setup.js'], maxWorkers: 2, // 正好对应你要的2个并行实例 testTimeout: 30000, // 把超时设长一点,避免启动浏览器时超时失败 verbose: true, // 可选,方便查看每个worker的执行日志 };
步骤2:在测试前置文件中隔离浏览器实例
创建jest.setup.js,在beforeEach里初始化浏览器,afterEach里销毁,确保每个测试用例都有专属实例:
// jest.setup.js const puppeteer = require('puppeteer'); beforeEach(async () => { // 每个测试用例启动全新的浏览器 global.browser = await puppeteer.launch({ headless: 'new', // 推荐用新版无头模式,兼容性更好 args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', // 解决Linux环境下的内存不足问题 ], // 不要手动指定--remote-debugging-port!否则并行时会端口冲突,让Puppeteer自动分配 }); global.page = await browser.newPage(); }); afterEach(async () => { // 测试结束后立即销毁资源,避免占用内存 await global.page.close(); await global.browser.close(); });
2. 拆分测试用例到不同文件
Jest默认对单个测试文件内的用例是串行执行的,如果你把两个测试用例放在同一个.test.js文件里,即使开了并行,也只会启动一个浏览器。解决方法很简单:
- 把两个测试用例分别放到两个独立的测试文件(比如
test1.test.js和test2.test.js) - 这样Jest的2个worker会同时执行这两个文件,每个文件启动自己的浏览器实例
3. 排查常见坑点
如果上面的方法还是不行,可以检查这些地方:
- 端口冲突:不要手动设置
--remote-debugging-port,Puppeteer默认会自动分配空闲端口 - 系统资源不足:并行启动两个Chrome实例需要足够的内存,尤其是无头模式也会占用不少资源,可以关闭其他占用内存的程序试试
- Puppeteer版本问题:确保你用的是较新的Puppeteer版本,旧版本可能在并行启动时存在bug
你可以先试试第一种方案,调整配置和前置文件,应该就能解决问题。如果还是有疑问,看看测试日志里有没有报错信息,比如浏览器启动失败的提示,能帮你更快定位问题。
内容的提问来源于stack exchange,提问作者Alexandra Pandelea
相关产品推荐
相关产品推荐

