Önceki yazımızda “Flaky” testler ve bunların nedenlerinden bahsetmiştik. Bu yazımızda ise Flaky testler ile nasıl başa çıkılabileceğimizi konu alacağız.
Kısaca hatırlamak gerekirse Flaky Testler, kimi zaman hatasız bir biçimde çalışırken, kimi zaman aslında hiçbir hata olmamasına rağmen hata raporu üreten (false-positive) testler olarak tanımlanabilir. Kök sebeplerini incelendiğimizde senkronizasyon, Race Conditions, paralelizasyon, koşum sırası gibi durumların bulunduğunu gözlemliyoruz. Peki bu sebepleri nasıl ortadan kaldırabiliriz?
Syncronization
Bilindiği gibi test otomasyon piramidinde üst seviyelere doğru çıkıldıkça testler daha uçtan uca hâle gelirken, aynı zamanda daha kırılgan hâle de gelmektedir. Dış bağımlılıkların artması esas olarak bu fenomenin nedenini oluşturmaktadır. Network, disk, CPU ve benzeri kaynaklardaki darboğazlar sebebiyle cevap süreleri değişiklik gösterebilmektedir. Bu durumların testlerde flakiness’a sebep olmalarını engellemek için esnek bekleme kurguları yapmak faydalı olacaktır. Selenium Webdriver için Thread.sleep yerine WebDriverWait kullanımı örnek gösterilebilir.
Race Conditions & Parallelization
Testlerin paralel koşumu esnasında en çok ihmal edilen konuların başında Race Conditions gelmektedir. Özellikle yeterli ve uygun test verisinin bulunamadığı durumlarda, aynı verileri kullanmak durumunda olan test script’lerinin sıra ile koşumunda herhangi bir sorun yaşanmazken, paralel koşumu esnasında daha önce karşılaşılmayan sorunların gözlemlenmesi işten bile olmayacaktır. Bu durumla karşılaşmamak için Race Condition’a girebilecek testleri farklı suite’ler içerisine koyarak, suite’leri paralelize etmek fayda sağlayacaktır.
Order Dependency
Testlerde flaky sonuçlar almamıza neden olan etkenlerden bir diğeri de sıra bağımlılığıdır. Testlerin beklenilen sıra ve başarı ile koşulması durumunda herhangi sorunla karşılaşılmazken, aksi durumda bazı sorunlarla karşılaşmak mümkündür. Bu problemi çözmenin en uygun yolu ise tüm test senaryolarını birbirinden bağımsız ve atomik bir biçimde tasarlamak olacaktır. Bu sayede testlerin sıra bağımsız olması ile false-positive sonuçlar da belirli bir oranda azalacaktır.
Bu iyileştirmeler sonrasında flakiness oranınız muhakkak düşecek olmakla birlikte, henüz tamamen sıfırlanmamış da olabilir. Bu durumda unit testing framework’lerinden destek almak akıllıca olacaktır. Örneğin, TestNG flakiness’ı azaltmada oldukça güzel bir çözüm olarak projelerinizde size yardımcı olabilir.
TestNG’de bu desteği sağlayan interface’in ismi; IRetryAnalyzer. Interface’i projenize dahil ettiğinizde 5-10 satır kod ekleyerek probleminizi çözebiliyorsunuz. Değişiklikler sonrası eğer testiniz başarısız olursa, test tekrar koşmaya başlayacaktır. Bu sayede ilk koşumda çıkan bazı hatalar bir sonraki koşumda pozitif olarak işaretleneceği için günün sonunda, daha az sayıda hatalı test ile karşılaşacaksınız.
Konuyla ilgili örnek kodları da içeren blog post için, https://www.keytorc.com/blog/basarisiz-otomasyon-senaryosunu-otomatik-olarak-tekrar-kosmak_7289/
Berk Dülger
Consultant, Keytorc