2015-08-06 24 views
6

(Şimdiye kadar https://www.ruby-forum.com/topic/6876320 adresinden gönderildi, ancak burada çapraz yanıt verildi, çünkü şimdiye kadar bir yanıt almadım).Ruby: Minitest, test birimi ve örnek değişkenleri

Minitest ve/veya Test :: Unit testler koşutlama ilgili bir soru (parallelize_me yani doğru kullanımı!):

Birkaç testler ihtiyaç duyduğu bazı yardımcı yöntemler, olduğunu varsayalım. Benim anlayış, böyle bir yöntem (basitleştirilmiş örnekte) böyle bir şey yapamadı:

def prep(m,n) 
@pid = m 
@state = n 
end 

def process 
if @stat > 5 && @pid != 0 
    ... 
else 
    ... 
end 
end 

Ben Minitest ve test ünitesinde bunu yapamaz düşünüyorum ben hazırlık ve süreç gelen çağrı çünkü eğer Test fonksiyonumdan birkaçı, testler artık paralel hale getirilemiyor - bu test fonksiyonları hepsi aynı örnek değişkenini ayarladı ve okudu. Sağ? Şimdi

, benim sorum şu yaklaşım paralelizasyon için güvenli olup olmayacağı:

def setup 
    @pid ||= {} 
    @state ||= {} 
end 

Benim "yardımcı yöntemler: Ben bu değişken örneği değişkenlerin tümünü Böyle kurulumunda başlatıldı karma yapmak "(örneğin, deney yöntemin adı) bir anahtar almak ve onların erişmek için kullanabilirsiniz 'kendi' hash elemanı: Bu biraz çirkin

def prep(key,m,n) 
@pid[key] = m 
@state[key] = n 
end 

def process 
if @stat[key] > 5 && @pid[key] != 0 
    ... 
else 
    ... 
end 
end 

ama: Bu güvenilir bir yaklaşım mı? Karma bir iş parçacığı güvenli erişim bu şekilde mi? Bunu daha iyi nasıl yapabilirim?

cevap

1

En azından Minitest içinde güvenle @form olmadan

setup do 
    @form = Form.new 
end 

paralel testler arasında karışmasını, örneğin, yapabilirsiniz, böylece bu yaklaşım güvenli de olmalı:

def setup 
    @stat = m 
    @pid = n 
end 

anlamına gelir Orijinal yaklaşımınız da güvende olmalıdır.

================

UPDATE

dikkate almaktadır @random erişmek 100 farklı testler tanımlayan bir kod parçası aşağıdaki özü setuphttps://gist.github.com/bbozo/2a64e1f53d29747ca559

yılında temelde her Test güvenlik sorunu değildir iplik yüzden kapsüllü olup, her testte önce çalıştırılır, setup ayarlanan şeyler testler arasında paylaşılmadığını fark edecektir.

+0

Orijinal yaklaşımım nasıl çalışır?'setup' herhangi bir test vakasından önce hemen çağrılır ve örnek değişkenler (@stat ...) test durumları arasında paylaşılır. Vakalar paralel olarak çalışıyorsa (birkaç evrede), örnek değişkenler üzerinde bir yarış koşulumuz var. – user1934428

+0

@ user1934428, umarım güncellemem yardımcı olur :) – bbozo

+0

Gerçekten yapar! Ancak, yazdığınız ana kod, aslında durumu kanıtlamıyor. Çoğu durumda, çıktı sadece bir dizi kurulum/test/kurulum/test/..., bu yüzden değişken testler arasında paylaşılsa bile, çıktıyı alırsınız. Çıktının kurulum/kurulum/test/test olduğu iki durum, belki de, çıkış arabelleklemesinin bir artefaktı olabilir. Kodunuzu biraz değiştirmek, bu durumları göz ardı etmek için özgürlüğü aldım ve değiştirilen kod gerçekten sizin ifadenizi kanıtlıyor. – user1934428

0

Karmalamalarla ilgili yaklaşımınız mantıklı ve iş parçacıkları arasında ayrım yapmak için çalışacaktır. Sorun Global Tercüman Kilidi ile ilgilidir.

Yardımcı yöntemleriniz IO-bağlı olmadıkça (HTTP istekleri, yuva istekleri, yerel dosyaları yönetme) sürece, Ruby'nin çok fazla işlem yapması (bazı şeyleri basitleştirmek için) kodunuzu birden çok iş parçacığı üzerinde sırayla çalıştırması nedeniyle bir hız artışı görmezsiniz. garantili çalışma emri olmadan.

İyi şanslar!

İlgili konular