JavaScript'te Jest ve Mocha ile Test Yazma

Yazılım geliştirme sürecinde en kritik adımlardan biri, yazdığınız kodun doğruluğunu ve güvenilirliğini sağlamak için testler yazmaktır. JavaScript gibi dinamik ve hızlı değişen dillerde, test yazma, hataların erken tespit edilmesine ve bakım süreçlerinin kolaylaşmasına yardımcı olur. Bu yazıda, JavaScript'te Jest ve Mocha gibi popüler test çerçevelerini kullanarak nasıl test yazılacağını, her iki çerçeveyi de karşılaştırarak adım adım açıklayacağız.


1. Test Nedir ve Neden Gereklidir?

Test, yazılımın doğru çalışıp çalışmadığını kontrol etmek için yazılan kod parçacıklarıdır. Testler, yazılım geliştirme sürecinde birkaç farklı amaca hizmet eder:

  • Hata Tespiti: Kodunuzda hata olup olmadığını belirlemek.
  • Kod Kalitesini Arttırma: Yazılımın daha stabil ve sürdürülebilir olmasını sağlamak.
  • Yazılımın İlerleyen Zamanlarda Çalışmasını Garantileme: Yeni özellikler eklerken veya değişiklikler yaparken, eski kodların bozulmadığından emin olmak.

JavaScript, dinamik bir dil olduğu için test yazmak daha da önemlidir. Bu sayede uygulamanın farklı bölümlerinin doğru çalışıp çalışmadığını doğrulayabiliriz.


2. Jest ve Mocha Nedir?

2.1. Jest

Jest, Facebook tarafından geliştirilen ve React ile uyumlu çalışan popüler bir test çerçevesidir. Jest, test yazmayı kolaylaştıran pek çok yerleşik özelliğe sahiptir. Özellikle bileşen tabanlı testler, mocking (taklit) ve snapshot testing gibi özellikleriyle dikkat çeker.

Jest’in öne çıkan özellikleri:

  • Kolay Kurulum: Jest'i kurmak ve kullanmak oldukça basittir.
  • Yerleşik Mocking: Jest, fonksiyonları ve modülleri kolayca taklit etmenizi sağlar.
  • Snapshot Testing: React bileşenlerinin çıktısını kontrol etmek için kullanılır.
  • Asenkron Testler: Promises, async/await gibi asenkron testleri kolayca yazabilirsiniz.

2.2. Mocha

Mocha, daha esnek bir test çerçevesidir. Çeşitli assertion (doğrulama) kütüphaneleriyle uyumlu çalışabilir ve farklı test türlerini destekler. Mocha'nın avantajı, çok esnek olması ve testin nasıl yazılacağını kontrol etme özgürlüğü sunmasıdır. Ancak, Jest kadar yerleşik araçlara sahip değildir.

Mocha'nın öne çıkan özellikleri:

  • Esneklik: Mocha, testlerinizi yazarken size büyük esneklik sağlar.
  • Yüksek Uyumluluk: Assertion kütüphaneleri ve diğer araçlarla uyumludur.
  • Asenkron Testler: Asenkron testler yazmak için done callback fonksiyonunu kullanır.

3. Jest ile Test Yazma

Jest, kullanıcı dostu bir API ile test yazma sürecini oldukça basit hale getirir. Jest, test, expect, ve beforeEach gibi temel işlevlere sahiptir.

3.1. Jest Kurulumu

Öncelikle Jest'i kurmamız gerekir. Proje dizininize gidin ve aşağıdaki komut ile Jest’i yükleyin:

npm install --save-dev jest

Ardından, package.json dosyanıza test komutunu ekleyin:

"scripts": {
  "test": "jest"
}

3.2. Jest ile Basit Test Yazma

Örnek olarak, bir toplama fonksiyonu yazalım ve bu fonksiyonu test edelim:

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

Yukarıdaki fonksiyonu test etmek için şu adımları izleyelim:

  1. Test Dosyası Oluşturun: math.test.js adıyla bir dosya oluşturun.
// math.test.js
const add = require('./math');

test('adds 1 + 2 to equal 3', () => {
  expect(add(1, 2)).toBe(3);
});
  • test fonksiyonu, testin adını ve testin gerçekleştirilmesi gereken işlevi alır.
  • expect fonksiyonu, verilen değerin beklenen değere eşit olup olmadığını kontrol eder.

Testi çalıştırmak için şu komutu kullanabilirsiniz:

npm test

3.3. Asenkron Testler

Jest, asenkron testleri kolayca yazmak için async/await veya Promises kullanmanızı sağlar.

Örneğin, aşağıdaki testin async bir versiyonunu yazalım:

// fetchData.js
const fetchData = () => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('Data fetched');
    }, 2000);
  });
};

module.exports = fetchData;

Test:

// fetchData.test.js
const fetchData = require('./fetchData');

test('fetches data', async () => {
  const data = await fetchData();
  expect(data).toBe('Data fetched');
});

Jest, asenkron testlerde otomatik olarak bekleme yapar ve doğru sonucu kontrol eder.


4. Mocha ile Test Yazma

Mocha, Jest’e kıyasla daha esnek bir test framework’üdür. Mocha’da test yazarken genellikle assertion kütüphanelerini de kullanmanız gerekecektir. Bu örnekte Chai assertion kütüphanesini kullanacağız.

4.1. Mocha Kurulumu

Mocha’yı ve Chai'yi projeye dahil etmek için şu komutları çalıştırın:

npm install --save-dev mocha chai

Ardından, package.json dosyasına şu komutları ekleyin:

"scripts": {
  "test": "mocha"
}

4.2. Mocha ile Basit Test Yazma

Aşağıdaki örneği kullanarak toplama fonksiyonunu test edelim:

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

Test:

// math.test.js
const add = require('./math');
const chai = require('chai');
const expect = chai.expect;

describe('add function', () => {
  it('should add 1 + 2 to equal 3', () => {
    expect(add(1, 2)).to.equal(3);
  });
});
  • describe bloğu, testlerinizi gruplayarak daha düzenli hale getirir.
  • it fonksiyonu, her bir testin belirli bir özelliğini açıklar.
  • expect fonksiyonu, belirli bir değerin doğruluğunu kontrol eder.

4.3. Asenkron Testler

Mocha'da asenkron test yazarken done callback fonksiyonunu kullanmamız gerekir.

// fetchData.js
const fetchData = (callback) => {
  setTimeout(() => {
    callback('Data fetched');
  }, 2000);
};

module.exports = fetchData;

Test:

// fetchData.test.js
const fetchData = require('./fetchData');
const chai = require('chai');
const expect = chai.expect;

describe('fetchData function', () => {
  it('should fetch data', (done) => {
    fetchData((data) => {
      expect(data).to.equal('Data fetched');
      done();
    });
  });
});

Burada done callback'i, testin tamamlanmasını bekler ve Mocha'ya testin asenkron olduğunu bildirir.


5. Jest vs Mocha: Hangi Durumda Hangi Çerçeve Kullanılmalı?

Jest’in Avantajları:

  • Yerleşik test, assertion ve mocking işlevleri.
  • Özellikle React projeleri için optimize edilmiştir.
  • Snapshot testing gibi gelişmiş özellikler.
  • Hızlı kurulum ve yapılandırma.

Mocha’nın Avantajları:

  • Esnek ve modüler yapı.
  • Birçok assertion kütüphanesiyle uyumlu.
  • Daha geniş test topluluğu ve kaynakları.
  • Karmaşık projelerde daha fazla özelleştirme olanağı.

Hangi Durumda Hangisini Kullanmalı?

  • Jest: Daha hızlı başlangıç ve kullanım kolaylığı arayanlar için mükemmeldir. Özellikle React projelerinde tercih edilir.
  • Mocha: Daha fazla esneklik ve özelleştirme isteyenler için idealdir. Büyük ve karmaşık projelerde daha faydalıdır.

6. Sonuç

Jest ve Mocha, JavaScript test yazma sürecini kolaylaştıran güçlü test çerçeveleridir. Jest, özellikle basit kullanım ve hızlı kurulum isteyenler için mükemmel bir seçenekken, Mocha daha esnek ve modüler bir yapı sunar. Her iki araç da asenkron testler, mocking, ve assertion işlemleri konusunda güçlüdür. Test yazmanın, yazılım geliştirme sürecindeki önemini göz önünde bulundurarak, her iki çerçeveyi de projelerinize entegre edebilirsiniz.

Test yazma sürecine ne kadar erken başlarsanız, yazılımınızın güvenilirliği o kadar artar. Hangi test çerçevesini kullanacağınız, projenizin ihtiyaçlarına ve tercihlerinize göre değişebilir.