Best Studio 1
Best Studio
mannaxxx 1
mannaxxx
Agora Metin2 1
Agora Metin2
[DEV]AB 1
[DEV]AB
Sevdamsın 1
Sevdamsın
TuZaKK 1
TuZaKK
kaptanmikro1 1
kaptanmikro1
farkmt2official 2
farkmt2official
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Bvural41 1
Bvural41
Hikaye Ekle

[NODE JS] Supertest ile API Endpoint Testi

Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!

nodejs.png


[NODE JS] Supertest ile API Endpoint Testi

Merhaba arkadaşlar, bu yazıda Express.js API'lerinizi test etmek için harika bir araç olan Supertest'i inceleyeceğiz. API geliştirirken Postman ile manuel test yapmak güzel ama yeterli değil. Her değişiklikte tüm endpoint'leri elle test etmek hem zaman kaybı hem de hata riski taşır. Supertest ile bu işi otomatize edebilirsiniz.

Supertest, HTTP assertion'ları yapmak için tasarlanmış bir kütüphanedir. Express uygulamanızı import ederek, sunucuyu ayağa kaldırmadan doğrudan endpoint'lerinizi test edebilirsiniz. Bu çok önemli bir nokta çünkü testleriniz port çakışması gibi sorunlardan etkilenmez ve çok daha hızlı çalışır.

Supertest'i kullanırken Express uygulamanızı modüler yapmanız gerekir. Yani app.listen() çağrısını ayrı bir dosyaya koyun, app objesini export edin. Test dosyasında bu app objesini import edip Supertest'e verin. Bu pattern'i bilmeyen geliştiriciler genellikle testlerinin çalışmadığından şikayet eder. Ben de ilk başta bu hatayı yapmıştım.

HTTP metodlarının hepsini test edebilirsiniz: GET, POST, PUT, PATCH, DELETE. Her biri için Supertest'in karşılık gelen metodunu kullanırsınız. Yanıt status kodu, body, header gibi değerleri kontrol edebilirsiniz. expect() ile zincirleme assertion'lar yazabilirsiniz.

Request body göndermek için send() metodunu kullanırsınız. Header eklemek için set() metodunu kullanırsınız. Bu özellikle authentication gerektiren endpoint'leri test ederken işe yarar. JWT token'ı Authorization header'ına ekleyerek kimlik doğrulaması gerektiren endpoint'leri test edebilirsiniz.

Middleware testleri de Supertest ile yapılabilir. Rate limiting, CORS, authentication gibi middleware'lerin doğru çalışıp çalışmadığını test edebilirsiniz. Mesela yetkilendirme middleware'ini test etmek için token'sız istek göndererek 401 yanıtı aldığınızı doğrulayabilirsiniz.

Hata senaryolarını da test etmeyi unutmayın. Sadece başarılı yanıtları değil, 400 Bad Request, 404 Not Found, 500 Internal Server Error gibi hata durumlarını da test edin. Gerçek dünyada kullanıcılar beklenmedik veriler gönderir, bunlara hazırlıklı olmalısınız.

Kod:
// app.js - Express uygulaması (test edilebilir yapıda)
const express = require('express');
const app = express();

app.use(express.json());

// Basit in-memory veri deposu
let todos = [
  { id: 1, baslik: 'Node.js öğren', tamamlandi: false },
  { id: 2, baslik: 'Test yaz', tamamlandi: true },
  { id: 3, baslik: 'Deploy yap', tamamlandi: false }
];
let nextId = 4;

// Tüm todo'ları listele
app.get('/api/todos', (req, res) => {
  res.json({ success: true, data: todos });
});

// Tek todo getir
app.get('/api/todos/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const todo = todos.find((t) => t.id === id);
  if (!todo) {
    return res.status(404).json({ success: false, error: 'Todo bulunamadı' });
  }
  res.json({ success: true, data: todo });
});

// Yeni todo ekle
app.post('/api/todos', (req, res) => {
  const { baslik } = req.body;
  if (!baslik || baslik.trim() === '') {
    return res.status(400).json({ success: false, error: 'Başlık zorunludur' });
  }
  const newTodo = { id: nextId++, baslik: baslik.trim(), tamamlandi: false };
  todos.push(newTodo);
  res.status(201).json({ success: true, data: newTodo });
});

// Todo güncelle
app.put('/api/todos/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const todoIndex = todos.findIndex((t) => t.id === id);
  if (todoIndex === -1) {
    return res.status(404).json({ success: false, error: 'Todo bulunamadı' });
  }
  const { baslik, tamamlandi } = req.body;
  if (baslik !== undefined) todos[todoIndex].baslik = baslik;
  if (tamamlandi !== undefined) todos[todoIndex].tamamlandi = tamamlandi;
  res.json({ success: true, data: todos[todoIndex] });
});

// Todo sil
app.delete('/api/todos/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const todoIndex = todos.findIndex((t) => t.id === id);
  if (todoIndex === -1) {
    return res.status(404).json({ success: false, error: 'Todo bulunamadı' });
  }
  todos.splice(todoIndex, 1);
  res.json({ success: true, message: 'Todo silindi' });
});

module.exports = app;

// app.test.js - Supertest ile API testi
// npm install --save-dev jest supertest
const request = require('supertest');
const app = require('./app');

describe('Todo API Endpoint Testleri', () => {

  describe('GET /api/todos', () => {
    test('tüm todoları döndürmeli', async () => {
      const response = await request(app)
        .get('/api/todos')
        .expect('Content-Type', /json/)
        .expect(200);

      expect(response.body.success).toBe(true);
      expect(Array.isArray(response.body.data)).toBe(true);
    });
  });

  describe('GET /api/todos/:id', () => {
    test('var olan todoyu döndürmeli', async () => {
      const response = await request(app)
        .get('/api/todos/1')
        .expect(200);

      expect(response.body.data.id).toBe(1);
    });

    test('olmayan todo için 404 döndürmeli', async () => {
      const response = await request(app)
        .get('/api/todos/9999')
        .expect(404);

      expect(response.body.success).toBe(false);
    });
  });

  describe('POST /api/todos', () => {
    test('yeni todo oluşturmalı', async () => {
      const response = await request(app)
        .post('/api/todos')
        .send({ baslik: 'Yeni görev' })
        .expect(201);

      expect(response.body.data.baslik).toBe('Yeni görev');
      expect(response.body.data.tamamlandi).toBe(false);
    });

    test('başlık olmadan 400 döndürmeli', async () => {
      const response = await request(app)
        .post('/api/todos')
        .send({})
        .expect(400);

      expect(response.body.error).toBe('Başlık zorunludur');
    });
  });

  describe('DELETE /api/todos/:id', () => {
    test('var olan todoyu silmeli', async () => {
      await request(app)
        .delete('/api/todos/2')
        .expect(200);
    });

    test('olmayan todo silme denemesi 404 döndürmeli', async () => {
      await request(app)
        .delete('/api/todos/9999')
        .expect(404);
    });
  });
});

Supertest ile API testleri yazmak, uygulamanızın güvenilirliğini artırır. Her endpoint için en az bir başarılı ve bir başarısız senaryo testi yazmanızı öneririm. CI/CD pipeline'ınıza bu testleri ekleyin ki her push'ta otomatik kontrol edilsin. Hadi kolay gelsin!
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst