Birim Testleri Başlangıç Rehberi: Jest ile Örnekler (JS)
Yazılım Test ve Hata Ayıklama
Birim Testleri Başlangıç Rehberi: Jest ile Örnekler (JS)

Giriş
Bu rehber, JavaScript projelerinde birim testlerine başlamanız için pratik adımlar ve örnekler sunar. İçerikte Jest kurulumu, örnek test dosyaları, Test Güdümlü Geliştirme (TDD) akışı ve mocking teknikleri yer alır. Jest'in JavaScript dünyasında yaygın kullanımı ve TDD yaklaşımı hakkında genel çerçeve için ayrıca aşağıdaki kaynaklara bakabilirsiniz:
Birim Testleri Neden Önemli?
Birim testleri, uygulamanızdaki küçük kod birimlerinin (fonksiyonlar, modüller) beklendiği gibi çalıştığını doğrular. Temel faydalar şunlardır:
- Regresyonların önlenmesi: Yeni değişikliklerin eski davranışları bozup bozmadığını erken yakalarsınız.
- Dökümantasyon: Testler, fonksiyonların beklenen giriş/çıkışlarını örneklerle gösterir.
- Tasarım iyileştirme: Test edilebilirlik, genellikle daha açık bir API ve daha düşük bağımlılık anlamına gelir.
Jest, JavaScript ve React projelerinde sık kullanılan popüler bir test çerçevesidir; hızlı çalıştırma ve izolasyon desteğiyle geliştirme sürecine katkı sağlar (kaynak).
Jest Kurulumu: Adım Adım
Yeni bir Node.js projesinde Jest kullanmaya başlamak için temel adımlar:
- Proje başlatma:
npm init -y
- Jest'i geliştirme bağımlılığı olarak yükleyin:
npm install --save-dev jest
- package.json içinde test script'i ekleyin:
"scripts": { "test": "jest" }
- Testleri çalıştırma:
npm test
Not: Alternatif olarak npx jest --init ile temel yapılandırma oluşturabilirsiniz. Bu adımlar, javascript başlangıç kodları içeren küçük projeler için hızlı bir başlangıç sağlar.
Basit Birim Testi Örneği
Aşağıda en temel örneklerden biri yer alıyor: basit bir sum fonksiyonu ve ona ait test.
src/sum.js
module.exports = function sum(a, b) {
return a + b;
};
__tests__/sum.test.js
const sum = require('../src/sum');
test('1 + 2 toplamı 3 olmalı', () => {
expect(sum(1, 2)).toBe(3);
});
Bu test dosyasını oluşturduktan sonra npm test komutuyla Jest çalışır ve testi raporlar. Basit örnekler, test yazma alışkanlığı kazanmak için idealdir.
TDD ile Geliştirme (Red → Green → Refactor)
Test Güdümlü Geliştirme (TDD), önce test yazıp ardından kodu testleri geçecek şekilde geliştirmeyi önerir. Temel döngü üç adımdan oluşur:
- Red: Yeni bir test yazın ve çalıştırın — testin başarısız olduğunu doğrulayın.
- Green: Testi geçirecek kadar kodu yazın (basit ve doğrudan).
- Refactor: Hem testleri hem kodu temizleyin ve tekrarı azaltın.
TDD, daha az hata ve daha iyi test kapsamı sağlayabilir; Jest ile TDD uygulaması hakkında pratik bilgiler için rehbere göz atabilirsiniz (kaynak).
Mocking: Bağımlılıkları İzole Etme
Birim testlerinin amacı, test edilen birimi dış bağımlılıklardan izole etmektir. Mocking, gerçek bağımlılıkları taklit ederek testlerin deterministik olmasını sağlar (ör. ağı ağ çağrıları, e-posta servisleri, veritabanları).
Basit mocking örneği (yerel modül)
// src/mailer.js
module.exports = {
sendEmail: (to, text) => { /* gerçek e-posta gönderimi */ }
};
// src/user.js
const mailer = require('./mailer');
function signup(user) {
mailer.sendEmail(user.email, 'Welcome');
return true;
}
module.exports = { signup };
// __tests__/user.test.js
jest.mock('../src/mailer');
const mailer = require('../src/mailer');
const { signup } = require('../src/user');
test('signup welcome e-postası gönderir', () => {
signup({ email: '[email protected]' });
expect(mailer.sendEmail).toHaveBeenCalledWith('[email protected]', 'Welcome');
});
Bu yöntemde mailer gerçek e-posta göndermeyecek şekilde jest tarafından mocklanır; böylece test yalnızca signup fonksiyonunun davranışını doğrular. Mocking hakkında genel kavramlar için ayrıca bkz. Birim Testi Nedir? (Guru99).
Test Senaryosu ve İyi Uygulamalar
Etkin bir test senaryosu oluşturmak, beklenen davranışları ve sınır durumlarını kapsayan testler yazmayı gerektirir. Aşağıdaki iyi uygulamalar başlangıç için rehber niteliğindedir:
- Küçük ve odaklı testler: Her test yalnızca bir davranışı doğrulasın.
- Deterministik testler: Aynı girdiler için aynı çıktıyı üretmelidir (rastgelelikten kaçının).
- Setup/teardown: beforeEach/afterEach ile ortak hazırlıkları ve temizliği yönetin.
- Edge case'leri test edin: null, undefined, boş diziler, hatalı girişler gibi durumları kapsayın.
- Test isimlendirmesi: Ne test edildiğini açıkça belirtin (ör. 'signup bir e-posta gönderir').
Hızlı Çözüm: Yaygın Sorunlar
- Asenkron testlerin başarısız olması: async/await veya returned promise/done callback kullanın. Örnek:
test('async', async () => { const data = await fetchData(); expect(data).toBeDefined(); });
- Mock temizliği: afterEach(() => { jest.clearAllMocks(); }) ile mock'ları sıfırlayın.
- Flaky test'ler: Zamanla değişen testlerse testi sabitleyin veya deterministik hale getirin.
Kontrol Listesi: Yeni Projede Jest ile Başlamak
- Node proje yapısını oluşturun (npm init).
- Jest'i yükleyin ve package.json test script'ini ekleyin.
- İlk basit testinizi yazın (ör. sum). Çalıştığını doğrulayın.
- TDD döngüsünü deneyin: önce test, sonra kod, refactor.
- Mocking gerektiren bağımlılıkları izolasyon için mocklayın.
- Testleri CI'ye (ör. GitHub Actions) ekleyip otomatik çalıştırma sağlayın.
Sonraki Adımlar
Birim testlerinde ustalaştıktan sonra şu konulara geçebilirsiniz: React bileşen testi (react-testing-library), entegrasyon testleri, test kapsamı raporları (jest --coverage) ve CI/CD entegrasyonu. İleri okumalar ve örnekler için yukarıdaki kaynaklar başlangıç için uygundur.
Rehberdeki kavramlar ve örneklerin temel referansları: Ichi Pro — Jest ile Birim Testine Giriş ve Guru99 — Birim Testi Nedir?.