Unit Test: Kodu İzole Ederek Test Etmek
Bir yazılım geliştiricisi olarak, ilk başta karşılaştığınız test türü genellikle Unit Test (Birim Testi) olacaktır. Unit test, kodun en küçük birimlerinin (fonksiyon ya da metod gibi) doğru çalışıp çalışmadığını test etmenizi sağlar. Bu testler, kodunuzun doğru şekilde çalıştığını garantileyen ilk savunma hattını oluşturur.
Örnek vermek gerekirse, bir kullanıcı kaydederken kullanılan bir doğrulama fonksiyonunun doğru çalışıp çalışmadığını test etmek için bir unit test yazmak oldukça etkili olur. Symfony ile unit test yazarken PHPUnit kullanılır. İşte basit bir unit test örneği:
use PHPUnit\Framework\TestCase;
class UserTest extends TestCase
{
public function testIsValid()
{
$user = new User();
$user->setName('John Doe');
$this->assertTrue($user->isValid());
}
}
Yukarıdaki örnekte, `User` sınıfı içinde kullanıcı adı doğrulamasını test ediyoruz. Bu test, sadece bir metodun doğru çalışıp çalışmadığını kontrol eder. Ancak unutmamalısınız ki, Unit Test yalnızca tek bir fonksiyonun çalışmasını kontrol eder ve gerçek dünya senaryoları hakkında size yeterli bilgi vermez.
Functional Test: Bir Adım Daha İleri Gitmek
Bir sonraki test türümüz ise Functional Test (Fonksiyonel Test) olacaktır. Bu test, uygulamanızın belirli bir fonksiyonunun (örneğin kullanıcı kaydı, giriş yapma) doğru çalışıp çalışmadığını inceler. Ancak unit testten farkı, genellikle veritabanı ya da dış API'ler gibi bağımlılıkları da içerir.
Symfony'de, genellikle WebTestCase sınıfı ile yazılır. İşte bir örnek:
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class UserControllerTest extends WebTestCase
{
public function testUserRegistration()
{
$client = static::createClient();
$crawler = $client->request('GET', '/register');
$this->assertEquals(200, $client->getResponse()->getStatusCode());
}
}
Bu test, kullanıcının kayıt sayfasına erişimini test eder ve sayfanın doğru şekilde yüklendiğini kontrol eder. Fonksiyonel testler, uygulamanın kullanıcı tarafından görülen yönlerini test eder ve genellikle tarayıcı ya da API talepleriyle yapılan işlemleri içerir. Bu nedenle, gerçek dünyada nasıl davrandığını daha iyi test edebilirsiniz.
Integration Test: Tüm Bileşenleri Birleştirerek Test Etmek
En ileri seviye test türü ise Integration Test (Entegrasyon Testi) olarak karşımıza çıkar. Burada amaç, birden fazla bileşenin birlikte doğru çalışıp çalışmadığını test etmektir. Yani, birimlerin birbirleriyle nasıl etkileşime girdiğini ve birlikte nasıl çalıştığını görmek istiyorsunuz.
Örnek olarak, bir kullanıcı kaydı, veritabanına veri yazma ve daha sonra bu veriyi okuma işlemlerini test etmek isteyebilirsiniz. Symfony ile entegrasyon testi yazarken, genellikle Symfony'nin test ortamını ve veritabanı bağlantısını kullanırsınız. İşte bir örnek:
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
class UserServiceTest extends KernelTestCase
{
public function testUserRegistrationAndFetching()
{
$em = self::getContainer()->get('doctrine.orm.entity_manager');
$userService = new UserService($em);
$user = $userService->registerUser('John Doe');
$this->assertNotNull($user->getId());
$fetchedUser = $em->getRepository(User::class)->find($user->getId());
$this->assertEquals('John Doe', $fetchedUser->getName());
}
}
Bu test, bir kullanıcı kaydını yapar, veritabanına yazar ve ardından veritabanından çekerek kaydın doğru yapıldığını kontrol eder. Bu tür testler, tüm sistemin doğru bir şekilde entegre olup olmadığını gösterir.
Sonuç Olarak
Her test türünün kendine has bir amacı ve kullanıldığı yerler vardır. Unit Test, her fonksiyonun doğru çalışıp çalışmadığını kontrol ederken, Functional Test uygulamanızın işlevsel özelliklerinin doğru çalışıp çalışmadığını, Integration Test ise tüm sistemin bir arada doğru şekilde işleyip işlemediğini inceler. Symfony ile bu test türlerini doğru kullanmak, yazılımınızın sağlam ve güvenilir olmasını sağlar.
Bu yazının sonunda, her bir testin önemini ve nasıl kullanıldığını öğrendiniz. Symfony ile daha güvenli ve hızlı uygulamalar geliştirmek için test yazmaya başlamak, sizi bir adım öne taşıyacaktır.