Bu ders için video bulunmamaktadır.

Bu derse başlamak veya ilerlemenizi kaydetmek için lütfen giriş yapın veya kayıt olun.

Ders İçeriği

Giriş: Neden Test Etmeli ve Hata Ayıklamalıyız?

Yazılım geliştirme sürecinde test ve hata ayıklama, uygulamanın kalitesini, güvenilirliğini ve sürdürülebilirliğini sağlamak için vazgeçilmez adımlardır. Testler, kodunuzun beklendiği gibi çalıştığını doğrular ve yeni özellikler eklerken veya mevcut kodu değiştirirken olası hataları erken aşamada tespit etmenizi sağlar. Hata ayıklama ise, uygulamanızdaki sorunların kök nedenlerini bulmanıza ve gidermenize yardımcı olur.

Test Türleri

Birim Testleri (Unit Testing)

Birim testleri, uygulamanın en küçük, bağımsız parçalarını (fonksiyonlar, modüller, sınıflar) tek tek test etmeye odaklanır. Amaç, her bir birimin kendi başına doğru çalıştığından emin olmaktır. Node.js ekosisteminde birim testleri için popüler kütüphaneler Mocha ve Jest'tir.

Mocha ve Chai ile Birim Testi

Mocha, esnek bir JavaScript test framework'üdür. Chai ise bir iddia (assertion) kütüphanesidir ve testlerinizde beklentileri ifade etmenizi sağlar.

npm install mocha chai --save-dev
// functions.js
function add(a, b) {
  return a + b;
}

function subtract(a, b) {
  return a - b;
}

module.exports = { add, subtract };
// test/math.test.js
const expect = require("chai").expect;
const { add, subtract } = require("../functions");

describe("Matematik Fonksiyonları", () => {
  it("add fonksiyonu iki sayıyı toplamalıdır", () => {
    expect(add(2, 3)).to.equal(5);
  });

  it("subtract fonksiyonu iki sayıyı çıkarmalıdır", () => {
    expect(subtract(5, 2)).to.equal(3);
  });
});

Entegrasyon Testleri (Integration Testing)

Entegrasyon testleri, uygulamanın farklı birimlerinin veya modüllerinin bir araya geldiğinde doğru bir şekilde çalışıp çalışmadığını test eder. Örneğin, bir API endpoint'inin veritabanıyla doğru etkileşim kurup kurmadığını kontrol etmek.

Supertest ile API Entegrasyon Testi

Supertest, HTTP sunucularını test etmek için kullanılan bir kütüphanedir.

npm install supertest --save-dev
// app.js
const express = require("express");
const app = express();

app.get("/users", (req, res) => {
  res.json([{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }]);
});

module.exports = app;
// test/api.test.js
const request = require("supertest");
const app = require("../app");
const expect = require("chai").expect;

describe("API Testleri", () => {
  it("GET /users tüm kullanıcıları döndürmeli", async () => {
    const res = await request(app).get("/users");
    expect(res.statusCode).to.equal(200);
    expect(res.body).to.be.an("array");
    expect(res.body.length).to.equal(2);
  });
});

Uçtan Uca Testler (End-to-End Testing)

Uçtan uca testler, uygulamanın tamamını, kullanıcı akışlarını simüle ederek test eder. Bu testler, uygulamanın tüm bileşenlerinin (frontend, backend, veritabanı) bir arada sorunsuz çalıştığından emin olmak için kullanılır. Cypress ve Playwright popüler araçlardır.

Cypress ile E2E Testi

npm install cypress --save-dev
// cypress/integration/app.spec.js
describe("Uygulama Testi", () => {
  it("Ana sayfayı ziyaret etmeli ve başlığı kontrol etmeli", () => {
    cy.visit("http://localhost:3000");
    cy.contains("Node.js Dersleri");
  });
});

Hata Ayıklama (Debugging)

Hata ayıklama, yazılımınızdaki hataları bulma ve düzeltme sürecidir. Node.js, yerleşik hata ayıklama araçları ve popüler IDE'lerle entegrasyon sayesinde güçlü hata ayıklama yetenekleri sunar.

Node.js Inspector ve Chrome Geliştirici Araçları

Node.js, V8 motorunun yerleşik hata ayıklayıcısını (Inspector) kullanır. Bu, Chrome Geliştirici Araçları'nı kullanarak Node.js uygulamanızda hata ayıklamanıza olanak tanır.

node --inspect-brk app.js

Bu komutu çalıştırdıktan sonra, Chrome tarayıcınızda chrome://inspect adresine giderek uygulamanızı hata ayıklayabilirsiniz.

VS Code Debugger

Visual Studio Code, Node.js uygulamaları için mükemmel bir yerleşik hata ayıklayıcıya sahiptir. Breakpointler ayarlayabilir, değişkenleri izleyebilir, adım adım ilerleyebilir ve çağrı yığınını (call stack) inceleyebilirsiniz.

VS Code'da hata ayıklamak için:

  1. Projenizi VS Code'da açın.
  2. Hata ayıklamak istediğiniz satıra tıklayarak bir breakpoint ekleyin.
  3. Sol taraftaki Hata Ayıklama (Debugging) ikonuna tıklayın (Ctrl+Shift+D).
  4. "Run and Debug" butonuna tıklayın veya F5 tuşuna basın.

Loglama ve İzleme

Uygulamanızın çalışma zamanındaki davranışını anlamak, hataları tespit etmek ve performansı izlemek için loglama ve izleme kritik öneme sahiptir.

Winston ile Loglama

Winston, Node.js için esnek ve kapsamlı bir loglama kütüphanesidir. Farklı log seviyeleri (info, warn, error) ve farklı taşıyıcılar (konsol, dosya, veritabanı) ile loglama yapmanızı sağlar.

npm install winston
const winston = require("winston");

const logger = winston.createLogger({
  level: "info",
  format: winston.format.json(),
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: "error.log", level: "error" }),
    new winston.transports.File({ filename: "combined.log" }),
  ],
});

logger.info("Uygulama başlatıldı.");
logger.warn("Bellek kullanımı yüksek.");
logger.error("Veritabanı bağlantı hatası!");

Morgan ile HTTP İstek Loglama

Morgan, Express.js uygulamaları için HTTP isteklerini loglamak için kullanılan bir middleware kütüphanesidir.

npm install morgan
const express = require("express");
const morgan = require("morgan");
const app = express();

app.use(morgan("combined")); // Apache günlük biçimi

app.get("/", (req, res) => {
  res.send("Merhaba!");
});

app.listen(3000, () => console.log("Uygulama 3000 portunda çalışıyor"));


Pratik Alıştırma: Test ve Hata Ayıklama Senaryosu

Aşağıdaki senaryoyu kullanarak test ve hata ayıklama becerilerinizi geliştirin:

  • Basit bir Node.js fonksiyonu (örneğin, bir sayının asal olup olmadığını kontrol eden) için birim testleri yazın.
  • Mevcut bir Express.js API endpointi için entegrasyon testi yazın.
  • Bir hata içeren Node.js kod parçacığı üzerinde hata ayıklama araçlarını (VS Code Debugger veya Node.js Inspector) kullanarak hatayı bulun ve düzeltin.
  • Uygulamanıza Winston ile loglama entegrasyonu yapın ve farklı log seviyelerinde mesajlar gönderin.