2010-12-14 13 views
8

Uygulamamı kullanırken, kullanıcı tarafından tetiklenen olayları takiben görevleri eşzamansız olarak çalıştırmak için NSOperationQueue kullanan bazı kodlarda bir yarış durumuyla karşılaştım. Yarış koşulunu nasıl düzeltebileceğimi biliyorum, çünkü içine girmeyeceğim aptal bir tasarım hatasıdır, ancak bir test vakası ile hatayı kanıtlamak isterim (böylece optimizasyon/yeniden sıralama sırasında geri gelmez) çizgiden aşağı). Bu beni güldürdü. Özellikle testin amacı bir yarış durumu oluşturmak olduğunda, çok iş parçacıklı bir şeyi test etmekle nasıl baş edilir?Ünite test koduna dayalı kod? Bir yarış koşulunu zorlamak

İplik ve birim testleri ile uğraşırken, referans malzemeyle herhangi bir bağlantısı var mı? Özellikle yarış durumu üretimi ile ilgileniyorum.

+0

Paylaşılan veri yapılarını taklit edeceğinizi ve sahte nesnelerin içinde farklı iş parçacıklarını "yanlış" düzende yürütmek için gereken herhangi bir eşitleme işlemini yapabileceğinizi varsayardım. –

cevap

4

Yarış koşullarına neden olan olayların sırasının gerçekten test sırasında ortaya çıktığından emin olmalısınız. Bunun için, test davasındaki iplik araya sokmayı etkilemeniz gerekir.

Bunu ek (koşullu) senkronizasyon veya (daha basit ve daha az güvenilir) ek zamanlayıcılar ile elde edebilirsiniz. Diğer iş parçacığının istenmeyen duruma ulaşması için yeterince uzun süre çalıştıklarından emin olmak için kritik bölümlere bazı uyku() çağrıları koyun. Çalıştığınız zaman, uyku çağrılarını açık senkronizasyon ile değiştirin (yani, bir diğeri gerçekten varmış olduğunu onaylayana kadar bir iş parçacığını engelleyin). Daha sonra, tüm bunları, koşulun, test vakası tarafından belirlenen global bir bayrakta yapmasını sağlayın.

+3

Gerçekten, gerçek üretim kodunu bu özel sınama ile sıkı bir şekilde eşleştirmenin iyi bir fikir olmadığını düşünüyorum. Bu, kodlamayı yeniden düzenlediğinizde bu kuplajı bozmama konusunda dikkatli olmanız gerektiği anlamına gelir, ki bu da bu testin ilk sırada yer almasını engeller. –

+0

Hayır, kırılganlık wrt. Refactoring için bu test yaklaşımını destekliyor. Refactor, yarış koşullarını yeniden düşünmek zorunda kalacaksınız. Daha sonra, refakatçılığın gerçekten yeni olanları ya da daha önceden savunmasız olanların artık gerçekleşemeyeceğini keşfettiniz. –

+0

Sadece, bu, potansiyel yarış koşullarını yeniden gözden geçirmeyi yeniden başlatan "kuvvetleri" ya da bunu yapmanın aslında yararlı olduğunu görmüyorum. Açıkçası, yarış koşullarını düşünmek ilk kez işe yaramadı. Kodu önemli ölçüde geri çeviren herkes, mevcut test kodunu tamamen atmak ve yenilerini yazmak veya test kodunu işe yaramaz hale getirmek zorunda kalacaktır. Her iki durumda da test kodunun amacını ortadan kaldırır. Ana kod tabanını kirletmeyen test koduna sahip olmak daha iyi olurdu, ancak bunun yerine, yapıyı bozuk olarak işaretler. –

İlgili konular