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

时间:2013-02-17 17:32:26

标签: ruby-on-rails rspec webkit capybara parallel-testing

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

 ruby -v
 ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.4.2]

在包含以下内容的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)

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

 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。

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

2 个答案:

答案 0 :(得分:1)

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

https://github.com/grosser/parallel_tests/wiki上发现的建议在集成规范方面似乎有误导性。尝试依赖transactionDatabaseCleaner的{​​{1}}策略可以保证导致任何非阻塞数据库适配器死锁。

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

我发现阻止这种情况的最可靠配置是共享use_transactional_fixtures个实例之间的联系以及明智地使用ActiveRecord

DatabaseCleaner

答案 1 :(得分:0)

为了调试您的Parallel spec执行卡住的位置,您需要了解流程的行为方式。这意味着一个或多个进程是否卡住,以及卡在什么规格上。

为此,您需要对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 "

您需要监视这些过程,直到不再更改为止。当它们完成时,它们消失了,所以最后,您可能只停留了一个或两个进程,但这实际上取决于您的测试套件。

您需要从那里分别调试该测试以发现问题。