Test dublörlerine geçmeden önce ihtiyacın nereden ortaya çıktı konusunu bir anlayalım;
Düzenli Testler (Regular Tests)
Durum doğrulamaları için hazırlanır ve tüm bağımlılıklara ihtiyaç vardır.
Örneğin, bir ürünün sepete başarılı olarak atıldığını test edebilmemiz için; kullanıcı, ürün ve sepet servis/modüllerine ihtiyacımız vardır. Bu işlevlerin testini yapabilmemiz için veritabanlarına, belki http sunucularına vs. hepsine gerçekten ihtiyaç duyarız yani bu bağımlılıklar bizim testimizin çalışabilmesi için gereklidir. Ayrıca bu senaryo gibi yüzlerce senaryomuzun olduğunu varsayacak olursak testlerin çalışması için ekstra maliyetlere katlanmamız gerektiğini farketmişsinizdir.
Peki elimizde gerçekten bir veritabanı vs. olmadan kodumuzu nasıl test edebiliriz? İşte tam bu noktada devreye sahte nesneler giriyor…
Sahte Nesneler ile Yapılan Testler (Tests with Mock Objects)
Davranış doğrulamaları için hazırlanır ve bağımlılıklara ihtiyaç yoktur. Testi kolaylaştırmak ve karmaşıklığı azaltmak için uygulama tarafında nesnelerin (genellikle bunlar bağımlı bileşenlerdir) basit sürümlerini kullanmamız ya da taklit etmemiz gerekebilir. İşte tam bu noktada gerçek bir nesne yerine kullanılan her türlü taklit nesne için Meszaros, Test Double’ı genel terim olarak kullanır. (Ayrıntılı bilgi: xunitpatterns.com/Test%20Double.html)
Test Dublörleri (Test Double)
Stub
Testler sırasında yapılan çağırımları yanıtlamak için önceden tanımladığımız verileri tutan (çoğunlukla dolaylı giriş kodu ile oluşturulan) nesnelerdir. Genellikle test için programlananların dışında hiçbir şeye cevap vermeyecek şekilde hazırlanır. Çağrıları gerçek verilerle yanıtlamak istemediğimizde ya da istenmeyen yan etkileri olan nesneleri dahil edemediğimiz veya dahil etmek istemediğimizde kullanılır.
Mock
Mock nesnelerle test edilen kodun çıktısı ile beklentilerimizi ve beklentimizin gerçekleştiği durumdaki çıktıyı doğrularız. Test edeceğimiz kod yürütülmeden önce beklentilerimizi tanımlayarak çıktılar hazırlayabiliriz. Ayrıca mock nesneler tüm çağırımları kaydederler ve işlemler tamamlandığında test senaryomuz doğrultusunda beklenen tüm eylemlerin gerçekleştiğini doğrulayabiliriz (bu sayede x metodu hiç çağırıldı mı, 3 kere mi çağırıldı, q metodu a,b,c parametreleri ile çağırıldığında x mi döndü sorularımızı yanıtlayabilir). Canlı kodu çağırmak istemediğimizde ya da çağırsak bile doğrulamanın kolay bir yolu olmadığında tercih ederiz. Örneğin tüm kullanıcılara push notification gönderiyor muyuzu test etmek kolay değildir. Bildirimleri gönderdikten sonra ayrıca başka bir test ile bildirimlerin alındığını kontrol eden bir teste ya da geri bildirime ihtiyaç duyarız. Bu gibi durumlarda ilgili metodun çağırılması halinde bildirimleri gönderdiğimizi varsayarız.
Fake
Canlı ortamdaki uygulamalara ait nesneyi takit eden genellike daha basit nesnelerdir. Örneğin veritabanından veri almanız gerektiğinde bunun için fake bir nesne oluşturup in-memory olacak şekilde bu nesne üzerinden sanki işlemler veritabanı üzerinde gerçekleşecek gibi veri alabilir ya da yanıtlar oluşturabiliriz.
Spy
Aslında stub ile benzerdir fakat daha yeteneklidir diyebiliriz. Bu türde dolaylı çıktılar daha sonra doğrulanmak üzere yakalanır ve kaydedilir. Örneğin işlemler sonrasında kaç bildirim gönderildiğini kaydeden bir servisi test etmek için kullanabiliriz.
Dummy
Genellikle parametre listelerini doldurmak için kullanılırlar. Üretilen nesneler metodlara verilir fakat asla kullanılmaz.