Başlangıç İçin Unit Test Yazma: JavaScript ve Python Örnekleri
Yazılım Test ve Hata Ayıklama
Başlangıç İçin Unit Test Yazma: JavaScript ve Python Örnekleri

Başlangıç İçin Unit Test Yazma: JavaScript ve Python Örnekleri
Bu rehber, yazılım geliştirmeye yeni başlayanlar için unit testlerin ne olduğunu, hangi durumlarda kullanıldığını ve JavaScript (Jest) ile Python (pytest) örnekleriyle nasıl pratik testler yazılacağını adım adım gösterir. Amacımız hızlıca uygulanabilir testler yazmanız için gereken temel bilgileri, örnek dosyaları ve iyi uygulamaları paylaşmaktır.
Unit test nedir ve neden önemlidir?
Unit testler, yazılımın en küçük birimlerinin (fonksiyon veya sınıf gibi) bağımsız olarak beklendiği gibi çalışıp çalışmadığını doğrulayan otomatik testlerdir. Bu testler, yazılım geliştirme sırasında regresyonları erken yakalamaya, güvenli refactor yapmaya ve kodun davranışını net bir biçimde belgelemeye yardımcı olur. Temel kavramlar ve amaçlar için bakınız: What is Unit Testing in Python? — Caltech.
Unit test yazmanın temel faydaları
- Kod güvenilirliğini artırır; hatalar değişiklik yapıldığında hızlıca görünür.
- Refactor sırasında olası yan etkileri yakalayarak riskleri düşürür.
- Geliştiriciye ve ekip üyelerine nasıl davranılması gerektiğini gösteren yaşayan dokümantasyon sağlar.
- Jest (JavaScript) ve pytest (Python) gibi framework'ler test yazmayı, organize etmeyi ve raporlamayı kolaylaştırır; bunların karşılaştırmaları başlangıç için yol göstericidir (Jest vs pytest — KnapsackPro, Pytest vs Unittest — LambdaTest).
Temel prensipler ve iyi yaklaşımlar
- AAA deseni — Arrange (hazırlık), Act (eylem), Assert (doğrulama): testleri bu sıraya göre düzenleyin.
- İzolasyon — Her test diğerlerinden bağımsız olmalı; global state ve dış servisler test sonuçlarını etkilememeli.
- Küçük ve tek amaçlı testler — Bir test bir davranışı doğrulamalıdır.
- Hız ve deterministik sonuç — Unit testler hızlı çalışmalı ve aynı girdide aynı sonucu vermelidir.
- Kolay okunabilir isimlendirme — Test isimleri beklenen davranışı açıkça ifade etmeli. Örneğin: test_add_returns_sum_when_inputs_are_numbers gibi.
Test yazma adımları (pratik yol haritası)
- Projenize uygun bir framework seçin (JS için Jest, Python için pytest sık tercih edilir).
- Küçük birimi seçip önce testi yazın (kırmızı: testin başarısız olması). Bu, TDD yaklaşımına uygundur ama zorunlu değildir.
- Gerekli üretim kodunu yazarak testi geçirin (yeşil).
- Refactor yapın; testler hâlâ geçmeli.
- Testleri otomatik hale getirmek için CI hattına ekleyin.
Test organizasyonu ve isimlendirme
Dosya ve klasör yapısını net tutun. Yaygın yaklaşımlar:
- Her modül için aynı isimlendirme ile test dosyası: module.js -> module.test.js, module.py -> test_module.py.
- Test klasörleri (ör. tests/) veya modül yanına test dosyası koyma tercihine göre karar verin ve proje boyunca tutarlı olun.
- Test isimleri açık olmalı: test_divide_by_zero_raises_error, test_login_returns_token_for_valid_credentials gibi.
JavaScript (Jest) ile hızlı örnek
Jest kurulumu ve basit bir test örneği:
npm init -y
npm install --save-dev jest
// package.json içindeki "scripts" bölümüne: "test": "jest"
Basit fonksiyon (add.js):
// add.js
function add(a, b) {
return a + b;
}
module.exports = add;
Test dosyası (add.test.js):
// add.test.js
const add = require('./add');
test('iki sayıyı toplar', () => {
expect(add(2, 3)).toBe(5);
});
Async örnek (örnek fetch fonksiyonunu test etme):
// fetchData.test.js
const fetchData = require('./fetchData');
test('veri döner', async () => {
const data = await fetchData();
expect(data).toBeDefined();
});
Çalıştırma: npm test veya npx jest. Jest ayrıca --coverage flag'i ile test kapsam raporu üretir.
Python (pytest) ile hızlı örnek
Pytest kurulumu ve örnekler:
pip install pytest
Basit fonksiyon (math_utils.py):
# math_utils.py
def add(a, b):
return a + b
Test dosyası (test_math_utils.py):
# test_math_utils.py
from math_utils import add
def test_add():
assert add(2, 3) == 5
Parametrik test örneği:
import pytest
from math_utils import add
@pytest.mark.parametrize("a,b,expected", [(1,2,3),(2,3,5),(0,0,0)])
def test_add_param(a, b, expected):
assert add(a, b) == expected
Çalıştırma: pytest -q. Kapsam için pytest --cov eklentileri sık kullanılır.
Mocking, fixture'lar ve dış bağımlılıkları izole etme
Unit testler dış servisleri taklit etmeli. Pytest'te fixture ve monkeypatch, Jest'te jest.mock ve jest.fn() kullanılır. Örneğin bir HTTP isteğini gerçek ağ çağrısı yerine mocklamak testleri hızlı ve deterministik yapar. Bu konuda framework dokümantasyonları faydalıdır; karmaşık bağımlılıkları ilk etapta mocklamak en pratik yaklaşımdır.
Kapsam (coverage) ve test kalitesi
Test kapsamı araçları hangi kod yollarının test edildiğini gösterir. %100 kapsam her zaman hedef olmamalıdır; kritik mantık ve hata durumlarını test etmek daha önemlidir. Jest için --coverage, pytest için pytest-cov eklentisi yaygın olarak kullanılır.
CI'ye entegrasyon ve otomasyon
Testleri sürekli entegrasyon hattına ekleyin; her PR'da otomatik çalışsın. Temel adımlar genelde şunlardır: kod checkout, bağımlılıkların kurulumu (npm install veya pip install), testlerin çalıştırılması (npm test veya pytest -q) ve kapsam/raporların toplanması. Hatalı test varsa pipeline başarısız olur ve geliştirici süreci durdurulur; bu, regressiyonların ana dalga geçmesini engeller.
Yaygın hatalar ve çözüm önerileri
- Paylaşılan global state: Testler birbirine bağlı hale gelirse izolasyonu sağlayın; fixture'lar veya setup/teardown kullanın.
- Flaky testler: Zamanlayıcıya veya gerçek ağ çağrılarına bağımlılığı azaltın; deterministic veri kullanın.
- Yavaş testler: Unit testleri küçük ve hızlı tutun; entegrasyon testlerini ayrı çalıştırın.
- Eksik hata şartları: Pozitif senaryoların yanı sıra hata durumlarını da test edin (ör. beklenen istisnalar, geçersiz girdiler).
Başlangıç için kontrol listesi
- Framework seçimi yapıldı mı? (Jest / pytest)
- Basit bir fonksiyon için önce test yazıldı mı?
- Testler hızlı ve deterministik mi çalışıyor?
- Mock/fixture kullanımı ile dış bağımlılıklar izole edildi mi?
- Testler CI hattına eklendi mi?
Kaynaklar ve ileri okuma
- What is Unit Testing in Python? — Caltech (unit testlerin temel amacı ve tanımı hakkında açıklayıcı bir kaynak).
- Jest vs pytest — KnapsackPro (Jest ve pytest karşılaştırması, hangi senaryolarda hangisinin tercih edilebileceğine dair notlar).
- Pytest vs Unittest — LambdaTest (pytest ve Python'un standart unittest modülü karşılaştırması ve ipuçları).
Bu rehberde verilen kod örnekleri minimal ve öğreticidir; gerçek projelerde test kapsamını ihtiyaca göre genişletin ve framework dokümantasyonlarına başvurun.