Jest ile birim testi yazmanın adımları
Beceri rehberi

Jest ile birim testi yazmanın adımları

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

Jest ile birim testi yazmayı öğrenin: kurulum, test yapısı, taklit (mock) kullanımı, asenkron kod, hata senaryoları, test kapsamı ve sürdürülebilir testler.

Jest nedir ve neden birim testi için kullanılır?

Jest, JavaScript ve TypeScript kodu için geliştirilmiş bir test çatısıdır. Test çalıştırıcısı, doğrulama (assertion) kütüphanesi, taklit (mock) araçları ve test kapsamı raporlamasını tek pakette sunar. Ek kütüphane birleştirmeden birim testi yazmaya başlayabilmek, benimsenmesini kolaylaştıran özelliklerinden biridir.

Birim testi, kodun en küçük parçasını (bir fonksiyon, bir sınıfın bir yöntemi) diğer parçalardan yalıtarak sınar. Amaç, belirli bir girdi için beklenen çıktının üretildiğini hızlıca ve tekrarlanabilir biçimde doğrulamaktır. İyi bir birim testi hızlı çalışır, yan etkisi yoktur ve başarısız olduğunda sorunun nerede olduğunu doğrudan gösterir. Jest, bu ihtiyaçlara göre tasarlanmış olup özellikle React ve Node.js projelerinde sık kullanılır.

Kurulum ve ilk testin yazımı

Kurulum, paketin geliştirme bağımlılığı olarak projeye eklenmesi ve paket betiklerinden test komutunun tanımlanmasıyla başlar. TypeScript ya da modern sözdizimi kullanıyorsanız, kodu dönüştüren bir derleyici ayarı da eklenir. Test dosyaları genellikle test edilen dosyanın yanında, adında test ya da spec geçen biçimde tutulur ve Jest bu dosyaları otomatik bulur.

Bir test dosyasının iskeleti şöyledir: describe ile ilgili testler gruplanır, test (ya da it) ile tek bir davranış tanımlanır, expect ile sonuç doğrulanır. Doğrulayıcılar (matcher) arasında basit değer eşitliği için toBe, nesne ve dizi içerik eşitliği için toEqual, hata fırlatma için toThrow, metin eşleşmesi için toMatch bulunur. İlk testi yazarken en basit saf fonksiyonla başlayın; örneğin bir fiyata indirim uygulayan fonksiyon için, indirim oranı verildiğinde beklenen sonucun döndüğünü sınayın. Test adını davranışı anlatacak biçimde yazın: "geçersiz indirim oranında hata fırlatır" gibi.

İyi bir birim testi nasıl yapılandırılır?

Okunabilir testlerde ortak bir düzen vardır: hazırlık, eylem, doğrulama. Önce gerekli veriyi hazırlarsınız, sonra test edilen kodu çağırırsınız, en sonda sonucu doğrularsınız. Her test tek bir davranışı sınamalı; aksi hâlde başarısız olduğunda neyin bozulduğunu anlamak zorlaşır.

Pratik öneriler: testler birbirinden bağımsız olmalı ve çalışma sırasına bağlı olmamalı; ortak hazırlık için beforeEach, temizlik için afterEach kullanılabilir, ancak aşırı paylaşılan hazırlık testleri okunmaz kılar; sınır değerleri (boş girdi, eksik alan, uç değerler) ayrıca sınanmalı; test içinde karmaşık mantık (döngü, koşul) olmamalı, çünkü testin kendisi hata kaynağı olur. Testler üretim kodunu davranış üzerinden sınamalı, iç uygulama ayrıntılarına bağlanmamalıdır; aksi hâlde kod yeniden düzenlendiğinde davranış değişmediği hâlde testler kırılır.

Taklit (mocking) stratejileri

Birim testi yalıtım ister: test edilen fonksiyon bir veritabanını, ağ çağrısını ya da saati kullanıyorsa bunları gerçek hâliyle çağırmak testi yavaşlatır ve kararsız yapar. Jest'te bunun için taklit araçları vardır: jest.fn ile izlenebilir sahte fonksiyon oluşturulur, jest.mock ile bir modülün tamamı sahte sürümle değiştirilir, jest.spyOn ile mevcut bir yöntem izlenir ve gerekirse davranışı değiştirilir.

Taklidin bir sınırı vardır: gereğinden fazla taklit etmek, testin gerçek davranışı değil kendi kurduğunuz kurguyu sınadığı anlamına gelir. Genel ilke, yalnızca sistem sınırlarını taklit etmektir: ağ, dosya sistemi, zaman, rastgelelik, ücretli dış servisler. Kendi iş mantığınızı taklit etmeyin. Sahte fonksiyonun hangi argümanlarla çağrıldığını doğrulamak (toHaveBeenCalledWith) yararlıdır, ancak her çağrıyı doğrulamak testi uygulama ayrıntısına bağlar. Sahte zamanlayıcılar, zamana bağlı kodu beklemeden sınamanızı sağlar.

Asenkron kod ve hata senaryoları

Modern JavaScript kodu çoğunlukla asenkrondur. Jest, söz (promise) döndüren fonksiyonları ve async/await sözdizimini destekler: test fonksiyonunu async yazıp çağrıyı await ile bekler, ardından sonucu doğrularsınız. Söz dönen bir çağrıda testin beklemeden bitip yanlış yere geçmesi, en sık görülen asenkron hatadır; bu nedenle sözü döndürmeyi ya da await etmeyi unutmayın.

Hata senaryoları, mutlu yol kadar önemlidir. Ağ hatası, geçersiz girdi, zaman aşımı ve boş yanıt gibi durumlarda kodun nasıl davrandığını sınayın. Senkron kod için toThrow, asenkron kod için reddedilen sözü beklemek (rejects) kullanılır. Sahte bir dış çağrıyı hata verecek şekilde ayarlayıp kodunuzun bunu düzgün yakalayıp yakalamadığını görebilirsiniz. Zamanlayıcıları kullanan kodda sahte zamanlayıcıları açarak beklemeyi atlamak, testin hızını ve kararlılığını artırır.

Test kapsamı, TDD ve sürdürülebilir test paketi

Jest, hangi satırların, dalların ve fonksiyonların testlerle çalıştırıldığını gösteren kapsam raporu üretebilir. Kapsam, testsiz kalan riskli bölgeleri bulmak için yararlıdır; ancak kapsamı tek hedef yapmak yanıltıcıdır. Kodu çalıştıran ama hiçbir şeyi doğrulamayan bir test kapsamı artırır ve güven vermez. Daha sağlıklı yaklaşım, kritik iş mantığında yüksek kapsam ve anlamlı doğrulama aramaktır.

Test güdümlü geliştirme (TDD) döngüsü Jest ile doğal çalışır: önce başarısız bir test yazılır, sonra testi geçirecek en basit kod yazılır, ardından kod düzenlenir. Bu döngü hem tasarımı sadeleştirir hem de test edilebilir kod yazmaya iter. Test paketinin sürdürülebilirliği için testlerin hızlı çalışması, kırılgan olmaması ve sürekli entegrasyon hattında her değişiklikte koşması gerekir. Kararsız (bazen geçen, bazen kalan) testleri hemen çözün ya da karantinaya alın; aksi hâlde ekip testlere güvenmeyi bırakır.

Sık yapılan hatalar ve öğrenme yolu

  • Uygulama ayrıntısını sınamak: Dahili yardımcı fonksiyonu değil, görünür davranışı sınayın.
  • Aşırı taklit: Her bağımlılığı taklit eden test, gerçekte ne çalıştığını göstermez.
  • Doğrulamasız test: Çalıştırır ama hiçbir şeyi doğrulamaz; beklenen sonucu mutlaka sınayın.
  • Asenkron sonucu beklememek: Test erken biter, hata fark edilmez.
  • Testler arası paylaşılan durum: Sıraya bağlı kırılmalara yol açar.
  • Tek testte çok şey sınamak: Başarısızlık nedeni belirsizleşir.

Öğrenme yolu olarak şunu önerebiliriz: önce saf fonksiyonları sınayın, sonra bağımlılıklı fonksiyonlar için taklit kullanın, ardından asenkron kod ve hata senaryolarına geçin, en sonda kapsam raporunu ve TDD alışkanlığını ekleyin. Mevcut bir projenin en riskli iş mantığına testler eklemeye çalışmak, kuramdan daha hızlı öğretir.

Bu beceriyi Mindset programlarında nerede çalışırsınız?

Jest ile JavaScript Birim Testleri programı modüllerden oluşur ve bu sayfadaki sırayı izler: Jest Kurulumu ve Test Yazımının Temelleri, Taklit (Mocking) Stratejileri, Asenkron Kod ve Hata Senaryoları, Kapsam, TDD ve Sürdürülebilirlik.

İlgili Mindset programı

Jest ile JavaScript Birim Testleri

Sık sorulanlar

Sık sorulan sorular

Jest ile Mocha ya da Vitest arasında nasıl seçim yapılır?

Bunların hepsi JavaScript test çatılarıdır. Jest, çalıştırıcı, doğrulama ve taklit araçlarını birlikte getirir; Mocha daha modülerdir ve bileşenleri ayrı seçersiniz; Vitest ise özellikle Vite tabanlı projelerde hızlı çalışmak üzere tasarlanmıştır. Projenizin araç zincirine ve ekip alışkanlığına göre seçin.

Birim testi ile entegrasyon testi arasındaki fark nedir?

Birim testi tek bir parçayı yalıtarak sınar ve hızlıdır. Entegrasyon testi birkaç parçanın birlikte çalışmasını, örneğin bir servis ile veritabanını sınar. Birim testleri hata yerini hızlı gösterir, entegrasyon testleri parçalar arası uyumu yakalar. Sağlıklı bir test paketinde her tür de bulunur.

Her fonksiyon için test yazmak gerekir mi?

Gerekmez. Basit ve riski düşük kod için test yazmak çoğu zaman değer katmaz. İş mantığı yoğun, hata riski yüksek ya da sık değişen kod için test yazmak daha verimlidir. Önceliği, bozulduğunda en çok zarar verecek davranışlara verin ve test sayısını değil güvenilirliği hedefleyin.

Jest testleri neden bazen kararsız çalışır?

Kararsızlığın tipik nedenleri; beklenmeyen asenkron işlemler, gerçek zamana ya da rastgeleliğe bağımlılık, testler arası paylaşılan durum ve dış servis çağrılarıdır. Sahte zamanlayıcılar, sabit rastgele değerler, testler arası temizlik ve dış bağımlılıkların taklit edilmesi bu sorunların çoğunu giderir.

Jest ile JavaScript Birim Testi Nasıl Yazılır?