2013-02-17 28 views
6

için webkit sürücüsünde süresiz olarak askıda kalıyor Teknik özelliklerimi capybara-webkit sürücüsündeki parallel_tests ile çalıştırıyorum. Aşağıdaki yakut ortamına sahip. Içeren bir gemset üzerinde RVM yoluyla RunningParalel Test Yürütme, rspec

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

aşağıdaki (alaka için Kapibara, raylar, RSpec ve parallel_tests için kesilmiş benim gemset daha büyük bir sargı görmeye yardım ederse, lütfen bana) bildirin: benim testlerin her tamamlanma çalıştırmak

*** LOCAL GEMS *** 

... 
capybara (1.1.2) 
parallel_tests (0.8.12) 
rails (3.2.11) 
rspec (2.11.0) 

Ben rake spec ile tek sürecine benim test takım çalıştırmak. parallel_tests aracılığıyla runnning zaman Ancak aşağıdaki işlemler gerçekleştirilir: süreçlerin bundan

8 processes for 220 specs, ~ 27 specs per process 

sonunda geri gelmeye başlayacaktır: İlk 6 süreçler gel sonra

Finished in 11 minutes 15.76 seconds 
Finished in 11 minutes 28.89 seconds 

Fakat, parallel_spec süresiz askıda kalacaktır, asla sonlandırmayın ve kalan 2 işlem için çıktı yazdırmayın.

Mac OS Pro'yu çalıştıran bir MacBook Pro'dayım, 2.4GHz Intel i7.

Bu yüzden sorum şu basit: Neden asılı, neden asılı olduğunu nasıl debug edebilirim ve nasıl askıya almasını engelleyebilir ve parallel_tests uygulamasının tamamlanmasına izin verebilirim?

+1

Buna bir çözüm buldunuz mu? Aynı problemle karşılaşıyorum. – blim8183

+0

Ditto. Parallel_tests ve bundler'ı boşuna yükseltdim. Şaşırtıcı. – annalogarhythm

+0

Ya tekrar 6'ya ölçeklendirirseniz? Yanlışlıkla veritabanı sunucunuzu ya da bir şeyleri boğup atmadığınızı merak ediyorum .... –

cevap

1

Rspec yapılandırmanız ve kitaplık kullanımınızla ilgili bazı bilgiler eksiktir, bu da muhtemelen buna bir yanıt verir. Bu, ben entegrasyon özellikleri için rspec çalışırken çok iş parçacıklı bir ortamda benzer davranış gördüm.

https://github.com/grosser/parallel_tests/wiki adresinde bulunan öneriler, tümleştirme özellikleriyle ilgili yanıltıcı görünüyor. DatabaseCleaner veya use_transactional_fixtures'un transaction stratejisine güvenmeye çalışmak, engellenmeyen herhangi bir veritabanı bağdaştırıcısının kilitlenmesine neden olacak şekilde garanti edilir.

Capybara, tümleştirme özellikleri için birden fazla iş parçacığı döndürür. İstemci ve sunucu iş parçacıkları aynı kayıtlarla aynı anda etkileşim kurmaya çalıştığında, genellikle zaman aşımları veya kilitlenmelerle sonuçlanırsınız. Bazen kilitlenme, paketinizin elle öldürülünceye kadar sürekli olarak askıda kalmasına neden olabilir.

Bunu önlemek için bulduğum en sağlam yapılandırma, ActiveRecord örnekleri ve DatabaseCleaner mantıksal kullanımı arasındaki bağlantıyı paylaşmanın birleşimidir.

# 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 
+0

Detaylı ve uzun cevap için teşekkürler. Ne yazık ki, bu sorunu çözmüyor. –

+0

Bunu duyduğuma üzüldüm. Parallel_tests entegrasyon özellikleri ile ilgili talimatlar en olası suçlu gibi görünüyordu. –