design

Laravel'de Unit Test ve Feature Test Yazma Rehberi

March 24, 2025

Merhaba arkadaşlar, bugün sizlerle Laravel'de test yazma sanatını detaylı şekilde inceleyeceğiz. Modern yazılım geliştirmede testler, uygulamalarımızın güvenilirliğini sağlamanın en kritik adımlarından biridir. Laravel bize harika bir test ortamı sunuyor, gelin birlikte keşfedelim!


Laravel'de Test Türleri

  1. Unit Testler
  • Tek bir sınıf veya metodu test eder
  • Hızlı çalışır, dış bağımlılıklardan izole edilir
  • tests/Unit dizininde bulunur
  1. Feature Testler
  • Uygulamanın bir özelliğini bütünsel test eder
  • HTTP istekleri, veritabanı işlemleri içerir
  • tests/Feature dizininde bulunur


Temel Test Yazımı

Örnek bir test sınıfı oluşturalım:


php artisan make:test UserTest


Unit Test Örneği:

namespace Tests\Unit;

use Tests\TestCase;
use App\Models\User;

class UserTest extends TestCase
{
    public function test_user_full_name()
    {
        $user = new User([
            'first_name' => 'Ahmet',
            'last_name' => 'Yılmaz'
        ]);

        $this->assertEquals('Ahmet Yılmaz', $user->full_name);
    }
}


Feature Test Örneği:

namespace Tests\Feature;

use Tests\TestCase;
use App\Models\User;

class AuthTest extends TestCase
{
    public function test_login_screen_can_be_rendered()
    {
        $response = $this->get('/login');
        $response->assertStatus(200);
    }

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

        $response = $this->post('/login', [
            'email' => $user->email,
            'password' => 'password'
        ]);

        $this->assertAuthenticated();
    }
}


Test Verileri Oluşturma

Laravel'in Factory sistemiyle test verileri oluşturabiliriz:

php artisan make:factory UserFactory


Factory Tanımı:

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

class UserFactory extends Factory
{
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'password' => bcrypt('password'),
        ];
    }
}


Testte Kullanımı:

$user = User::factory()->create(); // Veritabanına kaydeder
$user = User::factory()->make(); // Sadece nesne oluşturur


HTTP Testleri

Laravel HTTP testleri için zengin bir API sunar:

public function test_create_user()
{
    $response = $this->postJson('/api/users', [
        'name' => 'Test User',
        'email' => 'test@example.com',
        'password' => 'password'
    ]);

    $response
        ->assertStatus(201)
        ->assertJson([
            'created' => true,
        ]);
}


Önemli Assertion'lar:

  • assertStatus(200)
  • assertJson(['key' => 'value'])
  • assertRedirect('/dashboard')
  • assertSessionHas('success')



Veritabanı Testleri

Veritabanı işlemlerini test etmek için:

public function test_user_is_created()
{
    $this->post('/users', [
        'name' => 'Test User',
        'email' => 'test@example.com'
    ]);

    $this->assertDatabaseHas('users', [
        'email' => 'test@example.com'
    ]);
}


Veritabanı Assertion'ları:

  • assertDatabaseHas()
  • assertDatabaseMissing()
  • assertDatabaseCount()



Mocking ve Fake'ler

Dış servisleri taklit etmek için:

public function test_order_processing()
{
    $paymentGateway = $this->mock(PaymentGateway::class);
    $paymentGateway->shouldReceive('charge')
                  ->once()
                  ->andReturn('success');

    $response = $this->post('/orders', [
        'product_id' => 1,
        'payment_token' => 'token123'
    ]);

    $response->assertStatus(201);
}


Popüler Fake'ler:

  • Mail::fake()
  • Notification::fake()
  • Event::fake()
  • Storage::fake()

Test Ortamı Yapılandırması

.env.testing dosyası oluşturabilirsiniz:

APP_ENV=testing
DB_CONNECTION=sqlite
DB_DATABASE=:memory:


phpunit.xml özelleştirmeleri:

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



Test Çalıştırma

Tüm testleri çalıştırma:

php artisan test

Belirli bir test sınıfı:


php artisan test tests/Feature/AuthTest.php

Filtreleme:


php artisan test --filter=test_user_creation


Laravel Test Yazmanın Avantajları

  1. Hızlı Geliştirme: Zengin assertion ve helper metodları
  2. Entegrasyon: Laravel bileşenleriyle tam uyum
  3. Esneklik: Mocking ve fake'lerle kompleks senaryolar
  4. Veritabanı Desteği: Test verileri kolay yönetim
  5. CI/CD Uyumu: Modern pipeline'larla entegrasyon


Laravel'de test yazmak, uygulamanızın güvenilirliğini artırmanın en etkili yoludur. Unit testlerle bileşenleri izole şekilde, feature testlerle de bütünsel olarak test edebilirsiniz.Bir sonraki yazımızda Laravel'de Database Sharding: Büyük Verileri Yönetme konusunu ele alacağız. Görüşmek üzere!

1 + 1 =