Test Stub
- Okunuşu
- test stab
Kısaca
Test stub, gerçek bir bağımlılığın yerine geçip test sırasında hazır yanıtlar döndüren nesnedir; böylece kod gerçek veritabanı veya servis olmadan test edilir.
Test stub nedir?
Test stub, test edilen kodun bir API istemcisi, bir veritabanı sorgusu ya da sistem saati gibi bir bağımlılığını, hazır yanıtlar, yani teste önceden yazılmış değerler döndüren basit bir nesneyle değiştirir. Kod stub'dan bir döviz kuru istediğinde 0,9 alır; tarihi sorduğunda 1 Ocak yanıtını alır. Test de ardından kodun bu yanıtlarla ne yaptığını kontrol eder.
Stub'lar testin, kodun dolaylı girdilerini, yani kodun kendi argümanları yerine çağırdığı nesnelerden aldığı verileri kontrol etmesini sağlar. Böylece gerçekte tetiklenmesi zor durumları oluşturmak kolaylaşır: bir kartı reddeden bir ödeme altyapısı, zaman aşımına uğrayan bir API, hiçbir şey bulamayan bir arama. Stub, başrol oyuncusu sahneyi çalışabilsin diye provada senaryodaki sabit replikleri okuyan bir yedek oyuncu gibidir; kimse yedek oyuncuya not vermez.
Terim, Gerard Meszaros'un 2007 tarihli xUnit Test Patterns kitabından gelir; kitap beş tür test double tanımlar: dummy, stub, spy, mock ve fake. Bir stub'ı küçük bir nesne olarak elle yazabilir ya da bir kütüphaneyle oluşturabilirsiniz: Mockito'nun when(...).thenReturn(...) ifadesi, Jest'in mockReturnValue metodu, Sinon'un sinon.stub() fonksiyonu ve Python'ın Mock(return_value=...) yapısı stub oluşturur; bu araçlar çoğu zaman her şeye mock dese de.
En sık karıştırılan ikili stub ve mock'tur. Stub yalnızca yanıt sağlar ve test, sonucu ya da test edilen kodun durumunu doğrular; mock ise nasıl çağrılacağına dair beklentiler de taşır ve örneğin sendEmail tam olarak bir kez çağrılmadıysa test başarısız olur. Martin Fowler'ın terimleriyle stub'lar durum doğrulamayı (state verification), mock'lar ise davranış doğrulamayı (behavior verification) destekler. Yalnızca sonuç önemliyse stub'ları tercih edin; çünkü her çağrıyı kontrol eden testler, uygulama her değiştiğinde bozulmaya eğilimlidir.
Önemli noktalar
- Test stub, gerçek bir bağımlılığın yerine geçer ve hazır yanıtlar döndürür.
- Test edilen kodun, tetiklenmesi zor hatalar dahil, dolaylı girdilerini kontrol eder.
- Stub tek başına bir testi asla başarısız kılmaz; test, sonucu doğrular.
- Mock nasıl çağrıldığını da doğrular; stub doğrulamaz.
- Dummy'ler, stub'lar, spy'lar, mock'lar ve fake'lerin hepsi test double'dır.
Örnek
// The code under test asks a rates service for the current exchange rate
function toEuros(amountUsd, ratesService) {
return amountUsd * ratesService.getRate("USD", "EUR");
}
// The stub: no network, no logic, just a canned answer
const ratesStub = { getRate: () => 0.9 };
test("converts dollars to euros", () => {
expect(toEuros(100, ratesStub)).toBe(90); // check the result, not the calls
});
// A mock would also check that getRate was called with ("USD", "EUR").Sık sorulan sorular
Stub ile mock arasındaki fark nedir?
Stub, test edilen kod çalışabilsin diye hazırlanmış yanıtlar döndürür; test de ardından sonucu kontrol eder. Mock ise çağrılarını kaydedip beklentilerle karşılaştırır; bu yüzden kod onu yanlış biçimde çağırdığı için test başarısız olabilir.
Stub ile fake arasındaki fark nedir?
Stub sabit yanıtlar döndürür ve gerçek bir mantık içermez. Fake ise kayıtları gerçekten saklayıp bulan bellek içi bir veritabanı gibi, çalışan ama basitleştirilmiş bir uygulamadır ve birçok çağrı boyunca gerçekçi davranış gerektiren testlere uyar.
Stub'ı ne zaman kullanmalıyım?
Test edilen kod yavaş, güvenilmez ya da maliyetli bir bağımlılıktan veri almaya ihtiyaç duyduğunda ya da bir hata veya boş bir liste gibi belirli bir yanıta ihtiyacınız olduğunda. Önemli olan sonuç, e-posta göndermek gibi başka bir sisteme yapılan bir çağrıysa mock ya da spy daha uygun olur.
İlgili sayfalar
- MockingTest ve Kalite, s. 16Mocking, kodu yalıtılmış biçimde test etmek için veritabanı ya da API gibi gerçek bir bağımlılığı kontrol ettiğiniz bir sahteyle değiştiren test tekniğidir.
- Birim TestiTest ve Kalite, s. 4Birim testi, bir fonksiyonun, metodun ya da sınıfın programın geri kalanından yalıtılmış olarak doğru davrandığını doğrulayan küçük ve otomatik bir kontroldür.
- Dependency InjectionYazılım Mimarisi, s. 11Dependency injection, bir nesnenin ihtiyaç duyduğu diğer nesneleri kendisi oluşturmak yerine dışarıdan almasını sağlayan bir tasarım tekniğidir.
- Test FixtureTest ve Kalite, s. 29Test fixture, bir testin çalışmadan önce ihtiyaç duyduğu örnek veri ya da yapılandırılmış nesne gibi bilinen durum ile onu kurup temizleyen koddur.
- Entegrasyon TestiTest ve Kalite, s. 7Entegrasyon testi, kod, veritabanı ve API gibi bir sistemin birkaç parçasının birlikte doğru çalışıp çalışmadığını kontrol eden otomatik bir testtir.
- Test Odaklı GeliştirmeTest ve Kalite, s. 31Test odaklı geliştirme, önce başarısız bir test yazdığınız, sonra onu geçirecek kadar kod yazıp ardından tasarımı temizlediğiniz bir kodlama pratiğidir.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin