You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非Rails环境Ruby-Capybara运行parallel_tests并行测试异常求助

问题根因

两个异常均由非Rails环境下Capybara并行会话隔离缺失导致,和贴出的数据库配置没有关系:

  • 第二个浏览器空白、登录字段值重复拼接:非Rails场景下Capybara默认不会为并行进程分配独立的驱动会话、服务端口,两个测试进程会争抢同一个全局Capybara会话资源,输入操作会被叠加到同一会话上,拿不到会话控制权的进程对应的浏览器就会停在空白页。
  • 在测试用例块内手动赋值ENV['TEST_ENV_NUMBER']的写法完全无效:这个环境变量是parallel_tests启动子进程时自动注入的,等用例执行到赋值逻辑时,进程初始化、Capybara配置加载流程已经走完,后续赋值不会产生任何实际效果。既然测试本身不涉及数据库操作,database.yml的配置当前不会对测试运行产生影响。
修复方案
  1. 删掉所有spec文件里手动给ENV['TEST_ENV_NUMBER']赋值的代码,不要手动修改这个变量,parallel_tests会自动完成注入:第一个启动的进程该变量值为空,第二个进程值为2,后续进程按序号递增。
  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
  1. 直接执行原有并行测试命令即可,不需要额外传环境变量:
parallel_rspec -n 2

如果仍存在用例串扰问题,可以加上场景分组参数,确保每个用例独立分配执行进程:

parallel_rspec -n 2 --group-by scenarios

内容的提问来源于stack exchange,提问作者user3636388

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 23:06:28