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.