非Rails环境Ruby-Capybara运行parallel_tests并行测试异常求助
问题根因
两个异常均由非Rails环境下Capybara并行会话隔离缺失导致,和贴出的数据库配置没有关系:
- 第二个浏览器空白、登录字段值重复拼接:非Rails场景下Capybara默认不会为并行进程分配独立的驱动会话、服务端口,两个测试进程会争抢同一个全局Capybara会话资源,输入操作会被叠加到同一会话上,拿不到会话控制权的进程对应的浏览器就会停在空白页。
- 在测试用例块内手动赋值
ENV['TEST_ENV_NUMBER']的写法完全无效:这个环境变量是parallel_tests启动子进程时自动注入的,等用例执行到赋值逻辑时,进程初始化、Capybara配置加载流程已经走完,后续赋值不会产生任何实际效果。既然测试本身不涉及数据库操作,database.yml的配置当前不会对测试运行产生影响。
修复方案
- 删掉所有spec文件里手动给
ENV['TEST_ENV_NUMBER']赋值的代码,不要手动修改这个变量,parallel_tests会自动完成注入:第一个启动的进程该变量值为空,第二个进程值为2,后续进程按序号递增。 - 在RSpec配置文件(一般是spec_helper.rb)中补充Capybara隔离配置,确保每个并行进程、每个测试用例都使用独立会话:
require 'capybara/rspec' # 注册Chrome驱动 Capybara.register_driver :chrome do |app| Capybara::Selenium::Driver.new(app, browser: :chrome) end Capybara.default_driver = :chrome Capybara.javascript_driver = :chrome # 为每个进程分配独立服务端口,避免端口抢占冲突 Capybara.server_port = 9887 + ENV['TEST_ENV_NUMBER'].to_i RSpec.configure do |config| config.before(:each) do # 每个用例执行前重置浏览器会话,避免状态残留、串扰 Capybara.reset_sessions! # 替换为实际测试的起始页路径 visit '/login' end config.after(:each) do Capybara.reset_sessions! end end
- 直接执行原有并行测试命令即可,不需要额外传环境变量:
parallel_rspec -n 2
如果仍存在用例串扰问题,可以加上场景分组参数,确保每个用例独立分配执行进程:
parallel_rspec -n 2 --group-by scenarios
内容的提问来源于stack exchange,提问作者user3636388
相关产品推荐
相关产品推荐

