Makale boyunca test süreçleri için en güncel birim testleri kütüphanesi "pest" tercih edilmiştir.
Laravel, veritabanı odaklı uygulamalarınızı test etmeyi kolaylaştırmak için çeşitli yararlı araçlar ve doğrulamalar sunar. Ayrıca, Laravel model fabrikaları ve tohumlayıcıları, uygulamanızın Eloquent modellerini ve ilişkilerini kullanarak test veritabanı kayıtları oluşturmayı zahmetsiz hale getirir. Tüm bu güçlü özellikleri aşağıdaki belgelerde ele alacağız.
Her Testten Sonra Veritabanını Sıfırlama
Daha fazla ilerlemeden önce, her testinizden sonra veritabanınızı nasıl sıfırlayacağınızı ve böylece önceki bir testten gelen verilerin sonraki testlerle çakışmamasını nasıl sağlayacağınızı tartışalım. Laravel'in dahil ettiği
IlluminateFoundationTestingRefreshDatabase özelliği bunu sizin için halledecektir. Özelliği test sınıfınızda kullanmanız yeterlidir:
<?php
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
test('basic example', function () {
$response = $this->get('/');
// ...
});IlluminateFoundationTestingRefreshDatabase özelliği, şemanız güncelse veritabanınızı taşımaz. Bunun yerine, testi yalnızca bir veritabanı işlemi içinde yürütür. Bu nedenle, bu özelliği kullanmayan test vakaları tarafından veritabanına eklenen tüm kayıtlar veritabanında hala mevcut olabilir. Veritabanını tamamen sıfırlamak isterseniz, bunun yerine
IlluminateFoundationTestingDatabaseMigrations veya
IlluminateFoundationTestingDatabaseTruncation özelliklerini kullanabilirsiniz. Ancak, bu seçeneklerin her ikisi de
RefreshDatabase özelliğinden önemli ölçüde daha yavaştır.
Model ve Fabrikalar (Eloquent Model and Factories)
Test ederken, testinizi yürütmeden önce veritabanınıza birkaç kayıt eklemeniz gerekebilir. Bu test verilerini oluştururken her bir sütunun değerini manuel olarak belirtmek yerine,
Laravel model fabrikalarını kullanarak her bir Eloquent modeliniz için bir dizi varsayılan öznitelik tanımlamanıza olanak tanır. Bir model fabrikası tanımladıktan sonra, modeller oluşturmak için fabrikayı testinizde kullanabilirsiniz:
use App\Models\User;
test('models can be instantiated', function () {
$user = User::factory()->create();
// ...
});Çalışan Tohumlayıcılar (Database Seeders)
Bir özellik testi sırasında veritabanınızı doldurmak için veritabanı ekicilerini kullanmak isterseniz, tohum yöntemini çağırabilirsiniz. Varsayılan olarak, tohum yöntemi diğer tüm ekicilerinizi çalıştırması gereken
DatabaseSeeder'ı çalıştıracaktır. Alternatif olarak, tohum yöntemine belirli bir ekici sınıf adı geçirebilirsiniz:
<?php
use Database\Seeders\OrderStatusSeeder;
use Database\Seeders\TransactionStatusSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
uses(RefreshDatabase::class);
test('orders can be created', function () {
// Run the DatabaseSeeder...
$this->seed();
// Run a specific seeder...
$this->seed(OrderStatusSeeder::class);
// ...
// Run an array of specific seeders...
$this->seed([
OrderStatusSeeder::class,
TransactionStatusSeeder::class,
// ...
]);
});Alternatif olarak, Laravel'e
RefreshDatabase özelliğini kullanan her testten önce veritabanını otomatik olarak tohumlamasını söyleyebilirsiniz. Bunu, temel test sınıfınızda bir
$seed özelliği tanımlayarak başarabilirsiniz:
<?php
namespace Tests;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
/**
* Indicates whether the default seeder should run before each test.
*
* @var bool
*/
protected $seed = true;
}$seed özelliği doğru olduğunda, test
RefreshDatabase özelliğini kullanan her testten önce
DatabaseSeedersDatabaseSeeder sınıfını çalıştıracaktır. Ancak, test sınıfınızda bir
$seeder özelliği tanımlayarak yürütülmesi gereken belirli bir ekici belirtebilirsiniz:
use Database\Seeders\OrderStatusSeeder;
/**
* Run a specific seeder before each test.
*
* @var string
*/
protected $seeder = OrderStatusSeeder::class;
Mevcut İddialar (Available Assertions)
Laravel, Pest veya PHPUnit özellik testleriniz için çeşitli veritabanı doğrulamaları sağlar. Bu doğrulamaların her birini aşağıda tartışacağız.
assertDatabaseCount
Veritabanındaki bir tablonun belirtilen sayıda kayıt içerdiğini varsayalım:
$this->assertDatabaseCount('users', 5);assertDatabaseEmpty
Veritabanındaki bir tablonun hiçbir kayıt içermediğini varsayalım:
$this->assertDatabaseEmpty('users');assertDatabaseHas
Veritabanındaki bir tablonun, verilen anahtar/değer sorgu kısıtlamalarıyla eşleşen kayıtları içerdiğini varsayalım:
$this->assertDatabaseHas('users', [
'email' => 'rokito@example.com',
]);assertDatabaseMissing
Veritabanındaki bir tablonun, verilen anahtar/değer sorgu kısıtlamalarıyla eşleşen kayıtlar içermediğini ileri sürün:
$this->assertDatabaseMissing('users', [
'email' => 'rokito@example.com',
]);assertSoftDeleted
assertSoftDeleted yöntemi, belirli bir Eloquent modelinin "yumuşak bir şekilde silindiğini" doğrulamak için kullanılabilir:
$this->assertSoftDeleted($user);
assertNotSoftDeleted
assertNotSoftDeleted yöntemi, belirli bir Eloquent modelinin "yumuşak bir şekilde silinmediğini" doğrulamak için kullanılabilir:
$this->assertNotSoftDeleted($user);
assertModelExists
Belirli bir modelin veritabanında mevcut olduğunu varsayalım:
use App\Models\User;
$user = User::factory()->create();
$this->assertModelExists($user);
assertModelMissing
Verilen modelin veritabanında bulunmadığını ileri sürün:
use App\Models\User;
$user = User::factory()->create();
$user->delete();
$this->assertModelMissing($user);
expectsDatabaseQueryCount
expectsDatabaseQueryCount yöntemi, testiniz sırasında çalıştırılmasını beklediğiniz toplam veritabanı sorgusu sayısını belirtmek için testinizin başında çağrılabilir. Gerçekte yürütülen sorgu sayısı bu beklentiyle tam olarak uyuşmuyorsa, test başarısız olur:
$this->expectsDatabaseQueryCount(5);
// Test...