[NODE JS] Jest ile İlk Unit Testinizi Yazın
Merhaba arkadaşlar, bugün sizinle birlikte Node.js dünyasının en popüler test framework'ü olan Jest'i sıfırdan keşfedeceğiz. Yıllar önce ilk projemde test yazmayı "zaman kaybı" olarak görüyordum. Sonra production'da bir bug çıktı, müşteri aradı, gece 3'te fix yaptım. O günden sonra "test yazmayan kod, eksik koddur" demeye başladım.
Unit test, yazdığınız kodun en küçük birimlerini (fonksiyonlar, metodlar) izole bir şekilde test etme pratiğidir. Jest, Facebook tarafından geliştirilen, zero-config felsefesiyle çalışan bir test framework'üdür. Kurulumu basit, assertion kütüphanesi dahili, mock desteği güçlü. Bu yüzden React projelerinde varsayılan test aracı olmasının yanı sıra, saf Node.js projelerinde de sıkça tercih edilir.
Jest'in en büyük avantajlarından biri, herhangi bir ek konfigürasyon yapmadan hemen çalışmaya başlayabilmenizdir. Tabii ki büyük projelerde jest.config.js dosyası oluşturmanız gerekecektir ama başlangıç için hiçbir şeye ihtiyacınız yok. Test dosyalarınızı .test.js veya .spec.js uzantısıyla oluşturursunuz, Jest otomatik olarak bulur ve çalıştırır.
Bir diğer önemli konu test isimlendirmesidir. Test isimlerinizi anlamlı yazın. "test1", "test2" gibi isimler kullanmayın. "should return sum of two numbers" gibi açıklayıcı isimler verin. Bu sayede test başarısız olduğunda neyin kırıldığını hemen anlarsınız. Ben genellikle "should" ile başlayan isimler kullanırım, bu bir convention haline gelmiştir.
Describe blokları ile testlerinizi gruplandırabilirsiniz. Bu özellikle büyük projelerde çok işe yarar çünkü hangi modülün hangi testlerinin geçtiğini veya kırıldığını kolayca görürsünüz. Nested describe blokları da kullanabilirsiniz, mesela bir sınıfın farklı metodları için ayrı describe blokları oluşturabilirsiniz.
Jest'te en sık kullanacağınız matcher'lar şunlardır: toBe (primitif değerler için), toEqual (objeler ve arrayler için), toBeTruthy, toBeFalsy, toContain, toThrow ve toHaveLength. Her birinin farklı kullanım alanları vardır. Özellikle toBe ve toEqual arasındaki farkı iyi anlamak gerekir. toBe strict equality kullanır yani referans karşılaştırması yapar, toEqual ise deep equality kontrolü yapar.
Async testler konusunda da Jest oldukça yeteneklidir. Promise döndüren fonksiyonları test etmek için async/await kullanabilirsiniz. Callback tabanlı fonksiyonlar için ise done parametresini kullanırsınız. Bu konuya ilerideki yazılarda daha detaylı değineceğiz.
Bir de beforeEach ve afterEach hook'ları vardır. Her testten önce veya sonra çalışmasını istediğiniz kodları bu blokların içine yazarsınız. Mesela her testten önce bir veritabanı bağlantısı açmak, testten sonra kapatmak gibi senaryolarda kullanılır. beforeAll ve afterAll ise tüm testlerden önce ve sonra bir kez çalışır.
Şimdi gelin pratik bir örnek üzerinden ilerleyelim. Basit bir matematik modülü oluşturacağız ve bu modülü test edeceğiz.
Kod:
// math.js - Test edilecek modül
function topla(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Parametreler sayı olmalıdır');
}
return a + b;
}
function cikar(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Parametreler sayı olmalıdır');
}
return a - b;
}
function carp(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Parametreler sayı olmalıdır');
}
return a * b;
}
function bol(a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Parametreler sayı olmalıdır');
}
if (b === 0) {
throw new Error('Sıfıra bölme hatası');
}
return a / b;
}
module.exports = { topla, cikar, carp, bol };
// math.test.js - Test dosyası
const { topla, cikar, carp, bol } = require('./math');
describe('Matematik Modülü', () => {
describe('topla fonksiyonu', () => {
test('iki pozitif sayıyı doğru toplamalı', () => {
expect(topla(2, 3)).toBe(5);
});
test('negatif sayılarla çalışmalı', () => {
expect(topla(-1, -2)).toBe(-3);
});
test('sıfır ile toplamalı', () => {
expect(topla(5, 0)).toBe(5);
});
test('ondalıklı sayılarla çalışmalı', () => {
expect(topla(0.1, 0.2)).toBeCloseTo(0.3);
});
test('sayı olmayan parametre verildiğinde hata fırlatmalı', () => {
expect(() => topla('a', 2)).toThrow('Parametreler sayı olmalıdır');
});
});
describe('cikar fonksiyonu', () => {
test('iki sayıyı doğru çıkarmalı', () => {
expect(cikar(5, 3)).toBe(2);
});
test('negatif sonuç döndürebilmeli', () => {
expect(cikar(3, 5)).toBe(-2);
});
});
describe('carp fonksiyonu', () => {
test('iki sayıyı doğru çarpmalı', () => {
expect(carp(4, 5)).toBe(20);
});
test('sıfır ile çarptığında sıfır döndürmeli', () => {
expect(carp(100, 0)).toBe(0);
});
});
describe('bol fonksiyonu', () => {
test('iki sayıyı doğru bölmeli', () => {
expect(bol(10, 2)).toBe(5);
});
test('sıfıra bölmeye çalışıldığında hata fırlatmalı', () => {
expect(() => bol(10, 0)).toThrow('Sıfıra bölme hatası');
});
});
});
// package.json - Jest kurulumu
// npm init -y
// npm install --save-dev jest
// package.json'a ekleyin:
// "scripts": { "test": "jest", "test:watch": "jest --watch" }
// Çalıştırmak için: npm test
Jest ile test yazmak başta gereksiz gibi görünebilir ama projeniz büyüdükçe testlerin değerini anlarsınız. Refactoring yaparken testler güvenlik ağınız olur. Yeni bir özellik eklerken mevcut fonksiyonelliğin bozulmadığından emin olursunuz. Test yazmayı bir alışkanlık haline getirin, pişman olmayacaksınız. Kolay gelsin!
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 28
- Görüntüleme
- 6K
- Cevaplar
- 0
- Görüntüleme
- 643