(Ş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?
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
@ user1934428, umarım güncellemem yardımcı olur :) – bbozo
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