Yazılım geliştirme süreçlerinde karşılaşılan en büyük sorunlardan biri yazılan kodun beklenildiği gibi çıktı verip vermeyeceğini öngörmektir. Büyük projelerde eklenen küçük bir fonksiyondaki hata bile tüm projenin çökmesine sebep olabilir. Bu soruna en iyi çözüm ise yazılan kodu test etmektir. Bu süreci otomatize etmek için de devreye “birim testleri” girer.
Birim testleri sayesinde her fonksiyonun ya da modülün tek başına doğru çalıştığından emin oluruz. Böylece hatalar erken fark edilir ve ileride ortaya çıkabilecek sorunların önüne geçilir. Bu yazıda Node.js projelerinde birim testlerinden bahsedeceğiz. Hangi araçları kullanabileceğimizi inceleyip basit bir kod örneği yazacağız.
Birim Testi Nedir ?
Birim testi, bir uygulamadaki belirli bir fonksiyon veya yöntemin doğru çalışıp çalışmadığını kontrol eden küçük bir kod parçasıdır. Temel olarak fonksiyona belirli girdiler verilir ve elde edilen çıktılar, beklenen sonuçlarla karşılaştırılır. Böylece kodun geliştiricinin amaçladığı mantığa göre çalışıp çalışmadığı doğrulanır.
Birim testleri tek tek yani izole şekilde çalıştırılır. Veritabanı, ağ veya başka sistem bileşenlerine bağlı olmamaları esastır. Eğer bir fonksiyonun dış bağımlılıkları varsa bu bileşenler genellikle simülasyonlar ile taklit edilir. Bu sayede yalnızca test edilen fonksiyonun davranışına odaklanmak mümkün olur.
Bir fonksiyon için birden fazla test senaryosu yazılabilir. Örneğin; doğru girdi, hatalı girdi, boş değer gibi farklı durumlar test edilerek fonksiyonun her koşulda beklenen davranışı gösterip göstermediği kontrol edilir. Her ihtimali test etmek mümkün olmasa da kritik senaryoları kapsamak yazılım kalitesi açısından büyük önem taşır.
Birim Test Stratejileri
Etkili birim testleri oluşturmak için tüm senaryoların kapsandığından emin olmak amacıyla şu temel teknikler izlenir:
- Mantık kontrolleri: Sistemin doğru hesaplamalar yapıp yapmadığını ve geçerli girdilerle beklenen yolu izleyip izlemediğini doğrulayın. Kod boyunca tüm olası yolların test edildiğinden emin olun.
- Sınır kontrolleri : Sistemin tipik, uç durum ve geçersiz girdileri nasıl işlediğini test edin. Örneğin, 3 ile 7 arasında bir tam sayı bekleniyorsa, sistemin 5'e (normal), 3'e (uç durum) ve 9'a (geçersiz girdi) nasıl tepki verdiğini kontrol edin.
- Hata yönetimi : Sistemin hataları düzgün bir şekilde işlediğini kontrol edin. Kod yanlış bir girdi aldığında hata fırlatıp mesaj mı dönüyor yoksa sistem mi çöküyor?
- Nesne yönelimli kontroller : Kod nesneleri değiştiriyorsa kodu çalıştırdıktan sonra nesnenin durumunun doğru şekilde güncellendiğini onaylayın.
Node.js ‘de Birim Test
Node.js ortamında da birim testler aynı mantıkla uygulanır. Fonksiyonlar tek tek test edilir, dış bağımlılıklar mock edilerek izole edilir ve otomatik test araçlarıyla tüm süreç hızlandırılır.
Not: Mock yazılım testlerinde gerçek bir bağımlılığın taklit edilmesi demektir. Yani bir fonksiyon ya da sınıf, normalde dış dünyaya (veritabanı, API gibi) bağlı olabilir. Birim testlerde bu bağımlılıkları gerçekten kullanmak yerine, onların sahte versiyonlarını (mock) koyarız.
Node.js Test Araçları
Node.js ortamında birim test yazmak için farklı araçlar tercih edilebilir. En yaygın kullanılan test araçları:
- Jest
- Mocha + Chai
- Vitest
- AVA
- node:test
Bu yazımızda en yaygın ve en çok destek gören araçlardan biri olan Jest kütüphanesini kullanacağız.
Node.js Ortamında Jest ile Birim (Unit) Test
Öncelikle Jest kütüphanesini node.js projemize ekleyelim. Bunun için terminal ekranında
npm init -y # package.json oluşturmak için npm install --save-dev jestKurulum tamamlandıktan sonra package.json dosyasında Jest kütüphanemizi test komutu olarak tanımlıyoruz :
{ "scripts": { "test": "jest" } }Bu komut ile terminalde “npm test” komutunu çalıştırdığımızda Jest otomatik olarak devreye girecek.
Test etmek için basit bir fonksiyon oluşturalım :
// sum.js function sum(a, b) { return a + b; // İki sayıyı toplayıp sonucu döner } module.exports = sum; // Fonksiyonu dışa aktarıyoruz ki test dosyasında kullanabilelim“sum” fonksiyonunun doğru çalışıp çalışmadığını anlamak için Jest test dosyamızı oluşturalım:
// sum.test.js const sum = require("./sum"); // Test edeceğimiz fonksiyonu içe aktarıyoruz // Birinci test: 2 + 3 işlemi 5 olmalı test("2 + 3 = 5 olmalı", () => { expect(sum(2, 3)).toBe(5); // Beklenen sonuç 5 }); // İkinci test: 0 + 0 işlemi 0 olmalı test("0 + 0 = 0 olmalı", () => { expect(sum(0, 0)).toBe(0); // Beklenen sonuç 0 });Burada expect(...).toBe(...) ifadesiyle fonksiyonun döndürdüğü değeri kontrol ediyoruz. Eğer beklenen sonuç ile dönen sonuç eşleşmezse test başarısız olur.
Testi çalıştıralım "npm test" ile. Terminal Çıktısı Şöyle olmalıdır :
PASS ./sum.test.js ✓ 2 + 3 = 5 olmalı (5 ms) ✓ 0 + 0 = 0 olmalıYeşil PASS çıktısı testlerin başarıyla geçtiğini gösterir. Eğer bir hata olsaydı Jest, hangi testin başarısız olduğunu ve beklenen/değer farkını bize raporlardı.
Hatalı Durumları Test Etmek : Birim testlerde sadece doğru çıktılar değil, hatalı senaryolar da kontrol edilmelidir. Örneğin sum fonksiyonunda sayı yerine başka tip de bir değer verilse ne olurdu ? Sum.js dosyasını güncelleyelim
// sum.js function sum(a, b) { // Eğer girdiler sayı değilse hata fırlatalım if (typeof a !== "number" || typeof b !== "number") { throw new Error("Parametreler sayı olmalıdır"); } return a + b; // Normal durumda iki sayıyı toplar } module.exports = sum;Burada typeof ile parametrelerin sayı olup olmadığını kontrol ettik. Eğer değilse, program çökmesin diye throw new Error(...) ile anlamlı bir hata fırlattık.
Test dosyasına yeni bir senaryo ekleyelim
// Yeni test: Parametreler sayı değilse hata fırlatmalı test("geçersiz parametreler için hata fırlatmalı", () => { expect(() => sum("2", 3)).toThrow("Parametreler sayı olmalıdır"); });Burada expect(() => sum("2", 3)).toThrow(...) ifadesiyle fonksiyonun hata fırlatıp fırlatmadığını kontrol ediyoruz. Eğer hata beklediğimiz mesajla eşleşirse test başarılı olur.
“npm test” ile çalıştırdığımızda beklenen çıktı bu olmalıdır :
PASS ./sum.test.js ✓ 2 + 3 = 5 olmalı ✓ 0 + 0 = 0 olmalı ✓ geçersiz parametreler için hata fırlatmalıSonuç
Birim testleri yazılım geliştirme süreçlerinde kodun güvenilirliğini artıran önemli adımlardan biridir. Fonksiyonları tek tek test etmek hataları erken yakalamayı ve ileride çıkabilecek sorunları önceden tespit etmeyi sağlar. Node.js ortamında bu süreci kolaylaştıran birçok kütüphane bulunsa da Jest basit kurulumu sayesinde sık tercih edilenler arasındadır.
KAYNAKLAR
Unit Testing - Software Testing
What is unit testing?
Best Node.js Unit Testing Frameworks




