Birim Testleri: Jest ve Pytest ile Basit Örnekler ve İpuçları

Yazılım Test ve Hata Ayıklama

Birim Testleri: Jest ve Pytest ile Basit Örnekler ve İpuçları

Bu makale, Jest (JavaScript) ve Pytest (Python) ile temel birim testlerini nasıl yazacağınıza dair pratik örnekler, hızlı kurulum rehberi ve test yazma ipuçları sunar. Örnekler basit tutulmuştur ve TDD akışına dair uygulanabilir adımlar içerir.
Birim Testleri: Jest ve Pytest ile Basit Örnekler ve İpuçları

Birim Testleri nedir ve neden önemlidir?

Birim testleri, yazılımın en küçük bağımsız parçalarını (fonksiyonlar, sınıflar) izole ederek doğrulamak için yazılan otomatik testlerdir. Küçük, deterministik testler kod değişikliklerinin yan etkilerini erkenden yakalamaya yardımcı olur ve geliştirme döngüsünü hızlandırır.

Python ekosisteminde birim testleme hakkında temel bilgiler ve standart kütüphane araçları için Python'un resmi dokümantasyonuna bakabilirsiniz: Python unittest belgelendirmesi.

Jest ve Pytest: Kısa karşılaştırma

Jest (JavaScript)

Jest, JavaScript/TypeScript projelerinde yaygın kullanılan bir test çerçevesidir. Özellikle React tabanlı projelerle sık kullanımıyla bilinir ve mantıklı varsayılan ayarları sayesinde hızlıca başlamayı kolaylaştırır. Jest; eşleşmeler (matchers), mock fonksiyonları ve test izolasyonu gibi özellikler sunar.

Pytest (Python)

Pytest, Python projelerinde esnekliği ve geniş eklenti ekosistemi ile öne çıkan bir test çerçevesidir. Basit assert tabanlı test yazımından gelişmiş fixture ve parametrizasyon özelliklerine kadar pek çok imkân sağlar. Pytest ile test yazma ve fixture kullanımı hakkında Microsoft tarafından hazırlanmış rehberi inceleyebilirsiniz: Pytest ile test etme - Microsoft Learn.

Hızlı kurulum ve ilk örnekler

Jest ile basit bir örnek

Adım 1: Yeni bir Node.js projesi oluşturup Jest'i geliştirme bağımlılığı olarak ekleyin.

  • npm init -y
  • npm install --save-dev jest

Adım 2: Basit bir fonksiyon ve ona karşılık gelen testi oluşturun.

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

// add.test.js
const add = require('./add');
test('2 sayının toplamını döner', () => {
expect(add(1, 2)).toBe(3);
});

Adım 3: package.json içinde test betiğini ayarlayıp çalıştırın (örneğin "test": "jest") ve npm test ile testleri çalıştırın.

Pytest ile basit bir örnek

Adım 1: Sanal ortam oluşturun ve pytest'i yükleyin.

  • python -m venv .venv
  • source .venv/bin/activate (Mac/Linux) veya .venv\Scripts\activate (Windows)
  • pip install pytest

Adım 2: Basit bir fonksiyon ve ona karşılık gelen testi oluşturun.

# calc.py
def add(a, b):
return a + b

# test_calc.py
from calc import add
def test_add():
assert add(1, 2) == 3

Adım 3: Terminalde proje kök dizininde pytest komutunu çalıştırarak testleri yürütün. Pytest ile fixture ve parametrizasyon hakkında daha fazla bilgi için Microsoft'un rehberine bakabilirsiniz: Pytest ile test etme - Microsoft Learn.

Pratik test yazma ipuçları

  • Her test tek bir davranışı doğrulasın: Büyük testleri küçük, odaklanmış testlere bölün. Bu sayede başarısızlık daha hızlı teşhis edilir.
  • İsimlendirme önemlidir: Test fonksiyon ve dosya adları ne test ettiğini açıkça belirtmeli. Pytest için test_ öneki ve Jest için .test.js uzantısı yaygındır.
  • İzolasyon: Testler dış dünya ile etkileşimi sınırlandırmalı; dosya sistemi, ağ veya veritabanı gibi kaynaklar testlerin hızını ve kararlılığını etkileyebilir.
  • Fixture ve setup/teardown kullanın: Pytest'in fixture mekanizması, ortak hazırlıkları tekrar kullanılabilir hale getirir; Jest'in setup/teardown fonksiyonları benzer amaçla kullanılabilir. (Pytest için örnek açıklamalar: Microsoft Learn.)
  • Parametrize ile varyasyonları test edin: Aynı mantığın farklı girdilerle davranışını test etmek için Pytest'in parametrizasyonu veya Jest'in test.each özellikleri kullanılabilir.
  • Mocking gerektiğinde kullanın: Dış bağımlılıkları izole etmek veya yavaş bileşenleri taklit etmek için mock'lar kullanın; aşırı mock kullanımından kaçının, çünkü çok fazla simülasyon testlerin gerçek dünyadaki değeri azaltabilir.
  • Küçük ve hızlı testler hedefleyin: Birim testleri çabuk çalışmalı, ağır entegrasyon testleri ayrı katmanda tutulmalıdır.

TDD (Test-Driven Development) için kısa akış

  1. Red (Başarısız test yazın): Yeni bir davranış için en basit testi yazın ve çalıştırdığınızda başarısız olduğundan emin olun.
  2. Green (Geçmesi için kodu yazın): Testi geçen en basit kodu yazın; ilk adımda temiz, mükemmel kod yazmak amaç değildir.
  3. Refactor (İyileştirme): Testler hala geçtiği sürece kodu temizleyin, tekrar eden kısımları soyutlayın ve tasarımı iyileştirin.

Bu döngü küçük adımlarla ilerlemeyi teşvik eder ve regresyonları azaltır.

Sık yapılan hatalar ve kaçınma yolları

  • Çok geniş testler: Çok fazla sorumluluğu olan testler başarısız olduğunda sebebi bulmayı zorlaştırır. Testleri tek bir davranışa odaklayın.
  • Gerçek dışı mock'lar: Birimi izole etmek için mock kullanmak iyi olsa da, gerçeğe çok uzak mock'lar gerçek hataları gizleyebilir. Kritik entegrasyonlar için ayrı entegrasyon testleri yazın.
  • Test verisi yönetiminde düzensizlik: Test verilerini her test için deterministik ve tekrar üretilebilir tutun; rastgele veriler hata ayıklamayı zorlaştırır.

CI/CD entegrasyonu ve temel öneriler

Testleri sürekli entegrasyon sürecine eklemek, hatalı değişikliklerin ana dala geçmesini engeller. Temel adımlar şunlardır:

  • Testleri CI pipeline'ınızın bir adımı olarak çalıştırın ve başarısız testlerde build'i kırılacak şekilde yapılandırın.
  • Bağımlılık kurulumunu ve test komutlarını (ör. npm test veya pytest) CI betiğine dahil edin.
  • Test süresini kısa tutmak için birim testleri ayrı, hızlı çalışan adımlarda tutun; uzun süren entegrasyon testleri farklı bir geçirgenlik katmanında çalıştırılabilir.

Ne zaman birim test yazmamalısınız?

  • Basit, trivyal getter/setter gibi mantıksız testler eklemek genellikle zaman kaybıdır.
  • Çok sık değişen prototip kodunda sürekli test yazmak geliştirme hızını gereksiz kısıtlayabilir; bu durumda TDD yaklaşımını kullanmadan önce stabilizasyon bekleyin.

Kaynaklar ve ileri okumalar: Pytest hakkında ayrıntılı rehber için Microsoft Learn modülünü inceleyin: Pytest ile test etme - Microsoft Learn. Python'un standart test araçları için resmi belgeye bakabilirsiniz: unittest — Python resmi dokümantasyonu.

Bu makaledeki örnekler eğitim amaçlı basit örneklerdir. Gerçek projelerde ek test türleri (entegrasyon, sistem, performans) ve güvenlik/ortam yapılandırmaları değerlendirilmeli.