并行测试执行无限期地挂起用于rspec的webkit驱动程序

Abr*_*m P 6 webkit rspec ruby-on-rails capybara parallel-testing

我正在通过capybara-webkit驱动程序上的parallel_tests运行我的规范.我有以下ruby环境:

 ruby -v
 ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.4.2]
Run Code Online (Sandbox Code Playgroud)

在包含以下内容的gemset上运行rvm(截取for capybara,rails,rspec和parallel_tests以获得相关性.如果看到更大的gemset会有所帮助,请告诉我们):

 *** LOCAL GEMS ***

 ...
 capybara (1.1.2)
 parallel_tests (0.8.12)
 rails (3.2.11)
 rspec (2.11.0)
Run Code Online (Sandbox Code Playgroud)

当我在一个进程上运行我的测试套装时rake spec,我的所有测试都会运行完成.但是,当通过parallel_tests运行时,会发生以下情况:

 8 processes for 220 specs, ~ 27 specs per process
Run Code Online (Sandbox Code Playgroud)

之后这些流程最终会开始回归:

 Finished in 11 minutes 15.76 seconds
 Finished in 11 minutes 28.89 seconds
Run Code Online (Sandbox Code Playgroud)

但是,在前6个进程返回后,parallel_spec将无限期挂起,永不终止,并且永远不会为剩余的2个进程打印输出.

我在运行OS X Lion的MacBook Pro上使用2.4GHz Intel i7.

所以我的问题很简单:为什么它会挂起,我该如何调试它挂起的原因,以及如何阻止它挂起并允许parallel_tests运行完成?

Par*_*ert 2

缺少一些有关您的 rspec 配置和库使用情况的信息,您可能会得到答案。也就是说,在运行 rspec 以获取集成规范时,我在多线程环境中看到了类似的行为。

https://github.com/grosser/parallel_tests/wiki上找到的建议在集成规范方面似乎具有误导性。尝试依赖或 的transaction策略肯定会导致任何非阻塞数据库适配器出现死锁。DatabaseCleaneruse_transactional_fixtures

Capybara 为集成规范启动多个线程。当客户端和服务器线程尝试同时与相同的记录进行交互时,通常会导致超时或死锁。有时,死锁会导致套件运行永久挂起,直到手动终止。

我发现防止这种情况发生的最可靠的配置是共享实例之间的连接ActiveRecord和明智地使用DatabaseCleaner.

# integration_spec_helper.rb

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  class ActiveRecord::Base
    class_attribute :shared_connection

    def self.connection
      self.shared_connection || retrieve_connection
    end
  end

  config.before do |example|
    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

    if Capybara.current_driver == :webkit
      DatabaseCleaner.strategy = :deletion
    else
      DatabaseCleaner.strategy = :transaction
    end

    DatabaseCleaner.start
  end

  config.after do
    DatabaseCleaner.clean
  end
end
Run Code Online (Sandbox Code Playgroud)