Dubluve.net » Unit testing http://www.dubluve.net Biz de yazılımcıyız Sun, 31 Aug 2014 13:17:32 +0000 tr-TR hourly 1 http://wordpress.org/?v=3.9.1 Test Driven Development (Test Gudumlu Gelistirme) http://www.dubluve.net/2012/09/27/test-driven-development-test-gudumlu-gelistirme/ http://www.dubluve.net/2012/09/27/test-driven-development-test-gudumlu-gelistirme/#comments Thu, 27 Sep 2012 06:57:12 +0000 http://dubluve.net/?p=1922 test güdümlü geliştirmeSon birkaç gün içerisinde Test güdümlü geliştirme ile tanıştım. Daha önce bu kavramı duymuş olmama rağmen bir türlü araştırma fırsatım olmamıştı. Nihayet araştırma fırsatım oldu ve bu metodolojiyi gerçekten çok sevdim. Test Güdümlü Geliştirme dendiğinde bir yazılımcı olarak bana ilk başta garip gelen “Önce test sonra kod yazma” kavramıyla tanıştım. İlk duyduğunuzda size zaman kaybı gibi gelebilir nitekim bana da öyle gelmişti ve bu konuyla ilgili internette çok değerli yazılımcılar tarafından yazılmış çeşitli makaleler okudum. Bütün yazılan yazılardaki ana fikir test güdümlü geliştirmenin kesinlikle zaman kaybı olmadığı ve uzun vadede kodumuzda herhangi bir değişiklik yapacağımız zaman size inanılmaz derecede zaman kazandıracağı yönündeydi. Test güdümlü geliştirme yaparken her bir sınıfımız için ayrı ayrı public metodları test eden unit testler yazarız ve kodlarımız düzgün çalışıyorsa bütün unit testlerden başarıyla geçecektir. Uzun bir zaman sonra kodumuz üzerinde değişiklikler yapmamız gerektiğinde, yazılımcılar olarak kendi yazdığımız koda karşı bile yabancılık çekeriz. Durum böyle olunca yapacağımız değişiklikler sistemde daha sonra nedenini saatlerce araştıracağımız hatalara yol açabilir. Unit testlerimiz sayesinde böyle bir durumun önüne geçmemiz mümkündür. Kodumuzda herhangi bir değişiklik yaptığımızda unit testlerimizi çalıştırırız ve eğer herhangi bir şeyi bozmuşsak anında bunu tespit etme ve düzeltme şansımız olur. Böylece saatlerimizi kodumuzu debug etmekle geçirmez ve daha mutlu bir yazılımcı oluruz. Yazılım alanındaki en büyük ustalardan birisi olan Martin Fowler’in bu konuyla ilgili söylediği bir söz çok önemlidir.

 

“Herhangi bir şeyi debug etmeye kalktığınızda bunun yerine test yazınız”

Türkiye’deki önemli yazılımcılardan biri olan Özcan Acar’ın yazdığı “Veresiye Satan Yazılımcı” isimli yazısında test yazan yazılımcı ile test yazmayan yazılımcı arasındaki farkların çok güzel bir şekilde anlatıldığını düşünüyorum. Yazıyı okumanızı kesinlikle tavsiye ediyorum.

Test yazmanın önemini az çok anladık peki neden testlerimi kodumdan önce yazmalıyım?

Testlerinizi kodunuzdan önce yazmanız aslında kodunuzu daha iyi kurgulamanız açısından önemlidir. Siz daha ortada bir kod yokken onun testini yazabiliyorsanız yapacağınız şeyi kafanızda gerçek anlamda kurgulayabilmişsinizdir demektir. Hangi metodun hangi değeri alacağını buna karşılık hangi değeri döndüreceğini veya hangi işi yapacağına karar vermeden testlerinizi yazamazsınız. Bu nedenle kod yazmaya başlamadan önce kodunuzu en ince ayrıntısına kadar planlayıp, daha sonra trestlerinizi ona göre hazırlayıp nihayetinde kod yazmaya başlarsınız. Böylece kodlarınızı çok daha sağlam bir şekilde yazmış olursunuz.

Yakında test güdümlü geliştirmeyle ilgili birkaç teknik örnek vereceğim yazılar eklemeyi planlıyorum. Bu konudaki çalışmalarım devam etmektedir.

]]>
http://www.dubluve.net/2012/09/27/test-driven-development-test-gudumlu-gelistirme/feed/ 9
PHP Unit testing #1 http://www.dubluve.net/2011/11/11/php-unit-testing-1/ http://www.dubluve.net/2011/11/11/php-unit-testing-1/#comments Fri, 11 Nov 2011 19:57:38 +0000 http://dubluve.net/?p=354

1.     Php Unit Testing Neden Kullanılır ?

 

Yazdığımız Programın yada fonksiyonun her zaman düzgün çalışıp çalışmadığına nasıl emin olabiliriz ?

 

Örneğin Müşteri numarasını parametre olarak alan MüşteriGetir isimli bir fonksiyonumuz var. Burda örnekler çoğaltılabilir, örneğin bir sql cümlesini çağıran fonksiyon yada telefon numarasını düzgün girilip girilmediğini kontrol eden bir fonksiyon, ne yaptığı çok önemli değil)

 

Alışıldık programlamada fonksiyon geliştirilirken bir kaç test sonucunda fonksiyonun müşteri numarası verildiğinde doğru bilgileri çevirdiği kontrol edildikten sonra diğer fonksiyonlara geçilir. Yine alışıldık olarak fonksiyonun ilerde de doğru çalışacağı varsayılır.

 

Uygulama üzerinde zaman içerisinde değişiklikler yapılmaya devam edildikçe hava durumu kasvetli bir sonbahar’a dönüşmeye başlar, çünkü herhangi bir yerde yapılan en ufak bir değişikliğin neye mal olacağı belirsizdir.

 

Örneğin MusteriGetir fonksiyonun kullandığı ExecuteSql metodunda text alanlardaki ‘ karakterlerini sql sunucu yanlış anladığı için ” şekline çevirmeye kalktığınızda MusteriGetir fonksiyonunun zaten ” şeklinde gönderdiğini fark edersiniz ancak diğer fonksiyonlarında bu şekilde çalıştığından emin olamazsınız. Ve günler geçtikçe uygulamada yapılan yama adetleri ve mesai saatleri artmaya başlar.

 

Bu tür baş ağrılarından kurtulmanın en iyi yolu Unit Test metodlarını kullanmaktır.

 

Unit test yaparken temel amaç yazdığınız kodun her satırının başka bir kod tarafından otomatik olarak test edilmesidir. Burdaki “test” kullanıcı testi değil, MusteriGetir fonksiyonunun düzgün çalıştığının test’idir.

 

Her test diğer testlerden bağımsız olarak çalışmalı ve tüm bu testlerin tek bir sonucu olmalıdır yani TRUE yada FALSE. Unit test kodları içerisinde görsel doğrulama (ekrana bir şey yazma, mesaj gösterme v.s.) gibi işlemler yapmazsınız.

 

 

UnitTest kodları yanlızca çalışması beklenen durumlar için değil metodun verdiği hataları da test eder. Yani müşteri numarasını – değerde verdiğinizde fonksiyonun hata veriyor olmasını beklersiniz. UnitTest ile pratikde çıkan sorun genelde işler acil olduğu için bu test kodları sonraya bırakılır. bunu yapmayın! İşiniz ne kadar acil olursa olsun test kodlarını yazmadığınız her metod ileride harcadığınız zamanı tekrar tekrar uzatacaktır.

2.     Php Unit Kurulumu ve IDE’ler ile Çalışma (Netbeans üzerinde)

Php Unit’in en güzel tarafı IDE’ler ile entegreli çalışıyor olabilmesi.Böylece IDE üzerinde tarayıcıda açmadan (isterseniz) derleyip,ilgili metodları test edebiliriz.Şimdi Php Unit ‘in kurulumuna geçiyoruz:

  • Öncelikle şunu belirtmekte fayda var,Php Unit,en az Php 5.2.7 sürümü ve üstü sürümlerinde stabil olarak çalışmaktadır. Link
  • Windowsta Başlat’a cmd yazarak MS-DOS’u açınız ve aşağıdaki kodu giriniz:

 

pear config-set auto_discover 1

pear install pear.phpunit.de/PHPUnit

 

 


 pear channel –discover pear.phpunit.de

Bu işlemden sonra Channel eklememiz gerekmekte.Bu işlemi aşağıdaki gibi gerçekleştiriyoruz: 

 

Bu işlemde sonlandıktan sonra Server dosyalarınızın içine (Benimki WAMPP) aşağıdaki gibi bir klasör yolu oluşmuş olması gerekiyor:

C:/wampp/php/Php 5.2.11/PEAR/PhpUnit

Bu klasör oluşmuş ise CHMOD ayarlarından 755 yapmamız gerekiyor.

3.     Php Unit’i NETBEANS üzerinde Tanıtma

Öncelikle Netbeans üzerinden bir Sınıf oluşturuyoruz.Aşağıda Örnek olarak ekliyeceğim:

 

NETBEANS üzerinde PhpUnit tanımlamak için aşağıdaki işlemleri yapıyoruz:

  • Netbeans üzerinde Tools menüsü altında yer alan Options sekmesine tıklıyoruz.
  • Gelen sayfada,PHP sekmesine geçerek, yoksa Php’nin bulunduğu dizini tanıtıyoruz.

Bendeki Path (C:\wamp\bin\php\php5.2.11\php.exe)

  • Daha sonra PHP sekmesinin hemen yanında yer alan Unit Testing kısmına tıklıyoruz.Bu alanda kurmuş olduğunuz Php Unit test için kullanıcağımız phpunit.bat dosyasını tanıtacağız.Tüm işlemler .bat dosyasında derleniyor.
  • Bendeki Php Unit bat dosyası şu dizin içerisinde yer almaktadır: C:\wamp\bin\php\php5.2.11\phpunit.bat
  • Bu bilgiyide o Alana ekledikten sonra Tamam diyerek ,netbeans’ımizi yeniden başlatıyoruz.
PhpUnit ile Metod Test Etme

Öncelikle temel olarak Netbeans üzerinden bir Php Class oluşturuyoruz.Ve içine şu metodu ekliyoruz : (Bu örnek amaçlıdır,projeye ve isteğe göre test ediceğiniz metodu siz belirleyeceksiniz )

İsim teyit etmek istiyoruz.Php Unit class’ı ile bu oluşturduğumuz kendi sınıfımız içerisinde yer alan metoddan return edilen değer karşılaştırılacak.Bu örneği ve işlevi daha iyi anlatacağını düşünüyorum.

public function getName() {

return “Mustafa”;
}

 


1.Sınıf içerisindeki Metodu Netbeans Üzerinde Test Etme

Sınıfınızın oluşturulduğunu varsayarak,şimdi bu sınıfı PHP UNIT ile otomatik olarak test edeceğiz.Bu netbeans üzerinde bir tıklama kombinasyonundan oluşuyor.Oldukça basit.Php Unit dizinini vs otomatik olarak kendi include ediyor.

PhpClass.php (“bu oluşturduğum deneme sınıfı,siz kendi sınıfınızı test ediceksiniz.) sağ tıklayarak “TOOLS” -> “CREATE PHP UNIT” test diyoruz.

Gelen ekranda Php Unit test sınıfını oluşturacağı dizini seçiyoruz.Oraya kendi çalıştığınız dizini yada PHPUNIT kendi dizinini ekliyoruz.

 

Netbeans’ın oluşturduğu Test Sınıfımızda , testgetName metodu dikkatinizi çekecektir.(Sizin metodun adı her ne ise )

Bu alanda ilgili metodumuzu bazı parametreler ile test ediyoruz.Örneğin sınıfımızda hatırlarsak getName metodundan return “Mustafa” diyerek string bir değer döndürdük.Bu sınıftada o metoda string bir ifade göndericez fakat farklı bir değer olucak.Yani hata verdiğini göreceğiz.

public function testgetName() {

$this->assertEquals(“Deneme”,$this->object->getName());

}


Yukarıdaki temel örnekte assertEquals metodu ile ,getName metoduna,”Deneme” string ifadesini gönderdik.Yani o metoddan Deneme değeri dönüyor olması gerektiğini söyledik. Test ettiğimizde hata vermesi gerekiyor.Test işlemi şu şekilde yapılıyor:

PhpClass.php dosyasının üzerinde CTRL+F2 bastığımızda,Unit Testing başlıycak ve sonucu gösterecektir.

Başka bir yazıda da unit testing in önemi hakkında daha detaylı yazmak istiyorum.

]]>
http://www.dubluve.net/2011/11/11/php-unit-testing-1/feed/ 0