Nova Test

php artisan make:test UserTest” komutu, Laravel framework’ü altında bulunan PHPUnit test aracını kullanarak yeni bir “UserTest" adında bir test sınıfı oluşturur. Bu sınıf, uygulamanızdaki User modelinin doğru şekilde çalışıp çalışmadığını test etmek için kullanılabilir.

Test sınıfları, Laravel’deki test süitlerinin temel yapı taşlarıdır ve testlerin nasıl yapılandırılacağı, nasıl çalışacağı ve nasıl raporlanacağı hakkında bilgi sağlarlar. Test sınıfları, testlerin otomatik olarak çalıştırılmasını sağlar ve hataların hızlı bir şekilde tespit edilmesine yardımcı olur.

php artisan make:test UserTest” komutunu kullanarak oluşturduğunuz UserTest sınıfı, Laravel’in test araçlarına sahip bir sınıftır. Bu sınıf, testlerinizi yazmanız için bir şablon olarak kullanılır ve tests/Feature dizini altında yer alır.

Test sınıfları, belirli bir işlevselliği veya uygulama özelliğini test etmek için kullanılır. Laravel, PHPUnit ile birlikte gelir ve PHPUnit, test sınıflarını çalıştırmak ve testlerin geçip geçmediğini kontrol etmek için kullanılır.

UserTest sınıfı, kullanıcı işlemlerinin doğru çalışıp çalışmadığını test etmek için örnek bir sınıftır. Örneğin, UserTest sınıfı, bir kullanıcının kaydedilmesi, güncellenmesi, silinmesi, listelenmesi gibi işlevleri test edebilir.

Testler, PHPUnit‘ın assert metodları kullanılarak yazılır. Bu metodlar, beklenen sonuçların gerçek sonuçlarla eşleşip eşleşmediğini kontrol eder. Örneğin, $this->assertTrue(true) metodunu kullanarak, doğru bir test koşulunun gerçekleştiğini onaylayabilirsiniz.

Test sınıfları, uygulamanızdaki hataları tespit etmek, yeni özellikler eklemek veya değişiklikler yapmak için mevcut özelliklerin doğru çalışıp çalışmadığını test etmek için kullanılabilir. Bu şekilde, uygulamanızın kalitesini artırabilir ve güvenliğini sağlayabilirsiniz.

Örneğin, User modelinin kaydedilmesi ve bulunmasıyla ilgili bir test yazmak istediğinizi varsayalım. User modeli için yeni bir test sınıfı oluşturmak için şu komutu kullanabilirsiniz:

php artisan make:test UserModelTest --unit

Bu, tests/Unit dizini altında UserModelTest.php adında bir test dosyası oluşturur.

UserModelTest sınıfına, test_user_can_be_created_and_retrieved() adında bir test ekleyelim:

<?php

namespace Tests\Unit;

use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\TestCase;

class UserModelTest extends TestCase
{
    use RefreshDatabase;
    public function createApplication() {
        $app = require __DIR__.'/../../bootstrap/app.php';
        $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
        return $app;
    }
    public function test_example(): void {
        $this->assertTrue(true);
    }
    public function test_user_can_be_created_and_retrieved() {
        $user = User::factory()->create([
            'name' => 'Mikail LEKESIZ',
            'email' => 'mikail@lekesiz.org',
            'password' => Hash::make('password'),
        ]);
        $this->assertDatabaseHas('users', ['email' => 'mikail@lekesiz.org']);
        $retrievedUser = User::where('email', 'mikail@lekesiz.org')->first();
        $this->assertEquals($user->id, $retrievedUser->id);
    }
}

Bu test, bir kullanıcının kaydedilip kaydedilmediğini kontrol eder ve ardından kaydedilen kullanıcıyı bulmaya çalışır. Testin geçip geçmediğini kontrol etmek için $this->assertDatabaseHas() ve $this->assertEquals() metodlarını kullanır.

Bu testi çalıştırmak için php artisan test komutunu kullanabilirsiniz.

UserModelTest sınıfındaki test_user_can_be_created_and_retrieved() metodu, bir kullanıcı oluşturmayı ve ardından veritabanından bu kullanıcıyı geri almayı test eder.

  1. Öncelikle, User::factory()->create() ile User modeli için bir factory kullanarak yeni bir kullanıcı oluşturulur ve veritabanına kaydedilir.
  2. Ardından, $this->assertDatabaseHas('users', ['email' => 'mikail@lekesiz.org']); ile veritabanında oluşturulan kullanıcının gerçekten kaydedildiğini doğrulamak için bir kontrol yapılır.
  3. Daha sonra, User::where('email', 'mikail@lekesiz.org')->first(); ile veritabanından oluşturulan kullanıcıyı geri alır ve $retrievedUser değişkenine atar.
  4. Son olarak, $this->assertEquals($user->id, $retrievedUser->id); ile oluşturulan kullanıcının ve geri alınan kullanıcının aynı olduğunu kontrol eder (ID’lerinin eşit olduğunu doğrular).

Bu örnek, mevcut User modelinde nasıl testler yazabileceğinizi gösterir. Model testleri, modellerin doğru çalışıp çalışmadığını test etmek için kullanılır ve uygulamanızın kalitesini artırmanıza yardımcı olur.

Feature ve Unit testleri, farklı seviyelerdeki testlerdir ve farklı amaçlar için kullanılırlar.

Feature testleri, bir uygulamanın işlevselliğini kontrol etmek için kullanılır. Bu testler, uygulamanın bir HTTP isteğiyle nasıl davrandığını test eder. Örneğin, bir form gönderildiğinde veya bir bağlantı tıklandığında uygulamanın beklenen yanıtı verip vermediğini kontrol edebilirsiniz. Feature testleri, uygulamanın tüm katmanlarını test etmek için kullanılır ve uygulamanızın gerçek kullanım senaryolarını simüle eder.

Unit testleri, bir uygulamanın belirli bir parçasını test etmek için kullanılır. Bu testler, bir sınıfın veya yöntemin beklenen davranışını doğrulamak için kullanılır. Örneğin, bir sınıfın yöntemlerinin doğru şekilde çalışıp çalışmadığını veya bir işlevin doğru değerleri döndürüp döndürmediğini kontrol edebilirsiniz. Unit testleri, uygulamanızın küçük parçalarını test etmek için kullanılır ve uygulamanın herhangi bir harici bağımlılığa ihtiyaç duymadan test edilebilmesini sağlar.

Feature ve Unit testlerinin ayırıcı özellikleri, test edilen konuların farklı seviyelerde olmasıdır. Feature testleri, uygulamanın işlevselliğini test etmek için kullanılırken, Unit testleri, kodun küçük parçalarını test etmek için kullanılır. Bu nedenle, uygulamanın doğru şekilde test edilmesi ve sorunların tespit edilmesi için hem Feature hem de Unit testlerine ihtiyaç vardır.

Laravel, Feature testleri için tests/Feature dizinini ve Unit testleri için tests/Unit dizinini kullanır. Bu sayede, test sınıflarınızı kolayca organize edebilir ve uygulamanızın her seviyesindeki işlevselliği doğru şekilde test edebilirsiniz.