Son yıllarda birkaç kez birkaç proje için iplik işleme kodu yazarken bu sorunla karşılaştım. Geç cevap veriyorum çünkü diğer cevapların çoğu, alternatifler sunarken test ile ilgili soruyu cevaplamıyor. Cevabım, çok iş parçacıklı koda alternatifin olmadığı durumlara yöneliktir; Ben bütünlük için kod tasarım sorunları ele almak, ama aynı zamanda birim test tartışmak.
Test edilebilir çok iş parçacıklı kod yazma
Yapılacak ilk şey, üretim iş parçacığı işleme kodunuzu, gerçek veri işleme yapan tüm kodlardan ayırmaktır. Bu şekilde, veri işleme tek iş parçacıklı kod olarak test edilebilir ve çok iş parçacıklı kodun yaptığı tek şey iş parçacıklarını koordine etmektir.
Hatırlanması gereken ikinci şey, çok iş parçacıklı koddaki hataların olasılıklı olduğudur; en az sıklıkla kendini gösteren hatalar, üretime gizlice girecek, üretimde bile yeniden üretilmesi zor olacak ve bu nedenle en büyük sorunlara neden olacak hatalardır. Bu nedenle, kodu hızlı bir şekilde yazmanın ve ardından çalışana kadar hata ayıklamanın standart kodlama yaklaşımı, çok iş parçacıklı kod için kötü bir fikirdir; kolay hataların sabit olduğu ve tehlikeli hataların hala orada olduğu kodla sonuçlanacaktır.
Bunun yerine, çok iş parçacıklı kod yazarken, kodu ilk başta hataları yazmaktan kaçınacağınız tutumuyla yazmalısınız. Veri işleme kodunu doğru bir şekilde kaldırdıysanız, iplik işleme kodu, hata yazmadan ve kesinlikle çok fazla hata yazmadan yazma şansınız olacak kadar küçük olmalıdır - tercihen birkaç satır, en az birkaç düzine satır -. , iplik geçirmeyi anlarsanız, zaman ayırın ve dikkatli olun.
Çok iş parçacıklı kod için yazı birimi testleri
Çok iş parçacıklı kod olabildiğince dikkatli bir şekilde yazıldıktan sonra, bu kod için testler yazmaya hala değer. Testlerin birincil amacı, yüksek zamanlama bağımlı yarış koşulu hatalarını test etmek için çok fazla değildir - bu tür yarış koşullarını tekrar tekrar test etmek imkansızdır - daha ziyade, bu tür hataları önlemek için kilitleme stratejinizin birden fazla iş parçacığının amaçlandığı şekilde etkileşime izin verdiğini test etmek .
Doğru kilitleme davranışını düzgün bir şekilde test etmek için, bir testin birden fazla iş parçacığı başlatması gerekir. Testi tekrarlanabilir hale getirmek için, iş parçacıkları arasındaki etkileşimlerin öngörülebilir bir sırada olmasını istiyoruz. Testteki dişleri harici olarak senkronize etmek istemiyoruz, çünkü bu, dişlerin harici olarak senkronize edilmediği yerlerde üretimde oluşabilecek hataları maskeleyecektir. Bu, çok iş parçacıklı kod testleri yazmak zorunda kaldığımda başarılı bir şekilde kullandığım teknik olan iplik senkronizasyonu için zamanlama gecikmelerinin kullanımını bırakır.
Gecikmeler çok kısaysa, test kırılgan hale gelir, çünkü testlerin çalıştırılabileceği farklı makineler arasındaki küçük zamanlama farklılıkları zamanlamanın kapanmasına ve testin başarısız olmasına neden olabilir. Tipik olarak yaptığım, test hatalarına neden olan gecikmelerle başlamak, testin geliştirme makineme güvenilir bir şekilde geçmesi için gecikmeleri arttırmak ve daha sonra gecikmeleri iki katına çıkarmak, böylece testin diğer makinelere geçme şansı yüksektir. Bu, testin makroskopik bir süre alacağı anlamına gelir, ancak benim deneyimime göre, dikkatli test tasarımı bu süreyi bir düzineden fazla sürmeyebilir. Uygulamanızda iş parçacığı koordinasyon kodu gerektiren çok fazla yere sahip olmamanız gerektiğinden, bu test paketiniz için kabul edilebilir olmalıdır.
Son olarak, testiniz tarafından yakalanan hataların sayısını takip edin. Testinizde% 80 kod kapsama alanı varsa, hatalarınızın yaklaşık% 80'ini yakalaması beklenebilir. Testiniz iyi tasarlanmış ancak hiçbir hata bulamıyorsa, yalnızca üretimde görünecek ek hatalara sahip olmamanızın makul bir şansı vardır. Test bir veya iki hata yakalarsa, yine de şanslı olabilirsiniz. Bunun ötesinde, kod işleme kodunuzu dikkatli bir şekilde gözden geçirmeyi veya hatta tamamen yeniden yazmayı düşünmek isteyebilirsiniz, çünkü kod hala kod üretilinceye kadar bulmak çok zor olacak gizli hatalar içerir ve çok o zaman düzeltmesi zor.