gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:20:01 25 4
gpt4 key购买 nike

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

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

在包含以下内容的 gemset 上运行 rvm(为相关性而截断了 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 运行到完成?

最佳答案

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

https://github.com/grosser/parallel_tests/wiki 上找到的建议似乎在集成规范方面具有误导性。试图依靠transaction DatabaseCleaner的策略或 use_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

关于ruby-on-rails - rspec 的并行测试执行无限期挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14923911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com