3 min read

PHPUnit ile Test Odaklı Yazılım Geliştirme

Bu yazımızda PHPUnit kullanarak Unit test ile yazılım geliştirmeden bahsedeceğiz. PHPUnit kurulumuyla ilgili daha önce yazdığımız yazıyı okumadıysanız, buradan ulaşabilir ve PHPUnit kurulumunu gerçekleştirebilirsiniz.

PHPUnit’den kısaca bahsedecek olursak yazdığımız kodların testlerini programatik olarak kontrol edebildiğimiz bir Unit Test Framework’üdür. Bu framework ile geliştirdiğimiz kodları sürekli aynı testleri manuel yapmak yerine programatik olarak yapıp eksik hatalı veya bozulan yerlerin tesbitini programatik olarak yapabilme imkanı sağlıyor.

PHPUnit ile Test Ortamı Oluşturma

Eğer bir framework kullanıyorsanız (Symfony, Laravel vb.) nasıl test yazabileceğiniz framework’ün dökümanların yer alıyordur fakat bu başlıkta bir framework’e bağlı olmadan kendi structure’ımızda basit anlamda bir test yapısı oluşturacağız.

Görseldeki gibi bir dizin yapımız mevcut bunları tek tek açıklayacak olursak;

vendor: Composer’ın varsayılanda oluşturduğu içinde autoload.php dosyasının yer aldığı ve paketlerin yer aldığı dizin.
tests: Testlerimizi yazacağımız dizin. Tüm testlerimiz bu dizin içerisinde yer alacak.
src: Yazacağımız kodların yer aldığı dizin.

composer.json dosyam ise aşağıdaki gibidir;

{
    "autoload": {
        "classmap": [
            "src/"
        ]
    },
    "require-dev": {
        "phpunit/phpunit": "^8"
    }
}

Src dizininde yer alan tüm sınıfları otomatik olarak composer başlangıçta yükleyecek.

İlk Sınıfımız

<?php

class General
{
    /**
     * @return null
     */
    public function returnNull()
    {
        return null;
    }

    /**
     * @param array $array
     * @param string $value
     * @return array
     */
    public function pushArray($array, $value)
    {
        array_push($array, $value);
        return $array;
    }

    /**
     * @param string $value
     * @return string
     */
    public function extractNumbers($value)
    {
        return preg_replace('/[\D]/', '', $value);
    }

    /**
     * @param string $string
     * @return int
     */
    public function stringLength($string)
    {
        return mb_strlen($string);
    }
}

Yukarıdaki sınıfta basit anlamda işlemler yapan 4 adet metot bulunmakta. Bu metotların testlerini yazmaya geçelim.

Test Sınıfımız İse

<?php

declare(strict_types=1);

use PHPUnit\Framework\TestCase;

class GeneralTest extends TestCase
{
    public $general = null;

    public function setUp(): void
    {
        parent::setUp();
        $this->general = new General();
    }

    public function testReturnNull(): void
    {
        $this->assertNull($this->general->returnNull());
    }

    public function testExtractNumbers(): void
    {
        $value = $this->general->extractNumbers("I'm using PHP7.3");
        $this->assertIsNumeric($value);
        $this->assertEquals('73', $value);
    }

    public function testStringLength(): void
    {
        $this->assertEquals(16, $this->general->stringLength("I'm using PHP7.3"));
    }

    public function testPushArray(): void
    {
        $this->assertContains("php", $this->general->pushArray(['html', 'css', 'javascript'], 'php'));
    }
}

Burada açıklamak istediğim bazı detaylar var. Test metotlarımızın hepsi test öneki ile başlıyor. Yani PushArray metodu bir test metodu olması için testPushArray şeklinde isimlendirilmeli.

setUp metodu, test kodları çalışmadan önce çalışan metot. Burada sınıfımızı initialize edip testler içerisinde tekrar tekrar aynı kodu yazmanın önüne geçmiş olduk.

$this->assertNull Bu metot PHPUnit’in test metotlarından biri. Karşılaştırdığı verinin “null” tipinde olması gerekir.

assertIsNumeric, assertEquals, assertEquals ve assertContains metotları da PHPUnit framework’ünde yer alan metotlar. Bunlar da bir önceki örnekte açıkladığım gibi karşılaştırma ve veri kontrolleri yapmakta.

Testimizi Çalıştıralım

./vendor/bin/phpunit --bootstrap vendor/autoload.php tests/

./vendor/bin/phpunit ile phpunit frameworkümüzü çağırdık.
–bootstrap composer ile otomatik yüklenen sınıfları çağırmak için autoload.php dosyamızın konumunu verdik.
tests/ argümanı ise test sınıflarının yer aldığı dizin.

Bu komut ile phpunit testimizi çalıştırmış oluyoruz. Hemen çıktımızı görelim;

Resimde yer aldığı gibi testimiz başarıyla tamamlandı ve 4 test metodu da hatasız şekilde sonuçlandı. İçlerinden biri hata vermesi durumunda ise;

Resimde yer aldığı gibi hatalı test metodunu, beklenen ve çıktı karşılaştırması ile göstermiş olacaktı.

Son Olarak

Bu yazımızda PHPUnit ile nasıl PHP kodlarımıza basit anlamda test yazabileceğimizi gösterdik. Bu yazıdaki tüm örnekler rahat anlaşılabilmesi için basit seviyede tutuldu. Daha detaylı test metotları veya daha kompleks senaryolar için PHPUnit’in kendi sayfasını ziyaret etmenizi öneririm.

https://phpunit.de

https://phpunit.readthedocs.io/en/8.4/installation.html