Sarıkaya Dev Logo

Laravel'de Unit Test ve Feature Test Yazma Rehberi

Mahmut Sarıkaya 3 min read 591 Views 0
Laravel'de Unit Test ve Feature Test Yazma Rehberi

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!
Tags: #Laravel #Unit Test #Feature Test #Laravel Testing #Laravel PHPUnit #Laravel Test Otomasyonu #Laravel TDD #Laravel Test Driven Development #Laravel Unit Testing #Laravel Feature Testing #Laravel Mocking #Laravel Test Database #Laravel Test Case #Laravel Testing Best Practices #Laravel API Test #Laravel Form Test #Laravel Validation Test #Laravel Authentication Test #Laravel Middleware Test #Laravel Controller Test #Laravel Model Test #Laravel Factory Test #Laravel Seeder Test #Laravel Queue Test #Laravel Notification Test #Laravel Event Test #Laravel Browser Testing #Laravel Dusk #Laravel PestPHP #Laravel Continuous Integration #Laravel Automated Testing #Laravel 12x
Share:
M

Written by

Mahmut Sarıkaya

Software Developer

Comments

No comments yet. Be the first to share your thoughts!

Leave a Comment

1 + 6 =