Sahte nesne (mocking): testte gerçek bağımlılığın yerine ne konur?
Sözlük

Sahte nesne (mocking): testte gerçek bağımlılığın yerine ne konur?

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 4 dk okuma

Mock, stub ve fake, testlerde gerçek bağımlılıkların yerini alan sahte nesnelerdir. Aralarındaki farkı, Jest örneğini ve aşırı mocklamanın risklerini öğrenin.

Sahte nesne ve mocking nedir?

Mocking, bir testte gerçek bir bağımlılığın yerine kontrol edilebilir bir sahte nesne koymaktır. Test edilen kod bir veritabanını, ödeme servisini, e-posta gönderimini ya da saati kullanıyorsa; testin bu dış parçalara bağımlı kalması yavaşlık, rastgele hata ve yan etki doğurur. Sahte nesne bu bağımlılığı taklit eder, böylece test yalnızca sınadığı koda odaklanır.

Sektörde bu tür nesnelere genel olarak test çiftleri (test doubles) denir. Film çekimlerindeki dublör benzetmesi tanıdıktır: gerçek oyuncu yerine sahnede onun adına duran biri. Gündelik konuşmada hepsine mock denmesi yaygındır, oysa türleri arasında anlamlı farklar vardır.

Mock, stub, fake, spy ve dummy farkı

Test çiftlerinin türleri, ne yaptıklarına göre ayrılır:

  • Dummy: yalnızca parametre listesini doldurmak için verilen, hiç kullanılmayan nesne.
  • Stub: önceden belirlenmiş cevapları döner. "Kullanıcıyı sorgula" çağrısına hep aynı kullanıcıyı verir. Durum odaklıdır; testin girdisini kontrol eder.
  • Fake: gerçek davranışı basitleştirilmiş çalışan bir uygulamadır. Bellek içi veritabanı tipik örnektir. Gerçek gibi davranır ama üretimde kullanılmaz.
  • Spy: gerçek ya da sahte nesneyi sarıp ona ne kadar ve hangi argümanlarla çağrıldığını kaydeder.
  • Mock: beklentileri önceden tanımlanmış nesnedir. "E-posta servisi şu argümanla çağrılmalı" der; beklenti karşılanmazsa test başarısız olur. Davranış doğrulamaya odaklıdır.

Bu sınıflandırma yazılım literatüründe yaygın olarak kullanılır; araçlar ise sınırları bulanıklaştırabilir.

Basit bir örnek

Örneğin sipariş onaylandığında müşteriye e-posta gönderen bir fonksiyon test edilecek olsun. Gerçek e-posta servisini her testte çağırmak istemeyiz.

Jest ile sahte bir gönderici şöyle kurulabilir:

const sender = { send: jest.fn() }; confirmOrder(order, sender); expect(sender.send).toHaveBeenCalledWith(order.customerEmail);

Burada send fonksiyonu sahtedir; çağrılıp çağrılmadığı ve hangi argümanla çağrıldığı doğrulanır. Sahte fonksiyonun dönüş değerini belirlemek gerekirse mockReturnValue ya da asenkron durumlarda mockResolvedValue kullanılır. Bu durumda sahte nesne stub gibi davranır; çağrı doğrulaması eklendiğinde mock rolünü de üstlenir. Modülün tamamı jest.mock ile değiştirilebilir, tek bir metot ise jest.spyOn ile izlenebilir.

Mocking ne zaman kullanılır?

Sahte nesneler şu durumlarda işe yarar:

  • Bağımlılık yavaşsa: ağ, disk, veritabanı.
  • Bağımlılık öngörülemezse: saat, rastgele değerler, dış servis yanıtları.
  • Bağımlılık yan etki doğuruyorsa: e-posta, ödeme, bildirim gönderme.
  • Hata senaryoları denenecekse: dış servisin hata dönmesi, zaman aşımı gibi durumlar gerçekte kolay üretilmez, sahte nesneyle kolayca üretilir.
  • Bağımlılık henüz yazılmadıysa: ekipler arayüz üzerinden paralel çalışabilir.

Bu sayede testler hızlı, tekrarlanabilir ve birbirinden bağımsız kalır. Test yalıtımı (test isolation) denen bu özellik, birim testlerin temel gereğidir.

Aşırı mocklamanın riskleri

Her şeyi sahteleştirmek, testin gerçek sistem hakkında az şey söylemesine yol açar. Sahte nesneler gerçekten farklı davranırsa test geçer ama üretimde hata çıkar. Ayrıca testler kodun iç ayrıntılarına sıkı bağlanır: bir metodun hangi sırayla hangi alt çağrıları yaptığını doğrulayan test, işlev aynı kalsa bile yeniden yapılandırmada kırılır.

Bu yüzden pratik kural şudur: kendi kontrolünüzde olmayan sınırlar (ağ, dış servis, saat) sahteleştirilir; kendi iş mantığınız mümkün olduğunca gerçek kullanılır. Bellek içi fake'ler çoğu zaman karmaşık mock kurulumlarından daha okunabilirdir. Entegrasyon testleri ise sahte nesnelerin gerçekle uyuşup uyuşmadığını doğrulamak için gereklidir.

Bağımlılık enjeksiyonu ile ilişkisi

Mocking, kodun bağımlılıklarını dışarıdan almasıyla kolaylaşır. Bir sınıf ihtiyaç duyduğu servisi kendi içinde oluşturuyorsa test sırasında değiştirmek zordur. Servis yapıcı metoda ya da parametreye verildiğinde, testte sahtesi, üretimde gerçeği geçirilir. Bu yaklaşım bağımlılık enjeksiyonu olarak bilinir.

Bu bakış açısıyla mocking yalnızca bir test tekniği değil, tasarım geri bildirimidir: bir sınıfı test etmek için çok sayıda sahte nesne gerekiyorsa sınıf muhtemelen fazla sorumluluk taşıyordur. Kod kapsama ölçümü, sahte nesneyle hangi dalların denendiğini görmek için birlikte kullanılabilir.

Mindset programlarında nerede çalışılır?

Test Driven Development (TDD) ve Unit Testing Uzmanlığı Eğitimi programında Mocking ve Test Isolation Teknikleri modülü, bağımlılıkların nasıl yalıtılacağını ve test çiftlerinin ne zaman gerektiğini işler. Birim test alışkanlığını ekip düzeyinde yerleştirmek isteyen yazılım ekipleri için uygundur.

Jest ile JavaScript Birim Testleri programının Taklit (Mocking) Stratejileri modülü ise aynı konuyu JavaScript ekosisteminde, asenkron kod ve hata senaryolarıyla birlikte ele alır. Web arayüzü ve Node.js geliştiricileri bu modülden doğrudan faydalanabilir.

İlgili Mindset programı

Test Driven Development (TDD) ve Unit Testing Uzmanlığı Eğitimi

Sık sorulanlar

Sık sorulan sorular

Mock ile stub arasındaki temel fark nedir?

Stub, testin girdisini kontrol eder: önceden verilen cevabı döner. Mock ise çıktıyı doğrular: belirli bir çağrının belirli argümanlarla yapılıp yapılmadığını kontrol eder. Pratikte araçlar bu rolleri tek nesnede birleştirir, bu yüzden fark sınıflandırmadan çok testin neyi sınadığıyla ilgilidir.

Fake ne zaman mock yerine tercih edilmelidir?

Bağımlılığın davranışı karmaşıksa, örneğin veritabanı gibi sorgu ve durum içeriyorsa, bellek içi bir fake birçok testte yeniden kullanılabilir ve daha gerçekçidir. Mock ise tek bir çağrının yapıldığını doğrulamak gibi dar durumlarda uygundur. Fake bakım maliyeti taşır ama daha az kırılgan testler sağlar.

Her bağımlılığı mocklamak iyi bir pratik midir?

Hayır. Her şeyi sahteleştirmek testi gerçekten ayırır ve üretimde çıkacak entegrasyon hatalarını gizler. Yalnızca yavaş, öngörülemez ya da yan etkili sınırlar sahteleştirilir. Kendi iş mantığınız mümkün olduğunca gerçek nesnelerle denenir ve entegrasyon testleri sahtelerin gerçekle uyumunu doğrular.

Mock kullanmak test sürelerini kısaltır mı?

Genellikle evet. Ağ, disk ve veritabanı çağrıları testlerin en yavaş parçalarıdır; bunların yerine bellek içi sahteler konunca testler çok daha hızlı koşar. Hız kazancı, testlerin sık çalıştırılmasını ve sürekli entegrasyonda hızlı geri bildirim verilmesini kolaylaştırır.

Mock Nedir? Sahte Nesne, Stub ve Fake Farkları