Ruby on rails rspec的并行测试执行无限期挂起

Ruby on rails rspec的并行测试执行无限期挂起,ruby-on-rails,rspec,webkit,capybara,parallel-testing,Ruby On Rails,Rspec,Webkit,Capybara,Parallel Testing,我正在通过水豚webkit驱动程序上的并行_测试运行我的规范。我有以下ruby环境: ruby -v ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.4.2] 在gemset上运行rvm,该gemset包含以下内容(针对capybara、rails、rspec和并行_测试的相关性而截断。如果看到更大范围的gemset会有所帮助,请让我知道): 当我使用rake spec在单个进程上运行测试套件时,我的所有测试都会运行到

我正在通过水豚webkit驱动程序上的并行_测试运行我的规范。我有以下ruby环境:

 ruby -v
 ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.4.2]
在gemset上运行rvm,该gemset包含以下内容(针对capybara、rails、rspec和并行_测试的相关性而截断。如果看到更大范围的gemset会有所帮助,请让我知道):

当我使用rake spec在单个进程上运行测试套件时,我的所有测试都会运行到完成。 但是,当运行并行_测试时,会发生以下情况:

 8 processes for 220 specs, ~ 27 specs per process
之后,流程将最终开始返回:

 Finished in 11 minutes 15.76 seconds
 Finished in 11 minutes 28.89 seconds
但是,在前6个进程返回后,parallel_spec将无限期挂起,永远不会终止,并且永远不会打印其余2个进程的输出

我在一台运行OS X Lion的MacBook Pro上,有一台2.4GHz的Intel i7


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

缺少一些关于rspec配置和库使用的信息,您可能会得到答案。也就是说,在多线程环境中运行rspec for integration Spec时,我看到过类似的行为

在集成规范方面,发现的建议似乎具有误导性。试图依赖
DatabaseCleaner
use\u transactional\u fixture
transaction
策略肯定会导致任何非阻塞数据库适配器的死锁

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

为了调试并行规范执行受阻的地方,您需要了解进程的行为。这意味着如果一个或多个进程被卡住,它们会按照什么规格这样做

为此,您需要对rspec配置进行一些修改:

# Allows to access hanging spec name and source
# Throw the following command in a terminal whenever a spec is hanging
# $ ps -ef | grep rspec
RSpec.configure do |config|
  config.around :each do |example|
    title  = example.metadata[:full_description]
    source =  example.metadata[:block].source_location.join ":"
    $0 = %{rspec #{source} "#{title}"}
    example.run
  end
end
然后打开另一个终端并执行:

ps-ef | grep“rspec/”

最初,它将显示几个过程,如:

julian    7128  7073 93 10:10 pts/1    00:09:54 rspec /home/julian/Lenda/lenda/spec/models/disclosures/docusign/refinance_loan_estimate_form_spec.rb:17 "RefinanceLoanEstimateForm should be able to be generated from non-completed applications"
julian    7141  7073 93 10:10 pts/1    00:09:50 rspec /home/julian/Lenda/lenda/spec/models/disclosures/disclosure_document_spec.rb:14 "DisclosureDocument retrieves fields signed by a signer"
julian    7147  7073 94 10:10 pts/1    00:09:58 rspec /home/julian/Lenda/lenda/spec/controllers/api/v1/applications_controller_spec.rb:192 "Api::V1::ApplicationsController admin user GET #show with a valid application_id "
您需要监控这些过程,直到它们不再改变。当它们完成时,它们会消失,因此在最后,您可能只会有一个或两个进程被卡住,但这实际上取决于您的测试套件


从这里开始,您需要单独调试该测试以找到问题。

您是否找到了解决方案?我遇到了同样的问题,同上。我升级了并行测试和bundler,但没有用。莫名其妙。如果你把它缩小到6呢?我想知道您是否无意中关闭了数据库服务器或其他什么……您是否有机会找到解决方案?还是另一种选择?谢谢你详细而冗长的回答。不幸的是,它实际上并没有解决这个问题。很遗憾听到这个消息。关于集成规范的并行测试说明似乎是最有可能的罪魁祸首。
julian    7128  7073 93 10:10 pts/1    00:09:54 rspec /home/julian/Lenda/lenda/spec/models/disclosures/docusign/refinance_loan_estimate_form_spec.rb:17 "RefinanceLoanEstimateForm should be able to be generated from non-completed applications"
julian    7141  7073 93 10:10 pts/1    00:09:50 rspec /home/julian/Lenda/lenda/spec/models/disclosures/disclosure_document_spec.rb:14 "DisclosureDocument retrieves fields signed by a signer"
julian    7147  7073 94 10:10 pts/1    00:09:58 rspec /home/julian/Lenda/lenda/spec/controllers/api/v1/applications_controller_spec.rb:192 "Api::V1::ApplicationsController admin user GET #show with a valid application_id "