Node.js İle Unit Test Yazımı İçin Jest Entegrasyonu Nasıl Yapılır?

Node.js İle Unit Test Yazımı İçin Jest Entegrasyonu Nasıl Yapılır?
Node.js İle Unit Test Yazımı İçin Jest Entegrasyonu Nasıl Yapılır?

Ön Hazırlık ve Ortam Kurulumu

Jest entegrasyonuna başlamadan önce sisteminizde Node.js'in güncel bir sürümünün (LTS) kurulu olduğundan emin olmalısınız. Projenizi başlatmak ve gerekli bağımlılıkları yüklemek için terminalinizde aşağıdaki adımları izleyin. İlk olarak, projenizi başlatarak bir package.json dosyası oluşturun.

mkdir node-jest-projesi
cd node-jest-projesi
npm init -y

Bu komut, projenizin temel yapılandırma dosyasını oluşturacaktır. Ardından, Jest kütüphanesini projenize "development dependency" (geliştirme bağımlılığı) olarak eklemeniz gerekir. Bu, Jest'in sadece geliştirme aşamasında kullanılacağını ve üretim ortamına (production) taşınmayacağını belirtir.

npm install --save-dev jest

Kurulum tamamlandıktan sonra, package.json dosyanız içerisinde yer alan scripts bölümünü güncelleyerek test komutunu tanımlamalısınız. Bu, npm test komutunu her çalıştırdığınızda Jest'in tetiklenmesini sağlar.

"scripts": {
  "test": "jest"
}

İlk Test Dosyanızı Oluşturma ve Yapılandırma

Jest, varsayılan olarak .test.js veya .spec.js uzantılı dosyaları tarar. Testlerinizi organize etmek için src veya tests klasörü oluşturmak iyi bir pratiktir. Şimdi basit bir toplama fonksiyonu yazalım ve bunu test edelim.

Öncelikle math.js adında bir dosya oluşturun ve içerisine basit bir fonksiyon ekleyin:

// math.js
function topla(a, b) {
  return a + b;
}
module.exports = topla;

Şimdi bu fonksiyonu test edecek math.test.js dosyasını oluşturalım. Jest'in sunduğu test veya it bloklarını kullanarak beklentilerimizi tanımlayacağız.

// math.test.js
const topla = require('./math');

test('iki sayının toplamı doğru hesaplanmalı', () => {
  expect(topla(1, 2)).toBe(3);
});

Testi çalıştırmak için terminale npm test yazmanız yeterlidir. Jest, dosyadaki testleri otomatik olarak bulacak ve sonuçları size raporlayacaktır.

Jest ile Mocking (Sahte Nesne) Kullanımı

Gerçek dünya projelerinde, veritabanı veya dış API servisleri ile etkileşim kuran fonksiyonları test etmek zor olabilir. Jest, jest.fn() ve jest.mock() araçlarıyla bu bağımlılıkları taklit etmenize olanak tanır. Bu, testlerinizin izole ve hızlı çalışmasını sağlar.

Aşağıdaki örnekte, bir API servisinden veri çeken fonksiyonun nasıl mock'lanacağını görebilirsiniz:

// api.js
const axios = require('axios');

const veriGetir = async () => {
  const response = await axios.get('https://api.ornek.com/veri');
  return response.data;
};
module.exports = veriGetir;

Test dosyasında axios kütüphanesini mock'layarak gerçek bir ağ isteği yapmadan fonksiyonu test edebiliriz:

// api.test.js
const veriGetir = require('./api');
const axios = require('axios');

jest.mock('axios');

test('başarılı veri çekme simülasyonu', async () => {
  const veri = { id: 1, isim: 'Test' };
  axios.get.mockResolvedValue({ data: veri });

  const sonuc = await veriGetir();
  expect(sonuc).toEqual(veri);
});

Test Senaryolarında Karşılaştırma Tablosu

Jest'in sunduğu farklı test yöntemleri, projenizin ihtiyacına göre çeşitli avantajlar sağlar. Aşağıdaki tablo, yaygın kullanılan test yaklaşımlarını özetlemektedir:

Yöntem Avantajı Dezavantajı
Unit Test Hızlı, izole, kolay hata ayıklama Entegrasyon hatalarını yakalamaz
Mocking Dış servislere bağımlılığı keser Mock'lar gerçek davranışı yansıtmayabilir
Snapshot UI veya karmaşık nesneleri doğrular Değişikliklerde sürekli güncelleme ister

Kod Kapsamı (Code Coverage) Raporlama

Yazılım kalitesini artırmak için yazdığınız testlerin kodunuzun ne kadarını kapsadığını bilmek önemlidir. Jest, --coverage bayrağı ile bu analizi otomatik olarak yapar. Bu, test edilmemiş fonksiyonları veya koşullu ifadeleri (if/else) bulmanıza yardımcı olur.

npm test -- --coverage

Bu komut çalıştırıldığında, projenin kök dizininde coverage klasörü oluşur. Bu klasör içerisindeki index.html dosyasını tarayıcınızda açarak hangi satırların test edilmediğini görsel olarak görebilirsiniz.

Güvenlik Uyarısı: Test dosyalarınızda asla gerçek veritabanı şifreleri, API anahtarları veya kişisel veriler kullanmayın. Test ortamında her zaman sahte (mock) veriler kullanın ve hassas bilgileri .env dosyalarında tutarak test ortamına dahil etmeyin. Kod güvenliği konusunda sorumluluk geliştiriciye aittir.

Sıkça Sorulan Sorular

Jest ile asenkron fonksiyonlar nasıl test edilir?

Jest, async/await yapısını doğal olarak destekler. Test fonksiyonunu async olarak tanımlayıp await ile beklentilerinizi (expect) kontrol edebilirsiniz.

Test dosyalarım neden bulunamıyor?

Jest varsayılan olarak __tests__ klasörlerini veya .test.js uzantılı dosyaları arar. Eğer dosyalarınız farklı bir dizindeyse, package.json içerisinden jest konfigürasyonunu güncelleyerek roots ayarını değiştirmeniz gerekebilir.

Snapshot testi tam olarak nedir?

Snapshot testi, bir nesnenin veya UI bileşeninin mevcut durumunu bir dosyaya kaydeder. Bir sonraki test çalıştırmasında, mevcut durumun kaydedilen "anlık görüntü" ile eşleşip eşleşmediğini kontrol eder.

Jest'i TypeScript ile kullanabilir miyim?

Evet, Jest TypeScript ile tamamen uyumludur. Ancak ts-jest paketini kurmanız ve jest.config.js dosyasını buna göre yapılandırmanız gerekmektedir.

Testlerimi nasıl daha hızlı çalıştırabilirim?

Jest, varsayılan olarak testleri paralel çalıştırır. Eğer testleriniz çok yavaşsa, --runInBand komutunu kullanarak testleri sırayla çalıştırabilir veya --onlyChanged bayrağı ile sadece değişen dosyaları test edebilirsiniz.

Jest ile Debugging (Hata Ayıklama) Süreçlerini Optimize Etme

Testleriniz beklenmedik bir şekilde başarısız olduğunda, kodunuzun akışını adım adım izlemek için Jest'in yerleşik hata ayıklama araçlarını kullanmak en etkili yöntemdir. Node.js'in --inspect-brk bayrağını kullanarak, Chrome DevTools veya VS Code Debugger üzerinden testlerinizi satır satır inceleyebilirsiniz.

VS Code Üzerinde Debugging Yapılandırması

Projenizin kök dizininde bulunan .vscode/launch.json dosyasına aşağıdaki yapılandırmayı ekleyerek, doğrudan editörünüz üzerinden testlerinizi debug edebilirsiniz:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Jest Testlerini Debug Et",
      "program": "${workspaceFolder}/node_modules/jest/bin/jest.js",
      "args": ["--runInBand"],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "disableOptimisticBPs": true
    }
  ]
}

Bu yapılandırma ile test dosyanıza bir breakpoint (kesme noktası) koyduğunuzda, testiniz o satıra geldiğinde duracak ve değişkenlerin o anki değerlerini incelemenize olanak tanıyacaktır.

Jest Testlerinde İleri Seviye Eşleştiriciler (Custom Matchers)

Jest'in sunduğu standart toBe veya toEqual eşleştiricileri çoğu zaman yeterlidir; ancak karmaşık iş mantıklarını test ederken kendi özel eşleştiricilerinizi yazmak, test kodunuzun okunabilirliğini ciddi oranda artırır. Örneğin, bir sayının belirli bir aralıkta olup olmadığını kontrol eden bir eşleştirici tanımlayalım.

Özel Eşleştirici Tanımlama

Öncelikle jest.setup.js dosyanızda veya test dosyanızın başında expect.extend metodunu kullanmalısınız:

expect.extend({
  toBeWithinRange(received, floor, ceiling) {
    const pass = received >= floor && received  `beklenen ${received} değerinin ${floor} ile ${ceiling} arasında olmaması`,
        pass: true,
      };
    } else {
      return {
        message: () => `beklenen ${received} değerinin ${floor} ile ${ceiling} arasında olması`,
        pass: false,
      };
    }
  },
});

test('sayı aralık kontrolü', () => {
  expect(15).toBeWithinRange(10, 20);
});

Bu yaklaşım, özellikle iş kurallarınızın (business rules) sık sık değiştiği ve karmaşık doğrulama gerektiren projelerde, testlerinizi birer dokümantasyon aracı haline getirmenize yardımcı olur.

CI/CD Pipeline İçerisinde Jest Entegrasyonu

Testlerinizin sadece yerel geliştirme ortamında değil, aynı zamanda üretim hattında da (CI/CD) otomatik olarak çalışması hayati önem taşır. GitHub Actions veya GitLab CI gibi platformlarda Jest'i yapılandırırken dikkat etmeniz gereken en önemli nokta, testlerin hata durumunda süreci durdurmasını sağlamaktır.

Parametre Açıklama
--ci Jest'i sürekli entegrasyon modunda çalıştırır (daha az çıktı verir).
--reporters Test sonuçlarını XML veya JSON formatında dışa aktarır.
--bail İlk hata oluştuğunda test sürecini durdurur, kaynak tasarrufu sağlar.

Örnek bir GitHub Actions adımı şu şekilde yapılandırılabilir:

- name: Testleri Çalıştır
  run: npm test -- --ci --coverage --reporters=default --reporters=jest-junit

Bu komut seti, hem test sonuçlarınızı raporlamanızı sağlar hem de CI/CD sürecinizin başarısını veya başarısızlığını net bir şekilde görselleştirmenize olanak tanır.

Sonuç

Node.js projelerinde Jest entegrasyonu, kodunuzun sürdürülebilirliği ve güvenilirliği için atabileceğiniz en önemli adımlardan biridir. Bu rehberde, kurulumdan başlayarak mock kullanımı ve kod kapsamı raporlamaya kadar temel süreçleri inceledik. Bir sonraki aşamada, projenize Supertest kütüphanesini ekleyerek Express.js API uç noktalarınızı (endpoints) nasıl test edebileceğinizi araştırmanızı öneririm. Düzenli test yazma alışkanlığı, uzun vadede teknik borçlarınızı azaltacak ve projenizin kalitesini artıracaktır.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kişisel gelişim ve zaman yönetimi odaklı pratik teknikler üzerine çalışıyorum. Günlük rutinleri iyileştiren, zaman kazandıran yöntemleri bilimsel temellere dayandırarak editöryal bir dille paylaşıyorum.

Yorumlar (0)

Yorum Yaz