PHPUnit Kullanımı

Emir Buğra KÖKSALAN tarafından tarihinde yayınlandı

TDD bildiğiniz gibi Yazılım Geliştirme dünyasının en önemli kavramlarından biri. Günümüzde her türden yazılım için TDD gerekebiliyor. En küçüğünden en büyüğüne kadar. Bazen bir library yazarken bazen bir class yazarken işlerin gerçekten beklendiği gibi gidip gitmediğini bilmek gerekir çünkü yazılımlar o kadar karışıktır ki ufak hatalar büyük sonuçlara sebep olabilmektedir. Sizin yada başkasının bilmeden yaptığı bir hatanın tüm uygulamayı mahfetmesini istemezsiniz değil mi? İşte bu yüzden TDD kullanmak zorundayız.

PHP her ne kadar aslında nesne yönelimli bir dil olmasa da artık OOP desteği baya ilerledi. Bundan birkaç yıl önce neredeyse tüm PHP scriptleri spagetti şeklinde yazılıyordu ama artık PHP geliştiricileri olayın önemini anladı ve yavaş yavaş OOP mantığını kullanmaya başladılar. Sonra birşey daha farkettiler. OOP tek başına herşeyi çözmüyor. Kodun tekrar kullanılabilirliği problemini çözüyor, geliştirme sürecini kolaylaştırıyor, vs vs birçok faydası görülüyor ama bir noktada yeterli olmuyor. Projeye başladıktan birkaç ay sonra işler sarpasarmaya başlıyor ve bir library’nin farklı versiyonlarında bile proje çökebiliyor yada beklendiği gibi çalışmamaya başlıyor. Bu gibi problemleri halletmek için Test Driven Development kavramını PHP’ye uyarlamak gerekiyor.

Test yazma işini PHP’de birkaç şekilde yapabilirsiniz. Testlerinizi dümdüz PHP CLI ile yazarsınız. Konsoldan “php mytest.php” deyip mytest.php dosyasındaki test amacıyla yazılmış tüm kodlarınızı çalıştırırsınız. Bu da bir çözüm fakat onun yerine sırf bu iş için yazılmış bir uygulama var: PHPUnit. Neden bunu kullanmalıyız? Tabiki keyfinize göre diğer TDD yazılımlarını kullanabilirsiniz ama PHP camiasında bu daha çok kabul görmüş.

PHPUnit kullanımı son derece kolay. Daha önceden hiç test yazmamış olsanız bile çok zorlanmadan bu uygulamayı kullanıp test kodlarınızı yazmaya başlayabilirsiniz. Burada “TDD’nin Önemi”ni açıklamayacağım çünkü bu sorunun cevabını araştırdığınızı ve TDD mantığını anladığınızı farzediyoruz.

Ubuntu 13.10 64bit üzerinde PHPUnit kurulumunu anlattıktan sonra ufak bir örnek yapacağız. Linux’ta kurulum son derece basit. Konsola üç satırdan ibaret olan komutları yazıyoruz ve hemen kullanmaya başlıyoruz.

$ wget https://phar.phpunit.de/phpunit.phar
$ chmod +x phpunit.phar
$ sudo mv phpunit.phar /usr/local/bin/phpunit
$ phpunit --version
PHPUnit 4.0.14 by Sebastian Bergmann.
$

Normal şartlarda hepsi bu kadar fakat şöyle bir durum var. PHP CLI modunda çalışmaktadır ve Apache’nin php.ini dosyası ile CLI’in php.ini dosyaları farklıdır. Bu iki dosyalar mümkün olduğunca aynı ayarlara sahip olmasına özen gösterin. En basitinden short_open_tags özelliği ikisinde de On olmalı. Bunu hemen yapmak için vim editörünü kullanabilirsiniz. Ondan da önce bu iki dosyanın nerede ikamet ettiklerini bilmeniz gerekiyor. Bunun için yine konsoldan şu komutu veriyoruz:

$ locate php.ini
/etc/php5/apache2/php.ini
/etc/php5/cgi/php.ini
/etc/php5/cli/php.ini

Gördüğünüz gibi benim sistemimde üç tane php.ini var. En üstteki dosya Apache tarafından kullanılmakta. CGI olanıyla da ilgilenmiyoruz. Eğer PHP’yi CGI modunda çalıştırırsanız o zaman başvuracağınız dosya yine ikinci sıradaki dosya olacaktı. Bize lazım olan PHP’yi Command Line Interface üzerinden çalıştırdığımız taktirde yüklenecek olan php.ini dosyasıdır ki o da üçüncü sıradaki olan. Şimdi onu şu komutla açıyoruz. Bu dizine erişim için root haklarına ihtiyacımız olacak.

$ sudo vim /etc/php5/cli/php.ini

Burada short_open_tags = On yazıyoruz ve kaydedip kapatıyoruz. Vim kullanımı hakkında şurayı ziyaret edebilirsiniz.

Tamam artık PHPUnit’i gönül rahatlığıyla kullanmaya başlayabiliriz. Öncelikle bazı bilgiler vereyim. Şuan üzerinde çalıştığım uygulama Mezarlık Bilgi Sistemi. Bu uygulamada Netcad ile yapılan çizimleri KML formatına çevirdikten sonra KML dosyasından imaj oluşturuyoruz. KML dosyasındaki koordinatların hepsi kayan noktalı ve virgülden sonra 9 basamak içeren değerler. PHP’nin kayan noktalı değerlerle yaptığı hesaplar sizi çileden çıkarabilir. İki float değeri birbirine bölersiniz ve virgülden sonraki birkaç basamaktan sonra saçmalar. Bunlar eşit mi filan diye bakmaya çalışırsanız eşit çıkmaz falan filan. Kayan noktalı değerler için bazı durumlar var yani ve bu durumları kontrol altında tutmazsanız çok vaktiniz kaybolabilir. Aslında bu örnek TDD uygulamasında sadece kayan noktalı değerlerin özel durumlarını anlatabilirdim ama TDD’nin gerçek bir projede nasıl uygulandığını görmeniz açısından şuan üzerinde çalıştığım projeden size anlatacağım. Böylece hem TDD’nin ne kadar önemli birşey olduğunu anlatma fırsatım olmuş olacak. Şimdi başlıyoruz.

Geliştirme ortamı olarak Eclipse kullanıyorum. Eclipse’e PDT kurulumu hakkında şurayı ziyaret edebilirsiniz. Ayrıca CodeIgniter framework kullanıyorum. Birtane KML reader sınıfı yazdım ve bunun kayan noktalı değerleri işleyen metodlarının beklendiği gibi çalışıp çalışmadığını test edeceğim. Öncelikle proje yapısını göstereyim.

Gördüğünüz gibi docs, src, test olmak üzere üç tane ana dizin var. Docs dizinine bazı algoritmaları yazıyorum. Src dizininde projenin gerçek kodları bulunuyor. Test klasöründe de PHPUnit ile çalıştıracağımız test sınıfları var. Deploy.sh dosyası ne işe yarıyor? O da src dizinindeki tüm dosyaları alıyor Apache’nin erişim hakkı olan dizine atıyor. Böylece yazdığım kodları localhostta görebiliyorum. Ama deploy scriptini çalıştırmadan önce tabiki PHPUnit testlerinin hata vermeden çalışmış olması gerekiyor. Kısaca geliştirme yöntemini de açıklamış oldum böylece. Evet şimdi gelelim phpunit.xml dosyasına.

Ne? phpunit.xml mi? O da ne? PHPUnit normalde default config ile çalıştırılabilir fakat çoğu zaman projemize özgü ayarlarımız olur. Örneğin test classlarını alt klasörlere ayırmak istediğiniz zaman phpunit’i her klasöre girip çalıştırmak gerekir. Çünkü phpunit komutu sadece şuanki dizinde bulunan test classlarını çalıştırır. Alt dizinlere uğramaz. Tüm alt dizinleri çalıştırmak için phpunit.xml dosyasına şunları yazıyoruz:

<?xml version="1.0" encoding="utf-8" ?>
<phpunit>
    <testsuite name='Mezarlik Project Test Codes'>
        <directory suffix='.php'>./</directory>
    </testsuite>
</phpunit>

Evet artık testlerimizi ayrı klasörlere ayırarak daha sistemli şekilde çalışabiliriz. Ama ihtiyacımız olan başka birşey daha var o da her test için initialize olması gereken değerler. Belki bazı değişkenleri tanımlamak isteyebiliriz.

Kategoriler: PHPTDD

Emir Buğra KÖKSALAN

Java & PHP Developer

0 yorum

Bir yanıt yazın

Avatar placeholder

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload the CAPTCHA.

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.