PHPUnit ve TDD Yaklaşımı




Test Driven Development konseptini öğrenip, PHPUnit tanımakla devam edip, sonunda ise ilk testimizi yazalım.

TDD YAKLAŞIMI


  • 1999 yılında eXtreme Programming (XP) ile başladı. Kent Beck'in fikridir.
  • Günümüz şartlarında  uygulamalarının; binlerce kişinin ulaştığı bir yapı haline geldiği gerçeği kaçınılmaz. Hatasız geliştirmenin önemi kat ve kat artıyor. Bu aşamada test güdümlü geliştirme devreye girip, hataları en aza indirme, kodun okunabilirliği, geliştirme aşamasındaki rahatlığı gibi birçok problemimize çözüm oluyor.

TANIMLAMALAR


  • Test Driven Development
    Türkçeleştirmek; Test Güdümlü Geliştirme
  • Unit Test (Birim Testi)
    Birim, kısaca en küçük parça. Örnek: OOP - Class İlişkisi
  • Functional Test (İşlevsellik Testi)
    Birim testi, kodlamadan önce yazılır. Ancak işlevsellik testi, yazılımı ürün aşamasına geçirirken yapılır. Yazılımın gereksinimleri karşılayıp, karşılamadığı ölçülür.
  • Code Coverage
    Proje de testi yazılan kodların, diğer kodlara yüzde oranı.
  • Test-First Approach (Önce Test, Sonra Kod)
    Farklı bir algı yaratsada gerçek bu. Önce testi yazmak, geliştiricinin tüm olasılıkları ve çalışma mantığını çözmesi anlamına geliyor. Sonrasında ise testi geçebilecek en basit kodu yazmalıdır.

7 ADIMDA TDD İŞLEYİŞİ


  1. Analiz sürecini yap ve ihtiyaçları belirle.
  2. Testi yaz.
  3. Testi çalıştır ve hatasız tamamla. (Tekrar *)
  4. Teste uygun, en basit ve en sade kodu yaz.
  5. Testi çalıştır ve hatasız tamamla. (Tekrar *)
  6. Refactoring yap.
  7. Adımları sonsuz döngü de devam ettir :)

TDD'nin ARTILARI


Proje ve geliştirici ekibine artılarını listeleyelim;

  • Code Inspection (Geliştirilmiş kodların incelemede hız ve güvenlik sağlar)
  • Hataların ve ihtiyaçların başlangıçta görünmesi sağlar
  • Testlerimizi döküman olarak kullanabiliriz, bu da bizim veya bizden sonraki geliştiricinin kodları okuyabilmesini sağlar
  • Refactoring (Yazılan kodun, iyileştirilmesi aşamasında testleri çalıştırarak, davranışlarının hatalı olup/olmadığını anlarız)
  • Birim testi, projedeki en küçük parçanın dahi doğru çalıştığını gösterir, yazılım kalitesini artırır.
  • Testleri gruplayarak, modüler olarak geliştirme aşamaları sonrasında otomatik olarak çalıştırabiliriz.
  • Geliştiricileri OOP standartında yazmaya zorlar.
  • En hafif ve doğru kodu yazmamızı sağlar. Kod (code) ve tasarım deseninin (desing pattern) karmaşıklığına son verir.

TDD DEZAVANTAJLARI


  • Geliştirme süresini uzatır. (Sonrasında telafi edilmek üzere)
    (Microsoft, IBM gibi firmalarından araştırmasında %25 ile %35 oranında bilgi mevcut)
  • Testi yazan geliştirici ile yazılımın geliştiren aynı olduğunda, aynı hatalara sahip ve ihtiyacı karşılamayan yazılım karşımıza çıkabilir.

PHPUNIT


 Sebastian Bergmann tarafından geliştirilmiş PHP Test Framework olarak tanımlayabiliriz.

PHPUNIT - KURULUM


http://phpunit.de resmi sitesinde olan kurulum adımlarını sırasıyla terminal üzerinden çalıştıralım;

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

PHPUNIT - TEST GELİŞTİRME KURALLARI


Sınıf (Class)
  • Tüm sınıflar "PHPUnit_Framework_TestCase" sınıfından türetilmelidir.
  • Sınıflarımız ise "Test" ifadesi ile bitmeli.
  • Sınıf isimleri ve php dosyalarının isimleri aynı olmalıdır.

Method (Function)
  • Test methodları "test" ile başlamalı,
  • Test methodları "public" olarak tanımlanmalı.
  • Testlerde mutlaka 1 assertion yani onaylama  olmalıdır.

Diğer Önemli Notlar;
  • Testlerimizi /test , /tests , /projetest vb. bir klasörde toplamamız yazısız ve olması gereken bir kural. Hem yönetmek, hem de toplu olarak çalıştırmak istediğimizde kolaylık sağlayacaktır.
  • Test yazılırken veritabanı, mail server, web server vb. işlemler düşünülmemelidir. Testin amacına uygun değildir. Dış etkenleri test etmek için eklentiler ; DBUnit: Database Testi
  • Selenium da yapılmış testlerin, PHPUnit olarak çıktılarını alabiliriz.
  • Test adları anlaşılır olmalıdır. Rapor alındığında, test isimi geliştiriciyi bilgilendirmelidir.
  • Her test birbirinden bağımsız çalışmalıdır.
  • Test başlamadan önce ve bittikten sonra istediğimiz kodları çalıştırabiliriz : public function setUp() { ... } yada tearDown() { ... }
  • Parametre çağırma (with), default dönecek değer (will)

PHPUNIT - İLK TEST


Test prosedürlerinin hepsini öğrendiğimize göre ilk testimi yazalım.
$text değişkeninin değeri "PHP" olmalı iddasında (assert) bulunuyoruz;


class FirstTest extends PHPUnit_Framework_TestCase
{
    public function testFirst()
    {
        $text = "PHP";
        $this->assertEquals("PHP", $text);
    }
}

Terminal de çalıştıralım;

$ phpunit FirstTest.php

Test başarıyla tamamlandı, örnek çıktı :

OK (1 test, 1 assertion)

Eğer "PHP" yazan yere, "X-PHP" yazsaydık hata mesajı alacaktık ;

Tests:1, Assertion:1, Failures:1

Code Coverage Oluşturmak;

$ phpunit --coverage-html ./report FirstTest.php 
(Dikkat : xDebug modülü kurulu değilse hata verecektir)

Testleri toplu koşturmak istersek XML ile tek dosya da toplayabiliriz;
http://phpunit.de/manual/3.7/en/appendixes.configuration.html

Örnekleri fazlalaştırmıyorum. Aşağıdaki özellikler ve yukarıdaki bilgiler ışığında TDD geliştirilmiş projeleri incelediğinizde saatler içinde testlerinizi yazabilirsiniz.

PHPUNIT - TEST ÖZELLİKLERİ


Assertions (Onaylama-İddia)
assertEquals, assertTrue vb. çok fazla assertion mevcuttur. Yetersiz kaldığı durumlarda geliştirici de oluşturabilir. Assertions ile bir iddia da bulunuruz ve bunun gerçekleşmesini sağlıyoruz.

Örnek :
  Değer, şu değişkene eşittir. Gelen değer, şu rakamın altındadır gibi.
Link : http://phpunit.de/manual/3.7/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions
   
Annotations (Açıklamalar)
Açıklama parametreleri ve ek özelliklerden oluşur.

Örnek : @covers, @dataProvider, @expectedException
Link : http://phpunit.de/manual/3.7/en/appendixes.annotations.html

Mock Objects (Sahte Nesneler)
Dışa bağımlı (db,mail server vb.) işlemler varsa, bunları testimizin dışında tutmalıyız. Bu yüzden sahte nesneler yaratarak, örneğin bir veritabanı işlemi yapıyormuş gibi davranmasını sağlıyoruz.

Link :
http://phpunit.de/manual/3.7/en/test-doubles.html#test-doubles.mock-objects

}
tarih : haziran 2014
kategori : php

Yorum Yapmak İstersen ?
Yazılıp / Çizilenler
Konuya kimse yorum yapmamış ...