Docker ile Laravel Projelerinde Entegre Test Ortamı Kurulumu
Docker ile Laravel Projelerinde Entegre Test Ortamı Kurulumu
Modern yazılım geliştirme süreçlerinde testler, uygulamaların kalitesini ve güvenilirliğini sağlayan temel taşlardan biridir. Laravel gibi güçlü bir framework ile çalışırken, kapsamlı test stratejileri uygulamak, uzun vadede projenizin sürdürülebilirliği için kritik öneme sahiptir. Ancak, test ortamlarının tutarlılığını sağlamak, bağımlılıkları yönetmek ve farklı geliştiriciler arasında aynı koşulları oluşturmak çoğu zaman zorlayıcı olabilir. İşte bu noktada Docker, Laravel test süreçlerinizi kökten değiştirecek bir çözüm sunar.
Bu teknik rehberde, Docker'ı kullanarak Laravel projeleriniz için izole, tekrarlanabilir ve kolayca kurulabilen bir test ortamını nasıl oluşturacağınızı adım adım inceleyeceğiz. Amacımız, geliştirme ekibinizin her üyesinin aynı test ortamında çalışmasını sağlayarak, "benim makinemde çalışıyor" sorunlarını ortadan kaldırmak ve test süreçlerinizi daha verimli hale getirmektir.
Neden Laravel Testleri İçin Docker Kullanmalıyız?
Docker, uygulamaları ve bağımlılıklarını konteyner adı verilen izole paketler halinde çalıştırmanıza olanak tanır. Bu yaklaşımın Laravel testleri için sunduğu başlıca avantajlar şunlardır:
- Ortam Tutarlılığı: Her geliştirici ve CI/CD ortamı, aynı Docker imajlarını kullanarak tamamen aynı test ortamını çalıştırır. Bu, farklı PHP versiyonları, veritabanı sürümleri veya diğer bağımlılıkların neden olduğu uyumsuzlukları ortadan kaldırır.
- İzolasyon: Testleriniz, ana geliştirme ortamınızdan tamamen izole edilmiş bir konteyner içinde çalışır. Bu, testlerin ana veritabanınıza veya dosya sisteminize istenmeyen etkilerde bulunmasını engeller.
- Tekrarlanabilirlik: Bir Docker konteyneri her zaman aynı şekilde başlatılır. Bu sayede, testlerin her zaman aynı sonuçları vermesi garanti edilir ve hataların tespiti ile giderilmesi kolaylaşır.
- Kolay Kurulum: Yeni bir geliştiricinin projeye dahil olması veya yeni bir ortamın kurulması gerektiğinde, Docker Compose dosyası ile tüm bağımlılıklar (PHP, Nginx, MySQL/PostgreSQL, Redis vb.) tek bir komutla ayağa kaldırılabilir.
- Versiyon Kontrolü:
docker-compose.ymldosyası proje kodunuzla birlikte versiyon kontrol sistemine (Git) dahil edilebilir, böylece ortam yapılandırması da kodunuzla birlikte yönetilir.
Ön Koşullar
Bu rehberi takip etmek için aşağıdaki ön koşullara sahip olmanız gerekmektedir:
- Docker Desktop (veya Linux için Docker Engine) kurulu ve çalışır durumda olmalı.
- Temel Laravel ve komut satırı bilgisi.
- Mevcut bir Laravel projesi (veya yeni bir proje oluşturabilirsiniz).
Laravel Projesini Docker ile Çalıştırmak (Laravel Sail Kullanarak)
Laravel, Docker ile çalışmak için kendi resmi çözümü olan Laravel Sail'i sunar. Sail, Laravel projeniz için gerekli tüm Docker yapılandırmalarını otomatik olarak sağlar ve geliştirme sürecini büyük ölçüde basitleştirir. Eğer projenizde henüz Sail kurulu değilse, aşağıdaki adımları izleyebilirsiniz:
Yeni bir Laravel projesi oluşturuyorsanız:
curl -s "https://laravel.build/example-app" | bash
cd example-app
./vendor/bin/sail up
Mevcut bir Laravel projesine Sail ekliyorsanız:
cd your-laravel-project
composer require laravel/sail --dev
php artisan sail:install
./vendor/bin/sail up
./vendor/bin/sail up komutu, docker-compose.yml dosyasında tanımlanan tüm servisleri (PHP, MySQL, Nginx vb.) başlatacaktır. Artık Laravel projeniz Docker konteynerleri içinde çalışır durumda.
PHPUnit'i Docker Ortamına Entegre Etme
Laravel Sail ile çalışıyorsanız, PHPUnit zaten projenize entegre edilmiş durumdadır. Testleri çalıştırmak için php artisan test yerine sail artisan test komutunu kullanmanız yeterlidir:
./vendor/bin/sail artisan test
Bu komut, testlerinizi Docker konteyneri içinde çalıştırır ve çıktıları terminalinize yansıtır.
Testler İçin Ayrı Bir Veritabanı Yapılandırması
Testler genellikle ana uygulama veritabanınızdan bağımsız bir veritabanında çalıştırılmalıdır. Bu, testlerin veritabanında değişiklik yapmasının ana verilerinizi etkilemesini engeller. Laravel, bu durumu .env.testing dosyası ile kolayca yönetmenizi sağlar.
Projenizin kök dizininde .env.testing adında bir dosya oluşturun ve testleriniz için özel veritabanı bağlantı bilgilerini buraya ekleyin. Örneğin, testleriniz için SQLite'ı bellek içi (in-memory) bir veritabanı olarak kullanabilirsiniz. Bu, testleri çok daha hızlı hale getirir:
# .env.testing
APP_ENV=testing
DB_CONNECTION=sqlite
DB_DATABASE=:memory:
Eğer MySQL veya PostgreSQL gibi bir veritabanı kullanmak istiyorsanız, docker-compose.yml dosyanıza testler için ayrı bir veritabanı servisi ekleyebilir veya mevcut veritabanı servisinizin farklı bir veritabanı kullanmasını sağlayabilirsiniz. Örneğin, DB_DATABASE=testing_db şeklinde bir yapılandırma ile:
# .env.testing
APP_ENV=testing
DB_CONNECTION=mysql
DB_HOST=mysql # veya veritabanı servisinizin adı
DB_PORT=3306
DB_DATABASE=testing_db
DB_USERNAME=sail
DB_PASSWORD=password
phpunit.xml Ayarları
phpunit.xml dosyanız, PHPUnit'in nasıl çalışacağını belirler. Testleriniz çalıştırılmadan önce veritabanı migrasyonlarının çalıştırılması ve gerekli tohumlama (seeding) işlemlerinin yapılması için bu dosyayı düzenleyebilirsiniz. Özellikle bootstrap özniteliği ve testsuite içindeki env etiketleri önemlidir.
Varsayılan olarak, Laravel'in phpunit.xml dosyasında test ortamı için APP_ENV=testing ayarı bulunur. Ayrıca, testlerin çalıştırılmadan önce migrasyonları çalıştırmak için RefreshDatabase trait'ini test sınıflarınızda kullanabilirsiniz. Bu, her testten önce veritabanını temizleyip migrasyonları yeniden çalıştırarak testlerin birbirini etkilemesini engeller.
<!-- phpunit.xml -->
<phpunit ...>
<!-- ... diğer ayarlar ... -->
<php>
<env name="APP_ENV" value="testing"/>
<env name="BCRYPT_ROUNDS" value="4"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
<env name="MAIL_MAILER" value="array"/>
<env name="QUEUE_CONNECTION" value="sync"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="TELESCOPE_ENABLED" value="false"/>
</php>
<testsuites>
<testsuite name="Feature">
<directory>./tests/Feature</directory>
</testsuite>
<testsuite name="Unit">
<directory>./tests/Unit</directory>
</testsuite>
</testsuites>
<!-- ... diğer ayarlar ... -->
</phpunit>
Bu yapılandırma, .env.testing dosyanız yoksa veya bir env değişkeni phpunit.xml içinde doğrudan belirtilmişse, PHPUnit'in bu değerleri kullanmasını sağlar. SQLite in-memory veritabanı kullanımı için idealdir.
Test Sınıflarında RefreshDatabase Kullanımı
Her test çalıştırılmadan önce veritabanını sıfırlamak için Illuminate\Foundation\Testing\RefreshDatabase trait'ini kullanın:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class UserTest extends TestCase
{
use RefreshDatabase;
/** @test */
public function a_user_can_be_created()
{
$response = $this->post('/register', [
'name' => 'John Doe',
'email' => '[email protected]',
'password' => 'password',
'password_confirmation' => 'password',
]);
$response->assertRedirect('/home');
$this->assertDatabaseHas('users', ['email' => '[email protected]']);
}
}
Testleri Çalıştırma
Artık testlerinizi Docker ortamında çalıştırabilirsiniz:
- Tüm testleri çalıştırma:
./vendor/bin/sail artisan test - Belirli bir test dosyasını çalıştırma:
./vendor/bin/sail artisan test tests/Feature/UserTest.php - Belirli bir test grubunu çalıştırma:
./vendor/bin/sail artisan test --group=authentication - Hata veren testlerde durma:
./vendor/bin/sail artisan test --stop-on-failure
Sonuç
Docker ile Laravel test ortamı kurmak, geliştirme süreçlerinize büyük bir tutarlılık, verimlilik ve güvenilirlik katacaktır. Laravel Sail'in sağladığı kolaylıklar sayesinde, Docker'ın gücünü hızlıca projelerinize entegre edebilir ve "benim makinemde çalışıyor" mazeretini tarihe karıştırabilirsiniz.
Bu rehberde öğrendiğiniz adımları uygulayarak, hem bireysel geliştirme hem de ekip içi işbirliğinde test süreçlerinizi bir üst seviyeye taşıyabilir, daha sağlam ve hatasız Laravel uygulamaları geliştirebilirsiniz. Unutmayın, iyi test edilmiş bir uygulama, uzun vadeli başarının anahtarıdır.
9 yıllık yazılım deneyimiyle web, mobil ve AI çözümleri geliştiriyor. Laravel, Vue, n8n ve AI entegrasyonu üzerine yazılar yazıyor.