Laravel

Laravel Seeder ve Factory Kullanımı: Test Verisi Rehberi

Laravel Seeder ve Factory, geliştirme ve test ortamlarında tutarlı veriyi tekrar üretmek için birlikte kullanılır. Factory bir modelin varsayılan örnek verisini ve farklı durumlarını tanımlar; seeder ise hangi kayıtların hangi sırayla oluşturulacağını yönetir. Bu ayrım, controller koduna sahte veri eklemekten veya her testte uzun model dizileri yazmaktan daha sürdürülebilirdir.

Bu rehberde factory oluşturma, state tanımlama, ilişkili modeller üretme, seeder sıralaması ve production güvenliğini ele alacağız. Sürümünüze uygun davranış için resmî Eloquent Factories ve Database Seeding belgelerini kontrol edin.

Laravel Factory nasıl oluşturulur?

Factory sınıfları varsayılan olarak database/factories dizisinde tutulur. Model ile birlikte üretmek veya mevcut modele ayrı factory eklemek için Artisan kullanılabilir:

php artisan make:model Post -mf
php artisan make:factory PostFactory --model=Post
Laravel Factory definition ve Faker veri örneği
Factory definition metodu, model için geçerli ve tekrar üretilebilir varsayılan alanları tanımlar.
namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    public function definition(): array
    {
        return [
            'user_id' => User::factory(),
            'title' => fake()->sentence(6),
            'slug' => fake()->unique()->slug(),
            'body' => fake()->paragraphs(4, true),
            'status' => 'draft',
            'published_at' => null,
        ];
    }
}

Factory verisi, veritabanı kısıtlarını ve uygulama kurallarını karşılamalıdır. Rastgele veri üretmek geçersiz durumlar oluşturmak anlamına gelmez. Benzersiz alanlarda unique() kullanılabilir; çok büyük veri setlerinde olası çakışma ve üretim maliyetini ayrıca ölçün.

make ile create arasındaki fark

Post::factory()->make() modeli bellekte oluşturur fakat veritabanına yazmaz. create() kaydı kalıcı hâle getirir. Birim testte yalnızca model davranışı gerekiyorsa make, sorgu veya ilişki davranışı sınanacaksa create kullanın.

Factory state ile anlamlı senaryolar üretme

Her testte alanları elle değiştirmek yerine “yayında”, “taslak” veya “askıya alınmış” gibi iş durumlarını state metotlarında adlandırın:

public function published(): static
{
    return $this->state(fn (array $attributes) => [
        'status' => 'published',
        'published_at' => now(),
    ]);
}

public function archived(): static
{
    return $this->state(fn () => [
        'status' => 'archived',
    ]);
}
$post = Post::factory()->published()->create();
$posts = Post::factory()->count(10)->archived()->create();

State adları teknik alan değerinden çok iş davranışını anlatmalıdır. Böylece test, “status alanı X olsun” yerine “yayındaki yazı şu sonucu üretir” biçiminde okunur. Girdilerin doğrulanması için Laravel validation rehberindeki Form Request yaklaşımını kullanın.

İlişkili modeller Factory ile nasıl üretilir?

Laravel Factory has ve for ilişki oluşturma örneği
has ve for yardımcıları, ilişkili test verisini foreign key’leri elle yönetmeden üretir.

Bir kullanıcının üç yazısını üretmek için has, bir yazıyı belirli kullanıcıya bağlamak için for kullanılabilir:

$user = User::factory()
    ->has(Post::factory()->count(3)->published())
    ->create();

$post = Post::factory()
    ->for($user)
    ->has(Comment::factory()->count(5))
    ->create();

Many-to-many senaryoda hasAttached ile pivot alanları da üretilebilir. İlişki yönleri, pivot ve eager loading ayrıntıları için Laravel Eloquent relationships rehberini inceleyin.

Factory callback ne zaman kullanılmalı?

afterMaking ve afterCreating, model üretildikten sonra ek işlem çalıştırır. Basit ilişki factory yardımcılarıyla ifade edilebiliyorsa callback eklemeyin. Callback içinde dış API, gerçek e-posta veya kontrolsüz queue işi çalıştırmak testleri yavaş ve öngörülemez yapar.

Laravel Seeder nasıl yazılır?

Seeder sınıfları database/seeders altında yer alır. Büyük veri setini alanlara göre ayırıp DatabaseSeeder içinden sırayla çağırın:

php artisan make:seeder RoleSeeder
php artisan make:seeder DemoContentSeeder
class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            RoleSeeder::class,
            AdminUserSeeder::class,
            DemoContentSeeder::class,
        ]);
    }
}

Bağımlı kayıtlar önce oluşturulmalıdır: roller kullanıcıdan, kullanıcılar yazılardan önce gelmelidir. Demo veri ile uygulamanın çalışması için zorunlu referans verisini ayrı seeder sınıflarında tutun.

Idempotent seeding ve production güvenliği

Laravel Seeder production güvenliği ve çalışma sırası
Production seeder yalnızca zorunlu referans verisini, güvenli ve tekrar çalıştırılabilir biçimde oluşturmalıdır.

Aynı seeder ikinci kez çalıştığında duplicate kayıt oluşturmaması gerekiyorsa firstOrCreate veya iş kuralına uygunsa updateOrCreate kullanın:

Role::updateOrCreate(
    ['slug' => 'admin'],
    ['name' => 'Yönetici']
);

Production ortamında seeding komutu koruma ister ve çoğu sürümde bilinçli onay için --force gerekir. Bu bayrağı otomatik dağıtım betiğine düşünmeden eklemeyin. Seeder içinde sabit, bilinen parola veya gerçek kişisel veri bulundurmayın. Demo içeriği canlı veritabanına taşımayın; zorunlu referans verisini küçük ve denetlenebilir tutun.

Arka planda yan etki oluşturan event ve job’lar seed sırasında beklenmedik işlemler başlatabilir. Queue davranışını ayırmak için Laravel Queue rehberini, dağıtım öncesi kontroller için Laravel güvenlik kontrol listesini kullanın.

Seeder ve Factory komutları

# Tüm seeder zincirini çalıştır
php artisan db:seed

# Belirli bir seeder sınıfını çalıştır
php artisan db:seed --class=RoleSeeder

# Veritabanını yeniden kur ve seed et
php artisan migrate:fresh --seed

migrate:fresh tüm tabloları silip yeniden oluşturur. Bu komutu canlı veya korunması gereken veritabanında çalıştırmayın. Ortamı, bağlantı adını ve yedeği doğrulamadan yıkıcı migration komutları kullanmak geri dönüşü zor veri kaybına neden olabilir.

Factory ile test yazma

public function test_guest_cannot_edit_published_post(): void
{
    $post = Post::factory()->published()->create();

    $this->get(route('posts.edit', $post))
        ->assertRedirectToRoute('login');
}

Testin yalnızca ihtiyaç duyduğu veriyi üretin. Her testte yüzlerce ilgisiz kayıt oluşturmak suite süresini uzatır ve hatanın nedenini gizler. Görünüm çıktısını kontrol ediyorsanız Laravel Blade template rehberindeki feature test yaklaşımını uygulayın.

Pratik kontrol listesi

  • Factory varsayılanları veritabanı ve validation kurallarına uyuyor mu?
  • İş durumları tekrar eden alan dizileri yerine state olarak tanımlandı mı?
  • İlişkiler has, for veya hasAttached ile açıkça kuruluyor mu?
  • Demo veri ile zorunlu referans verisi ayrı seeder sınıflarında mı?
  • Production seeder tekrar çalıştırılabilir ve kişisel veriden arındırılmış mı?
  • migrate:fresh yalnızca güvenli, geçici ortamda mı kullanılıyor?
  • Test başına yalnızca gerekli veri mi oluşturuluyor?

Sıkça Sorulan Sorular

Laravel Seeder ile Factory arasındaki fark nedir?

Factory modelin örnek alanlarını ve durumlarını tanımlar. Seeder hangi factory veya sabit kayıtların hangi sırayla oluşturulacağını yönetir.

Factory make ve create farkı nedir?

make modeli bellekte üretir; create veritabanına kaydeder. Veritabanı davranışı gerekmeyen testte make daha hafiftir.

Seeder production ortamında çalıştırılır mı?

Yalnızca gerekli referans verisi için, kodu incelenmiş ve tekrar çalıştırılabilir seeder kullanılmalıdır. Demo veri, sabit parola ve yıkıcı işlemler production seeder’a konulmamalıdır.

migrate fresh seed komutu ne yapar?

migrate:fresh --seed tüm tabloları siler, migration’ları yeniden çalıştırır ve seeder’ı başlatır. Korunması gereken bir veritabanında kullanılmamalıdır.

Factory verisi neden bazen unique hatası verir?

Alan havuzu küçük olabilir, mevcut verilerle çakışabilir veya çok fazla kayıt üretiliyor olabilir. Factory kuralını ve veritabanı unique index’ini birlikte inceleyin.

Sonuç

Laravel Seeder ve Factory düzeninde factory, geçerli model verisinin tarifidir; seeder ise veri senaryosunun orkestrasyonudur. Anlamlı state’ler tanımlayın, ilişkileri factory yardımcılarıyla kurun, production verisini demo veriden ayırın ve yıkıcı komutlarda ortamı mutlaka doğrulayın. Böylece testler daha okunabilir, geliştirme ortamı daha hızlı kurulabilir ve veri üretimi güvenli hâle gelir.

ozgur

Özgür Bayram, WordPress, Laravel, yapay zekâ ve web performansı alanlarında çalışan bir yazılım geliştiricisidir. Bilim Meraklısı’nda teknoloji, yazılım, hosting, SEO ve dijital araçlar hakkında anlaşılır, uygulanabilir rehberler hazırlar. Amacı, teknik konuları sade bir dille anlatarak okuyucuların doğru kararlar vermesine ve sorunlarını güvenle çözmesine yardımcı olmaktır.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu