Laravel

Laravel’de Test Driven Development (TDD) ve Test Yazımı

Laravel’de Test Driven Development (TDD) ve Test Yazımı: Güvenilir ve Sürdürülebilir Kod Geliştirme

Laravel, modern web uygulamaları geliştirirken test yazmayı kolaylaştıran güçlü bir test altyapısı sunar. Test Driven Development (TDD) yaklaşımı, kod yazmadan önce testler oluşturarak uygulamanızın güvenilir ve sürdürülebilir olmasını sağlar. Bu makalede, Laravel’de TDD sürecini, unit testleri, feature testleri ve bu testlerin nasıl yazılacağını detaylı bir şekilde inceleyeceğiz.


1️⃣ Test Driven Development (TDD) Nedir?

Test Driven Development (TDD), yazılım geliştirme sürecinde testlerin öncelikli olarak yazıldığı bir yaklaşımdır. Bu yaklaşım, kod yazmadan önce testlerin oluşturulmasını ve bu testleri geçecek şekilde kodun geliştirilmesini önerir.

TDD Süreci:

  1. Testi Yaz (Fail): İlk adımda, henüz kod yazılmadan testler oluşturulur. Bu testler başarısız olur çünkü kod henüz mevcut değildir.
  2. Kodu Yaz (Pass): Testleri geçecek kadar kod yazılır. Bu aşamada, kodun sadece testleri geçecek kadar basit olması yeterlidir.
  3. Refaktör Et (Refactor): Kodu temizleyerek ve optimize ederek daha sürdürülebilir hale getirilir.
  4. Tekrar Et (Repeat): Yeni özellikler için aynı süreç tekrarlanır.

TDD’nin Avantajları:

  • Hataları Erken Tespit Eder: Testler, kodun doğruluğunu erken aşamada kontrol eder.
  • Güvenilir Kod: Testler, kodun güvenilir ve hatasız olmasını sağlar.
  • Sürdürülebilirlik: Kodun bakımı ve genişletilebilirliği kolaylaşır.
  • Dokümantasyon: Testler, kodun nasıl çalışması gerektiğini belgeler.

2️⃣ Laravel’de Test Ortamını Ayarlama

Laravel, test yazmak için PHPUnit ve kendi test yardımcılarını kullanır. Testler, tests klasörü altında bulunur ve iki ana kategoriye ayrılır:

  • Unit Testleri (Birim Testleri): Tek bir fonksiyon veya sınıfın çalışmasını test eder.
  • Feature Testleri (Özellik Testleri): Uygulamanın belirli bir özelliğini test eder (örn. API endpoint’leri, veritabanı işlemleri).

Testleri Çalıştırma

Testleri çalıştırmak için aşağıdaki komutu kullanabilirsiniz:

php artisan test

Test Veritabanını Ayarlama

Testleri izole etmek için, testler sırasında ayrı bir veritabanı kullanabilirsiniz. Bunun için phpunit.xml dosyasında aşağıdaki değişikliği yapabilirsiniz:

<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>

Run HTML

Bu ayar, testler için hafızada çalışan bir SQLite veritabanı kullanmanızı sağlar.


3️⃣ Unit Test Yazımı (Birim Testleri)

Unit Testleri, tek bir fonksiyon veya sınıfın çalışmasını test eder. Bu testler, küçük ve bağımsız birimlerin doğruluğunu kontrol eder.

Yeni Bir Unit Test Oluşturma

Yeni bir unit test oluşturmak için aşağıdaki Artisan komutunu kullanabilirsiniz:

php artisan make:test ExampleTest --unit

Bu komut, tests/Unit/ExampleTest.php dosyasını oluşturur.

Örnek Unit Test

Basit bir toplama işlemini test eden bir unit test örneği:

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase
{
    public function test_basit_toplama()
    {
        $this->assertEquals(5, 2 + 3);
    }
}

Bu test, 2 + 3 işleminin sonucunun 5 olup olmadığını kontrol eder.

Testi Çalıştırma

Testi çalıştırmak için:

php artisan test --filter ExampleTest

4️⃣ Feature Test Yazımı (Özellik Testleri)

Feature Testleri, uygulamanın belirli bir özelliğini test eder. Örneğin, bir API endpoint’inin çalışması veya bir veritabanı işlemi.

Yeni Bir Feature Test Oluşturma

Yeni bir feature test oluşturmak için:

php artisan make:test UserTest

Bu komut, tests/Feature/UserTest.php dosyasını oluşturur.

Örnek Feature Test

Kullanıcı kayıt işlemini test eden bir feature test örneği:

namespace Tests\Feature;

use Tests\TestCase;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;

class UserTest extends TestCase
{
    use RefreshDatabase;

    public function test_kullanici_kayit_olabilir()
    {
        $response = $this->post('/register', [
            'name' => 'Ali Veli',
            'email' => 'ali@example.com',
            'password' => 'password123',
            'password_confirmation' => 'password123',
        ]);

        $response->assertRedirect('/home');
        $this->assertDatabaseHas('users', ['email' => 'ali@example.com']);
    }
}

Bu test, kullanıcı kayıt işleminin başarılı olup olmadığını kontrol eder.

Testi Çalıştırma

Testi çalıştırmak için:

php artisan test --filter UserTest

5️⃣ TDD ile Laravel Geliştirme

TDD yaklaşımını kullanarak bir blog yazısı ekleyen bir endpoint geliştirelim.

1. Testi Yaz (Fail)

İlk adımda, testi yazalım:

public function test_kullanici_blog_yazisi_ekleyebilir()
{
    $user = User::factory()->create();

    $response = $this->actingAs($user)->post('/posts', [
        'title' => 'Yeni Blog Yazısı',
        'content' => 'Bu bir test yazısıdır.',
    ]);

    $response->assertStatus(201);
    $this->assertDatabaseHas('posts', ['title' => 'Yeni Blog Yazısı']);
}

2. Testi Çalıştır (Fail)

Testi çalıştırdığımızda başarısız olacaktır çünkü henüz kod yazılmamıştır.

3. Kodu Yaz (Pass)

Testi geçecek kadar kod yazalım. Önce model, migration ve controller’ı oluşturalım:

php artisan make:model Post -mcr

Ardından, controller içinde store metodunu yazalım:

public function store(Request $request)
{
    $request->validate([
        'title' => 'required',
        'content' => 'required',
    ]);

    Post::create($request->all());

    return response()->json(['message' => 'Post başarıyla oluşturuldu'], 201);
}

4. Testi Tekrar Çalıştır (Pass)

Testi tekrar çalıştırdığımızda başarılı olacaktır.


6️⃣ Sonuç

Laravel’de Test Driven Development (TDD) yaklaşımı, uygulamanızın güvenilir ve sürdürülebilir olmasını sağlar. Unit ve feature testleri ile kodunuzun doğruluğunu kanıtlayabilir ve hataları erken tespit edebilirsiniz. Testlerin düzenli olarak çalıştırılması, uygulamanızın kalitesini artırır ve geliştirme sürecini hızlandırır.

Eğer Laravel ile web uygulamaları geliştiriyorsanız, TDD yaklaşımını benimseyerek daha güvenilir ve sağlam bir kod tabanı oluşturabilirsiniz. 🚀


Ek Konu Başlıkları:

  • Mocking ve Stubbing: Testlerde bağımlılıkları simüle etme.
  • Test Coverage: Kodun ne kadarının test edildiğini ölçme.
  • Continuous Integration (CI): Testleri otomatik olarak çalıştırma.
  • Browser Testleri: Laravel Dusk ile tarayıcı tabanlı testler yazma.
Web Doktoru

Matematikçi, Adli Bilişim Uzmanı, Bil. Yük. Müh. Full Stack Developer

Son Gönderiler

Mobil Uyumlu Web Tasarım Rehberi: Responsive Design ile Kullanıcı Deneyimini Mükemmelleştirin

Web trafiğinin %70'inden fazlası artık mobil cihazlardan geliyor. Google'ın mobil öncelikli indekslemesi (mobile-first indexing) 2026'da tam bir…

9 Haziran 2026

WordPress Bakım Hizmeti Neden Gerekli? Site Sahiplerinin Yapmaması Gereken 8 Hata

WordPress siteniz canlıya alındıktan sonra iş bitmiyor asıl iş o zaman başlıyor. Pek çok işletme…

5 Haziran 2026

Mobil Uygulama mı Web Uygulaması mı? İşletmeniz İçin Doğru Tercih Rehberi

İşletmeniz için dijital bir çözüm geliştirmek istediğinizde, karşılaşacağınız ilk soru genellikle budur: "Mobil uygulama mı…

3 Haziran 2026

WordPress Site Hız ve Performans Optimizasyonu: Sayfa Yüklenme Süresini 3 Saniyenin Altına İndirin

Web sitesi hızı, 2026'da sadece bir teknik detay değil — doğrudan iş sonuçlarını etkileyen kritik…

1 Haziran 2026

Sosyal Medya Pazarlama Rehberi 2026: Platformlara Göre Strateji ve Büyüme Taktikleri

Sosyal medya, 2026 itibarıyla 5.2 milyar aktif kullanıcıya ulaşmış durumda. Türkiye'de ise 65 milyondan fazla…

29 Mayıs 2026

İçerik Pazarlama Stratejileri 2026: Dönüşüm Oranını Artıran 10 Adım

"İçerik kraldır" diyerek başlamak bu noktada klasik kaçabilir ama gerçek değişmiyor: doğru içerik, doğru kişilere,…

27 Mayıs 2026