Test Double Nedir?

Test Double Nedir?

Test Double kavramı, yazılım testleri sırasında kullanılan ve nesnelerin yerine geçerek diğer nesnelerin davranışlarını kontrol eden şablonlaştırılmış objelerdir Yazılım testleri, hata ayıklama sürecinde oldukça önemlidir ve Test Double, bireysel testlerin sayısını azaltarak test edilen kodun doğruluğunu garanti altına almada önemli bir rol oynar Farklı test double türleri arasında Mock, Stub ve Spy objeleri bulunur Mock objeleri, gerçek objelere benzer şekilde davranır ancak önceden tanımlanan yanıtları verir; Stub objeleri ise, kendilerine geçirilen bir senaryoya önceden belirlenmiş bir davranışı verecek şekilde ayarlanırlar Test double'lar, yazılım geliştirme sürecinde önemli bir araç seti oluşturur ve yazılım testlerinin daha güvenli, hızlı ve öngörülebilir olmasına yardımcı olur

Test Double Nedir?

Test Double kavramı, yazılım testleri sırasında kullanılmak üzere şablonlaştırılmış nesnelerin genel adıdır. Normal bir testte, işlevselliği test edilen nesnelerin bağımlılıkları, doğruluk sebepleri, performansı veya diğer faktörlerini ihlal etmeden, bu nesnelerin yanında kullanılırlar. Test Double, test edilen nesnenin yerine geçer ve nesneyle birlikte diğer nesnelerin davranışlarını kontrol etmeye izin verir.

Bu kavram, programlama dünyasında oldukça yaygın olarak kullanılmaktadır. Yazılım testleri, hata ayıklama sürecinde oldukça önemlidir ve Test Double, bireysel testlerin sayısını azaltmada ve test edilen kodun doğruluğunu garanti altına almada önemli bir rol oynamaktadır.

Test Double'lar, farklı senaryolarda kullanılır. Örneğin, test ettiğiniz şey, zamanlayıcılar veya veri depolama kaynakları gibi, dış dünya ile doğrudan etkileşimde olan bir nesne ise, Test Double kullanarak onun yerine geçebilirsiniz. Bu sayede, test ettiğiniz işlevselliği bozmazsınız ancak testleri daha etkili hale getirirsiniz.


Farklı Test Double Türleri

Test double'lar, bir yazılım sistemindeki dependentler (bağımlılıklar) ile yapılan testlerde kullanılan objelerdir. Bu objeler, fiziksel olmayan halde, dependentlerin yerine geçerek testlerin bağımsızlığını ve kontrolünü sağlar ve testlerin hızlı, güvenilir ve öngörülebilir olmasını sağlar.

Farklı test double türleri, farklı amaçlar için kullanılabilir. Bunlar arasında en yaygın olanları Mock, Stub ve Spy objeleridir.

Mock: Bir Mock objesi, bir dependent nesnesinin yerine geçer ve önceden tanımlanmış davranışlar üzerinden işlev görür. Bir Mock objesi, belirlenen davranışlara göre geri dönüş değerleri ve davranışlar üretir ve bir birim testinde kullanılabilir. Mock'lar, özellikle DB'ye bağlı kodların birim testlerinde faydalıdır.

Stub: Bir Stub objesi, bir dependent nesnesinin yerine geçer ve tek bir çıktıyı döndürür. Bu objeler, birden çok birim testinde kullanılabilir ve mock objelerinin aksine yalnızca belirli bir çıktı döndürür. Stub'lar, özellikle hizmet çağrıları gibi uzak nesnelerin birim testleri için faydalıdır.

Spy: Bir Spy objesi, bir bağımlılık nesnesinin davranışlarını izler, biriktirir ve rapor eder. Bunlar, kodun doğru çalıştığından emin olmak için bir kod içindeki bir değişkenin değerini belirlemek için kullanılabilir. Spy'lar, birim testlerinde kullanılarak bir dependentin ne zaman çağrıldığını ve başka nesnelerle nasıl birleştirildiğini görebilir.

Bu farklı test double türleri, yazılım testleri için önemli bir araç seti oluşturur ve her biri farklı test senaryolarında kullanılabilir. Hangi test double türünün uygulanacağına karar vermek için, kodun amacı ve test koşulları göz önünde bulundurulmalıdır.


Mock Nedir?

Test Double, yazılım testlerinde kullanılan sahte objelerdir. Bu objeler, testlerin doğru şekilde yapılabilmesi için gerçek objeleri taklit eder. Farklı test double türleri arasında Mock, Stub ve Spy bulunur. Mock objeleri, gerçek objelere benzer davranan ancak önceden tanımlanan yanıtları veren objelerdir. Bu sayede testlerde, gerçek objeleri test edebiliriz.

Mock objelerinin kullanım alanları arasında network, veritabanı ve harici servisler gibi dışa bağımlılıkları olan modüller yer alır. Testlerde çevrimiçi olarak çalışan servislere bağlanmak yerine, Mock objeleri kullanarak testlerin daha hızlı ve güvenli bir şekilde yapılabildiğinden bahsedebiliriz.

Ancak Mock objelerinin dikkat edilmesi gereken noktaları da vardır. Öncelikle, testlerin doğru çalışması için Mock objelerinin gerçek objelere mümkün olduğunca benzemesi gerekir. Ayrıca, seçilen Mock objelerinin kullanım alanı ve sınırları iyi belirlenmeli ve diğer test double türleriyle birlikte kullanılmalıdır.

  • Mock objeleri, gerçek objelere benzer şekilde davranabilir ancak önceden tanımlanan yanıtları verirler.
  • Çevrimiçi servislere bağlanmak yerine Mock objeleri kullanarak, testler daha hızlı ve güvenli bir şekilde yapılabilir.
  • Mock objelerinin gerçek objelere mümkün olduğunca benzemesi gerekir ve kullanım alanı iyi belirlenmeli.
  • Mock objeleri, diğer test double türleriyle birlikte kullanılmalıdır.

Mock objeleri, testlerin daha kolay bir şekilde yapılmasına ve dışa bağımlılıklardan bağımsız olunarak daha güvenli testlerin yapılmasına yardımcı olan önemli bir test double türüdür.


Stub Nedir?

Test double'lar yazılım geliştirme sürecinde oldukça önemli bir rol oynar. Bu bağlamda Stub objelerini kullanarak, yazılımdaki bağımlılıkları sınamak mümkündür. Stub objeleri, testlerin hızlı ve güvenilir olmasını sağlamak amacıyla var olan birimleri taklit ederler.

Stub objeleri, Mock objelerinden farklı olarak, kendilerine geçirilen bir senaryoya önceden belirlenmiş bir davranışı verecek bir şekilde ayarlanırlar. Böylece yazılımdaki birimlerin davranışları kontrol altına alınır.

Yazılım testleri yapılırken verilen bağımlı birimlerin yanlış davranışlar sergilememesi gereklidir. Bu bağlamda Stub objeleri, eğer bir bağımlı birimin doğru davranış sergilemediği tespit edilirse, bu davranışın düzenlenmesinde yardımcı olur. Test edilen bağımlı birimin davranışını kontrol altına alarak, test sürecini güvenli ve hızlı hale getirir.

Stub objeleri, birim testlerinde kullanılmak üzere kullanılabilen en iyi ergonomik araçlardan biridir. Bu nedenle, yazılım geliştirme sürecinde Stub objelerinin kullanımına özen gösterilmelidir. Ancak Stub objelerinin testler sırasında normal işleyişe müdahale etmediği ve kodun işlevselliğine katkı sağladığından emin olmak gerekmektedir.


Spy Nedir?

Spy objetleri, mock objelerine benzer şekilde davranışları taklit eder, ancak ekstra bir özellikleri vardır. Spy objeleri, belirli bir kodun ne kadar sıklıkla çağrıldığını, hangi parametrelerle çağrıldığını ve hangi değerlerin döndürüldüğünü öğrenmek için kullanılır. Bu tür objelerden elde edilen bilgiler, ölümcül bir hata oluşturmadan önce kodun istenen şekilde çalıştığından emin olmak için kullanılabilir.

Spy objeleri, gerçek bir HTTP isteği gibi de olabilir. Node.js, spy objeleri oluşturmak için Jasmine ve sinon spy gibi çeşitli araçlar sağlar. Bu araçlar, elimizdeki kodu geliştirmek için kullanılmak üzere spy objeleri oluşturmamıza olanak tanır. Bununla birlikte, dikkatli olmak önemlidir. Çünkü bu objeler, kodun performansını düşürebilir ve testlerin kullanılabilirliğini azaltabilir.

Spy objeleri, üretilen çıktıları takip etmek için kullanılır. Bu nedenle, kod hakkında birçok şey öğrenmek için kullanabilirsiniz. Ayrıca, kodun özelliklerini anlamak ve test etmek için kullanışlıdır. Ancak, karmaşık kodlarla çalışırken dikkatli olunmalıdır, çünkü performans problemleri veya yanlış anlamlı sonuçlar ortaya çıkabilir.

Genel olarak, spy objeleri, mock objeleri ve stub objeleriyle birlikte test double'ların ailesinden biridir. Kodlama mükemmeliyeti söz konusu olduğunda, her bir test double türünün yerinde ve uygun şekilde kullanılması gerekir. Bu, hataların azaltılması, kodun doğruluğunun ve güvenilirliğinin artırılması ve en önemlisi, müşteri tatmininin sağlanması için kesinlikle önemlidir.


Test Double Nasıl Kullanılır?

Test double'lar, bir Node.js projesinde test edilmek istenen işlevselliklerin, gerçek olmayan, simulasyonlara dayalı objeler ile nasıl test edileceğini gösterir. Bu, asıl amaçlanan testlerin başarısız olması durumunda projenin test sürecinin hızlı bir şekilde tekrar düzenlenmesine izin verir. Kullanılması gereken durumlar şunlardır:

  • Projede kullanılan dış bağımlılıkların gereksinimlerinin azaltılması
  • Testlerin başlatılması için bir gereksinim olarak tanımlanmayan üçüncü parti hizmetlerin basit simulasyonları
  • Asenkron nitelikli hizmetlerin çağrılmasının yönetimi ve simulasyonu
  • Test sürecindeki bağımlılıkların kontrolü

Test double'ların avantajları:

  • Kalite - İşlevsel testlerin zamanında yapılması sayesinde, yazılımın daha iyi kalitede olmasını sağlar.
  • Zaman - Test double'larla birlikte testlerin daha hızlı yürütülmesi mümkündür.
  • Maliyet - Test double'lar, yazılım değişiklikleri nedeniyle daha fazla para harcamadan testlerin yeniden düzenlenmesine olanak tanır.
  • Güven - Test double'ların kullanımı, işlevlerin doğru çalışıp çalışmadığı konusunda güven sağlar.

Özetle, herhangi bir işlevsellik oluşturulduğunda, test double'ların kullanımının göz önünde bulundurulması gerekmektedir. Bu, proje testlerinin daha hızlı ve daha güvenli bir şekilde yürütülmesine yardımcı olur.


Dependency Injection

Dependency Injection, bir yazılımın bağımlılıklarının yönetilmesi ve test edilebilirliğini artırmak için kullanılan bir tasarım kalıbıdır. Bu kalıp, bileşenlerin birbirleriyle doğrudan etkileşimini azaltarak, daha esnek ve modüler bir kod yapısı oluşturulmasını sağlar.

Node.js projelerinde Test Double'ların kullanımı da Dependency Injection sayesinde mümkün hale gelir. Bir bileşenin, başka bir bileşen tarafından kullanılacağı durumlarda bağımlılıklarının yerine mock veya stub gibi Test Double'lar verilerek kontrol edilebilir hale getirilir.

Dependency Injection Avantajları
Test edilebilir kod Bağımlılıkların yönetilmesi ve Test Double'ların kullanımı, yazılımın test edilebilirliğini artırır.
Esnek kod yapısı Dependency Injection, yazılımda bileşenler arasındaki doğrudan bağımlılıkları azaltarak, daha esnek bir kod yapısı oluşturur.
Modüler kod yapısı Dependency Injection, yazılımda bileşenler arasındaki iletişimi azaltarak, daha modüler bir kod yapısı oluşturur.

Node.js projelerinde Dependency Injection kullanımı ile birlikte Test Double'ların kullanımı, yazılımın test edilebilirliğini artırarak, daha esnek ve modüler bir kod yapısı elde edilmesini sağlar.


Nasıl Yazılır?

Test double'lar, kod yazarken kendimizi test etmek için kullandığımız bir tekniktir. Bununla birlikte, test double'ları yazmak için herkesin farklı bir yöntemi vardır.

Test double'lar genellikle birinci sınıf fonksiyonlar olarak yazılır. Bu tür bir fonksiyon, başka bir fonksiyon tarafından alınan ve çalıştırılan bir fonksiyondur. Bu, kodun daha kolay test edilebilmesini sağlar.

Aşağıdaki örnek kod, bir mock objesi oluşturmak için gösterilmiştir:

Açıklama Kod
Mock objesi oluşturma
          const mockFunc = jest.fn();              

Bu kodda, jest.fn() fonksiyonu bir mock objesi oluşturur. Bu mock objesi, istenen şekilde çalışacak şekilde programlanabilir.

Aşağıdaki örnek kod, bir spy objesi oluşturmak için gösterilmiştir:

Açıklama Kod
Spy objesi oluşturma
          const myObj = {    myFunc: () => {      console.log("Hello World!");    }  };  const spyFunc = jest.spyOn(myObj, "myFunc");              

Bu kodda, jest.spyOn() fonksiyonu bir spy objesi oluşturur. Bu spy objesi, fonksiyonun hangi durumlarda çağrıldığını ve ne zaman çağrıldığını takip eder.

Aşağıdaki örnek kod, bir stub objesi oluşturmak için gösterilmiştir:

Açıklama Kod
Stub objesi oluşturma
          const myObj = {    myFunc: () => {      return "Hello World!";    }  };  const stubFunc = jest.fn(() => {    return "Hello Unit Test!";  });              

Bu kodda, jest.fn() fonksiyonu bir stub objesi oluşturur. Bu stub objesi, istenen değerler veya hatalar dahil farklı durumlarda fonksiyonu çalıştırabilir.