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:
- 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.
- Kodu Yaz (Pass): Testleri geçecek kadar kod yazılır. Bu aşamada, kodun sadece testleri geçecek kadar basit olması yeterlidir.
- Refaktör Et (Refactor): Kodu temizleyerek ve optimize ederek daha sürdürülebilir hale getirilir.
- 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' => '[email protected]',
'password' => 'password123',
'password_confirmation' => 'password123',
]);
$response->assertRedirect('/home');
$this->assertDatabaseHas('users', ['email' => '[email protected]']);
}
}
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.
Laravel Eğitimi Konular
- Laravel Nedir ve Neden Kullanılmalı?
- Laravel Kurulumu (Composer ile Adım Adım Rehber)
- Laravel Proje Yapısı ve MVC Mimarisi
- Laravel Routing ve Controller Kullanımı
- Laravel Middleware Kullanımı
- API isteklerinde middleware kullanımı
- Laravel Migration ve Seeder Kullanımı
- Laravel Factory ve Faker ile Test Verisi Üretme
- Laravel’de API Kullanımı ve Token Bazlı Authentication
- Laravel Rol ve Yetkilendirme İşlemleri
- Laravel’de Cache ve Performans Optimizasyonu
- Laravel’de Queue (Kuyruk) Kullanımı ve Arka Plan İşlemleri
- Laravel Event & Listener Kullanımı
- Laravel’de Scheduler (Zamanlanmış Görevler) Kullanımı: Otomatik İşlemler ve Zaman Yönetimi
- Laravel’de Test Driven Development (TDD) ve Test Yazımı