PHP ve TDD: PHPUnit Nasıl Kullanılır?

Bir önceki yazımda TDD konusunda teorik olarak konuşmuştum. Şimdi ise PHP ile nasıl uygulayacağımıza bir göz atıyoruz.

PHPUnit

PHPUnit şu anda php’de unit testing yapmak için bir standart olarak kabul edilebilir. PHPUnit, testleri yazabilmeniz için bir framework sağlamakla beraber bu testleri çalıştırabileceğiniz bir araç sunmaktadır.

Kurulum

PHPUnit bir çok yolla kurulabiliyor. Direk olarak phar arşivi olarak indirebilirsiniz, composer ile kurabilirsiniz veya pear ile kurabilirsiniz. Şu anki yazımda direk olarak phar arşivi olarak indireceğim ve o şekilde çalıştıracağım.

wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
mv phpunit.phar /usr/local/bin/phpunit

Bu aşamaları izledikten sonra PHPUnit bilgisayarınıza kurulmuş oluyor. phpunit komutu ile çalıştırılabilir. Diğer yöntemlere PHPUnit’in GitHub reposundan bakabilirsiniz.

İlk Testimiz

Projelerinizde testlerinizi ayrı bir klasöre koymak daha mantıklı olacaktır. Ben test dosyalarımı  tests/ klasörü altına koyuyorum. IlkTest.php isimli bir dosya yaratıyorum.

// Test case'ler PHPUnit_Framework_TestCase'den türetilmeli
class IlkTest extends PHPUnit_Framework_TestCase {

    // tüm method isimleri "test" ile başlamak zorundadır
    public function testVerilenDegerTrueMudur() {
        $this->assertTrue(true);
    }

}

Daha sonra bu test’i çalıştırmak için 

tests/ klasörü altında şunu çalıştırıyorum: phpunit IlkTest.php Ve sonuç olarak:

OK (1 test, 1 assertion) cevabını almış olmamız gerekiyor.

Ne Yaptık?

Testlerimizde sürekli assertion yapıyoruz. Yani ortaya bir iddia atıyoruz. Bu testimizde  assertTrue kullandık. Yani gelecek değerin true olduğuna dair bir iddia ortaya attık. Ve gelen değer true olduğu için iddiamız doğrulandı ve test başarılı oldu. Şimdi ise ortaya asılsız bir iddia atacağım 🙂 Yeni yazacağım methodu aynı class’ın içerisine koyabilirsiniz.

public function testGelecekDegerlerBirbirineEsitMidir() {
    $degerim = "Can";
    $this->assertEquals("Can Geliş", $degerim);
}

Burada ise assertEquals kullandık. Yani verilen parametrelerin birbirine eşit olduğuna dair bir iddia ortaya atıyoruz. 2 değer birbirine eşit olmadığı için testimiz başarısız oldu. İşte sonuç:

1) IlkTest::testGelecekDegerlerBirbirineEsitMidir
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'Can Geliş'
+'Can'

/Users/cangelis/www/test/tests/IlkTest.php:12

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.</pre>

 İsimlendirmeler

Dikkat ettiyseniz method isimlerini elimden geldiğince test’i anlatacak bir şekilde Camel Case kullanarak yazıyorum. Bu hangi testin neden başarısız olduğunu anlaşılması için güzeldir. Bunun dışında bazı araçlar bu Camel Case’leri anlaşılabilir metinlere dönüştürerek test dökümanı hazırlanmasını sağlamaktadır. Bu şekilde siz hiç bir döküman yazmadan sadece kod yazarak kod dökümantasyonu yapmış oluyorsunuz.

PHPUnit_Framework_TestCase ile ilgili diğer bilgiler

PHPUnit üzerinde her bir test birbirinden bağımsız bir şekilde paralel olarak çalışır. Yani yazdığınız hiç bir test birbirinden etkilenmemelidir. 

setUp ve tearDown methodları

setUp methodu her bir test çalışmadan önce otomatik olarak çalıştırılan bir methodtur. tearDown methodu ise her bir test bittikten sonra otomatik çalıştırılan bir methodtur. Mesela:

class IlkTest extends PHPUnit_Framework_TestCase {

    public function setUp() {
    // veritabanı bağlantısını aç
    }

    public function tearDown() {
    // veritabanı bağlantısını kapat
    }

}

 phpunit.xml dosyası

Bu dosya ile bir test suite yaratabilir ve bu test suite’e özel bazı konfigurasyonlar tanımlayabilirsiniz. Mesela şöyle bir konfigurasyon tanımlayacağım: 

~ tests/ klasörü altındaki sonu Test.php ile biten tüm dosyaları çalıştır. ~ Her bir test’im başlamadan önce tests klasörü altındaki bootstrap.php dosyasını çalıştır. Bu şekilde include gibi satırlarımı her bir test case’e tek tek koymaktansa tek bir dosyaya koyuyorum. Bu dosyayı proje ana dizinime atacağım. Bu şekilde proje anadizinimden phpunit komutu ile testlerimi çalıştıracağım.

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
    bootstrap="./test/bootstrap.php">
    <testsuites>
        <testsuite name="Ilk Test Suitim">
            <directory suffix="Test.php">./test</directory>
        </testsuite>
    </testsuites>
</phpunit>

Daha sonra proje anadizinimden (tests klasörü değil, bir üst klasör) phpunit komutu ile tüm testlerimi çalıştırıyorum.

Sonuç

Bu yazımızla beraber ilk birim testlerimizi yazdık ve PHPUnit aracına bir giriş yapmış olduk. PHPUnit’te  assertEquals ve assertTrue dışında bir çok assertion mevcut bunların tüm listesi için http://phpunit.de/manual/3.7/en/index.html adresine bakabilirsiniz. Bir sonraki yazımızda daha ileri seviye konulara bakacağız.  

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax