Developersland

Teknoloji ve Yazılım Blogu

  • Yazıtipi boyutunu arttır
  • Varsayılan yazıtipi boyutu
  • Yazıtipi boyutunu azaltır

PHPUnit ile Test Güdümlü Geliştirme (Test Driven Development)


phpunitBu yazımda PHPUnit ile nasıl unit testler yazabileceğimizi anlatacağım. Bu yazıyı okumaya başlamadan önce test güdümlü geliştirme ile ilgili yazdığım yazıyı okumanızı öneriyorum. Yazıya buradan ulaşabilirsiniz.

Ben Sebastian Bergmann tarafından yazılmış olan phpunit frameworkünü kullanıyorum. Genel olarak bu framework'ün bu alanda kullanılan en popüler framework olduğunu söyleyebilirim.

PHPUnit kurulumu yapmanın en basit yolu pear yardımıyla kurulum yapmaktır. Sisteminizde pear bulunmuyorsa öncelikle pear kurmanız gerekmektedir.



PEAR Kurulumu (Windows)

1)http://pear.php.net/go-pear.phar sitesine girerek go-pear.phar isimli dosyayı bilgisayarımıza indiriyoruz.

2)Daha sonra bu dosyayı php dosyalarınızın bulunduğu dizine atınız.

3)Komut satırından dosyanın bulunduğu konuma geliniz.

4)Komut satırında php go-pear.phar komutunu çalıştırınız 

5) Kurulum başlangıcında kurulum türünün local mi yoksa sistem çapında mı olacağını sorar local seçmeniz işinizi görecektir.

Pear kurulumu yaptıktan sonra aşağıdaki komutlar ile PHPUnit kurulumumuzu yapıyoruz.


PhpUnit Kurulumu

      pear config-set auto_discover 1

      pear install pear.phpunit.de/PHPUnit

Bu komutları düzgün bir şekilde uyguladığınızda PHPUnit kurulumunuzu tamamlamış oluyorsunuz. İlave kütüphaneler için buraya bakınız : http://www.phpunit.de/manual/current/en/installation.html

Yüklemeyi düzgün yaptığınızı teyit etmek için konsoldan phpunit yazmanız yeterlidir. Eğer sistem komutu algılar ve phpunit ile ilgili yardım menüsünü önünüze sunarsa demekki kurulumunuzu doğru yapmışsınız tebrikler!

PHPUnit ile ilgili her türlü dökümantasyona ve bilgiye buradan ulaşabilirsiniz: http://www.phpunit.de/manual/current/en


Birkaç Test Yazalım

Öncelikle projenizde tests diye bir klasör oluşturmanız ve testlerinizi buraya yerleştirmeniz gerekiyor. Testlerimizin her biri birer sınıf olmak zorundadır. isimlendirme şu şekilde olacaktır Test edeceğimiz sınıfın ismi + "Test". Örnek olarak ben bir PhpValidation sınıfı yazdım ve bu sınıf için hazırladığım testin ismini PhpValidationTest olarak koydum. Aynı şekilde bu sınıf içerisinde test olarak kabul edilmesini istediğiniz her metodun ismini test diye başlatmanız gerekmektedir. Aşağıda test ile ilgili örnek çalışmalarımda kullanılan sınıfların kaynak kodları bulunmaktadır. Bolca yorum yazarak kodların mümkün olduğunca anlaşılır olmasını sağlamaya çalıştım.


PhpValidation.php


<?php

/**

 * Description of PhpValidation

 *

 * @author Ferid Mövsümov

 */

class PhpValidation {



    private $_message = "";

    private $_variable;

    private $_label;

    private $_isValid = true;

    private $_dataType;

    private $_allowedDataTypes = array("int", "string", "float");

    private static $_varNumber = 0;



    public function getAllowedDataTypes() {

        return $this->_allowedDataTypes;

    }



    /**

     * Meajları belli bir formatta basar alt alta 

     * @param strıng $message 

     */

    private function setMessage($message) {

        $this->_message.=$this->_label . " : " . $message . "<br/>";



        $this->_isValid = false;

    }



    /**

     * Değişken tipi ile değişkenin değerini karşılaştırı ve atanmaya uygun ise atama yapar

     * @param type $variable

     * @throws Exception 

     */

    private function setVariable($variable) {

        if (!empty($variable)) {

            if ($this->_dataType == "int") {

                if (is_numeric($variable)) {

                    $this->_variable = (int) $variable;

                } else {

                    throw new Exception("Veri türü int ancak değişken integer değil", 2);

                }

            }elseif ($this->_dataType == "float") {



                if (is_numeric($variable)) {

                    $this->_variable = (float) $variable;

                } else {

                    throw new Exception("Veri türü float olarak belirtilmesine rağmen veri sayısal değere sahip değil", 3);

                }

            }

            else//String ise

            {

                $this->_variable=$variable;

            }

        } else {

            throw new Exception("Variable can not be empty", 4);

        }

    }



    /**

     * Doğrulaması yapılacak değişken boş olmamalıdır.

     * @param type $variable

     * @throws Exception 

     */

    public function set($variable, $dataType = "string", $label = "") {

        $dataType = trim($dataType);





        //Label atamamışsa ben bir label atarım

        if (!empty($label)) {

            $this->_label = $label;

        } else {

            $this->_label = "var" . static::$_varNumber;

        }



        if (in_array($dataType, $this->_allowedDataTypes)) {

            $this->_dataType = $dataType;

        } else {

            throw new Exception("Belirtilen veri turu desteklenmiyor", 1);

        }



        $this->setVariable($variable);



        static::$_varNumber++;



        return $this;

    }



    public function isValid() {

        return $this->_isValid;

    }



    public function getMessage() {

        return $this->_message;

    }

    /**

     * Sayısal değerler için kullanılır

     * @param type $maxValue 

     */

    public function setMaxValue($maxValue) {

        if ($this->_dataType == "int" || $this->_dataType == "float") {



            if ($this->_variable > $maxValue) {//şartımıza uymuyor

                $this->setMessage("deger $maxValue değerinden buyuk olamaz");

            }



            return $this;

        } else {

            throw new Exception("setMax fonksiyonu yalnızca int veya float veri tipi için kullanılabilir", 5);

        }

    }



    public function setMaxLength($maxLength) {

        if ($this->_dataType == "string") {



            if (is_numeric($maxLength) && intval($maxLength) > 0) {



                if (strlen($this->_variable) > $maxLength) {

                    $this->setMessage("String uzunluğu $maxLength degerinden buyuk olamaz");

                }

            } else {

                throw new Exception("setMaxLength metoduna parametre olarak pozitif bir tamsayı değeri verilmelidir.");

            }



            return $this;

        } else {

            throw new Exception("setMaxLength metodu yalnizca string degerler icin kullanilabilir", 6);

        }

    }



    public function setMinValue($minValue) {

        if ($this->_dataType == "int" || $this->_dataType == "float") {



            if ($this->_variable < $minValue) {//şartımıza uymuyor

                $this->setMessage("deger $minValue değerinden kucuk olamaz");

            }

            return $this;

        } else {

            throw new Exception("setMinValue metodu integer veya float degerler icin kullanilabilir", 7);

        }

    }



    public function setMinLength($minLength) {





        if ($this->_dataType == "string") {

            if (is_numeric($minLength) && intval($minLength) > 0) {

                

                if (strlen($this->_variable) < $minLength) {

                    $this->setMessage("String uzunluğu $minLength degerinden kucuk olamaz");

                }

                return $this;

                

            } else {

                throw new Exception("setMinLength metoduna parametre olarak pozitif bir tamsayı değeri verilmelidir.");

            }

        } else {

            throw new Exception("setMinLength metodu yalnizca string degerler icin kullanilabilir",8);

        }

    }

    

    

    public function isEmail()

    {

        if ($this->_dataType == "string") {

            

            if(!filter_var($this->_variable, FILTER_VALIDATE_EMAIL)){

                $this->setMessage("Email dogru formatta girilmemis");

            }

            

            return $this;

        }

        else {

            throw new Exception("isEmail metodu yalnızca string degerleri icin kullanilabilkir");

        }

    }



}



?>



PhpValidationTest.php


<?php



require_once '../FormCreator/PhpValidation.php';



/**

 * Description of PhpValidationTest

 * @author Ferid Movsumov

 */

class PhpValidationTest extends PHPUnit_Framework_TestCase {



    protected $_phpValidation;



    

    /**

     * Öncelikle nesnemizi oluşturuyoruz 

     */

    public function setUp() {

        $this->_phpValidation = new PhpValidation();

        

    }

    

    /**

     * işimiz bittikten sonra memoryde yer kaplamaması

     *  için nesnemizi unset ediyoruz 

     */

    function tearDown() {

        // delete your instance

        unset($this->_phpValidation);

    }



    /**

     * Eğer desteklenmeyen bir type yazılırsa 1 numaralı exception fırlatılmalıdır

     * @expectedException  Exception

     * @expectedExceptionCode 1

     */

    public function testExceptionHasErrorcode1() {

        $this->_phpValidation->set("deneme", "inf");

    }



    /**

     * Eğer tipi int olarak belirtildiği halde a5 gibi sayısal olmayan

     * bir değer atanmışsa exception #2 fırlatılır

     * @expectedException  Exception

     * @expectedExceptionCode 2

     */

    public function testExceptionHasErrorcode2() {

        $this->_phpValidation->set("a5", "int");

    }



    /**

     * Eğer tipi float belirtildiği yhalde sayısal olmayan birşey verilmişse

     * @expectedException  Exception

     * @expectedExceptionCode 3

     */

    public function testExceptionHasErrorcode3() {

        $this->_phpValidation->set("deneme", "float");

    }



    /**

     * Eğer empty bir değer girilirse

     * @expectedException  Exception

     * @expectedExceptionCode 4

     */

    public function testExceptionHasErrorcode4() {

        $this->_phpValidation->set("", "int");

        $this->_phpValidation->set("   ", "string");

    }



    //Validation ile ilgili metodların exceptionlarını test ediyoruz..



    /**

     * Set max value sadece integer değerler için çalışır

     * @expectedException  Exception

     * @expectedExceptionCode 5

     */

    public function testExceptionHasErrorcode5() {

        $this->_phpValidation->set("deneme", "string")->setMaxValue(5);

    }



    /**

     * Sayısal bir değer için setMaxLength kullanılırsa exception fırlatılır

     * @expectedException  Exception

     * @expectedExceptionCode 6

     */

    public function testExceptionHasErrorcode6() {

        $this->_phpValidation->set("1.5", "float")->setMaxLength(5);

    }



    /**

     * String bir değer için setMinValue kullanılırsa exception fırlatılır

     * @expectedException  Exception

     * @expectedExceptionCode 7

     */

    public function testExceptionHasErrorcode7() {

        $this->_phpValidation->set("deneme", "string")->setMinValue(5);

    }



    /**

     * Sayısal bir değer için setMinLength kullanılırsa Exception fırlatılır

     * @expectedException  Exception

     * @expectedExceptionCode 8

     */

    public function testExceptionHasErrorcode8() {

        $this->_phpValidation->set("6", "int")->setMinLength(5);

    }



    /**

     * Allowed Data types sadece string degerleri dondurur

     */

    public function testGetAllowedDataTypes() {

        $this->assertContainsOnly('string', $this->_phpValidation->getAllowedDataTypes());

    }



    /**

     * Aşağıda kullanılmış olan metodlarin gercekten o sinifa ait bir nesne dondurdugunu test eder

     */

    public function testReturnThis() {

        $this->assertInstanceOf('PhpValidation', $this->_phpValidation->set("Deneme"));

        $this->assertInstanceOf('PhpValidation', $this->_phpValidation->set("Deneme")->setMaxLength(5));

        $this->assertInstanceOf('PhpValidation', $this->_phpValidation->set("Deneme")->setMinLength(5));

        $this->assertInstanceOf('PhpValidation', $this->_phpValidation->set(10, "int", "Rakam")->setMinValue(5));

        $this->assertInstanceOf('PhpValidation', $this->_phpValidation->set(10, "int", "Rakam")->setMaxValue(5));

    }



    /**

     * Her bir metodu birer kez test ederek isValid doğru çalışıyor mu test etmiş olacağım

     */

    public function testisValid() {

        $this->_phpValidation->set(5, "int")->setMaxValue(30);

        $this->_phpValidation->set(5, "int")->setMinValue(1);

        $this->_phpValidation->set("Deneme", "string")->setMinLength(1);

        $this->_phpValidation->set("Deneme", "string")->setMaxLength(10);



        $this->assertTrue($this->_phpValidation->isValid());

    }



    /**

     * @dataProvider providerMaxValue

     * @covers PhpValidation::setMaxValue

     */

    public function testMaxValue($value, $maxValue) {

        $this->assertTrue($this->_phpValidation->set($value, "int")->setMaxValue($maxValue)->isValid());

    }



    /**

     * MaxValue fonksiyonu için bazı degerler atayarak denemeler yapiyorum

     * @return type 

     */

    public function providerMaxValue() {

        return array(

            array(1, 5),

            array(1, 6),

            array(-1, 5),

            array(-10, 0)

        );

    }



    /**

     * @dataProvider providerMinLength

     * @param type $value

     * @param type $maxValue 

     */

    public function testMinLength($value, $maxValue) {

        $this->assertTrue($this->_phpValidation->set($value, "string")->setMinLength($maxValue)->isValid());

    }



    /**

     * MinLength fonksiyonu için bazı degerler atayarak denemeler yapiyorum

     * @return type 

     */

    public function providerMinLength() {

        return array(

            array("selam", 2),

            array("selam", 3),

            array("ssssssssssss", 6),

            array("denemem", 7)

        );

    }



    /**

     * @covers PhpValidation::isEmail

     * @covers PhpValidation::set

     * @covers PhpValidation::isValid

     * @dataProvider providerIsEmail

     * @param type $email 

     */

    public function testIsEmail($email) {

        $this->assertTrue($this->_phpValidation->set($email, "string")->isEmail()->isValid());

    }



    public function providerIsEmail() {

        return array(

            array("farid[at]gmail.com"),

            array("faridm88[at]hotmail.com"),

        );

    }

}

?>



TestSuite.php


<?php



require_once 'PhpValidationTest.php';

/**

 * Static test suite.

 */

class TestsSuite extends PHPUnit_Framework_TestSuite {



    /**

     * Constructs the test suite handler.

     */

    public function __construct() {

        $this->setName('TestsSuite');

        $this->addTestSuite('PhpValidationTest');



    }

    /**

     * Creates the suite.

     */

    public static function suite() {

        return new self ();

    }

}

?>



Yazdığımız Testleri Çalıştırma

konsoldantestcalistirma

Yukarıdak başarılı bir test sonucundaki çıktı gösterilmiştir.
 

Yorum ekle


Güvenlik kodu
Yenile