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!
tests/Unit
dizininde bulunurtests/Feature
dizininde bulunurÖ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(); } }
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
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ı 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()
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()
.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:"/>
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'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!