php unit ve tdd

42

Click here to load reader

Upload: mustafa-ileri

Post on 10-May-2015

3.156 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Php unit ve tdd

PHPUnit

Mustafa İlerİ

TEMMUZ'13 -PHPISt

Test Driven Development

Page 2: Php unit ve tdd

Mustafa İLERİ

@mustafailerihttp://tr.linkedin.com/in/[email protected]://sonsuzdongu.com/blog

Page 3: Php unit ve tdd

TEST ODAKLI GELİŞTİRME

Kısa gelİştİrme süreçlerİNİN tekrarlarına dayalı bİr yazılım gelİştİrme sürecİdİr.TEST ODAKLI Gelİştİrme sürecİnİn temelİnde testler vardır.Kent Beck tarafından ortaya atılmıştır.

Page 4: Php unit ve tdd

TEST ODAKLI GELİŞTİRME Sürecİ

TESTLERİNİZİ YAZIN.

Testlerİ ÇALIŞTIRIP TEST SONUÇLARININ BAŞARISIZ OLDUĞUNU GÖRÜN (KIRMIZI).

TESTİN GEREKSİNİMLERİNİ YERİNE GETİREN METODLARI YAZIN.

TEKRAR TESTLERİ ÇALIŞTIRIN VE TESTLERİN BAŞARILI OLDUĞUNU GÖRÜN (YEŞİL).

KODUNUZU DÜZENLEYİN.

AYNI SÜRECİ TEKRAR EDİN.

1.2.3.4.5.6.

Page 5: Php unit ve tdd

BİRİM (UNIT)GELİŞTİRİLEN YAZILIMIN Test edİLEBİLİR EN KÜÇÜK PARÇASIDIR.

Page 6: Php unit ve tdd

BİRİM TESTLERİ (UNIT TESTS)

BİRİM TESTİ, YAZILIM GelİŞTİRMEDE BİR YAZILIM TASARIMI VE GELİŞTİRME YÖNTEMİDİR.

BU YÖNTEMDE YAZILIMCI, YAZILIM KODUNU OLUŞTURAN BİRİMLERİN KULLANIMA HAZIR OLDUĞUNA İKNA OLUR.

Page 7: Php unit ve tdd

NEDENNEDEN bİRİM TEST YAZMALIYIZ? bİRİM TEST YAZMALIYIZ?

KOD KAYNAKLI SORUNLARI DAHA RAHAT BULABİLMEK.KOD KAYNAKLI SORUNLARI DAHA RAHAT BULABİLMEK.KOD ÜZERİNDE DAHA RAHAT DEĞİŞİKLİK YAPABİLMEYİ SAĞLAMAK.KOD ÜZERİNDE DAHA RAHAT DEĞİŞİKLİK YAPABİLMEYİ SAĞLAMAK.

ENTEGRASYON VE KULLANICI TESTİ SÜREÇLERİNİ DAHA RAHAT GEÇİREBİLMEK.ENTEGRASYON VE KULLANICI TESTİ SÜREÇLERİNİ DAHA RAHAT GEÇİREBİLMEK.YAZDIĞIMIZ METODLARIN (BİRİMLERİN) KULLANIM ÖRNEĞİNİ SAĞLAMAK.YAZDIĞIMIZ METODLARIN (BİRİMLERİN) KULLANIM ÖRNEĞİNİ SAĞLAMAK.

DAHA İYİ KOD YAZABİLMEK.DAHA İYİ KOD YAZABİLMEK.

Page 8: Php unit ve tdd

KODUN ÇALIŞIP ÇALIŞMADIĞINI BİZ ÇOK İYİ BİLİRİZ!KODUN ÇALIŞIP ÇALIŞMADIĞINI BİZ ÇOK İYİ BİLİRİZ!

Page 9: Php unit ve tdd

YeŞİlİ koruyalımKodunuzu göndermeden önce mutlaka tüm testleri çalıştırın.

Page 10: Php unit ve tdd

Whenever you are tempted to type something into Whenever you are tempted to type something into a print statement or a debugger expression, write a print statement or a debugger expression, write it as a test instead.it as a test instead.

Martin FowlerMartin Fowler

Page 11: Php unit ve tdd

bİRİM TEST ÖZELLİKLERİ

➔ HER BİR TEST BİR ÜNİTEYİ (METODU) TEST ETMELİDİR.➔ BİRİM TESTLERİN BAĞIMLILIKLARI OLMAMALIDIR.➔ KOLAY YAZILABİLİR, OKUNABİLİR VE ÇALIŞTIRILABİLİR OLMADIR.➔ BİRİM TEST YAPARKEN GEREKSİNİMLERİ VE TESTE VERİLECEK CEVABI BİLİNİYOR

OLMALIDIR (WHITE BOX TESTING).

Page 12: Php unit ve tdd

ÇOK MU ÇOK MU ZAMANZAMAN ALIYOR? ALIYOR?

MICROSOFT VE IBM'İN YAPTIĞI ARAŞTIRMAYA GÖRE TEST YAZMAK,MICROSOFT VE IBM'İN YAPTIĞI ARAŞTIRMAYA GÖRE TEST YAZMAK,

GELİŞTİRME SÜRESİNİ GELİŞTİRME SÜRESİNİ %15 - %35%15 - %35 UZATIRKEN UZATIRKEN

PROJEDEKİ HATA (BUG) SAYISINI PROJEDEKİ HATA (BUG) SAYISINI %40 - %90%40 - %90 AZALTIYOR. AZALTIYOR.

Page 13: Php unit ve tdd

PHPUNITPHPUNIT

SEBASTIAN BERGMANNSEBASTIAN BERGMANN TARAFINDAN PHP İLE GELİŞTİRİLMİŞ BİR BİRİM TEST “FRAMEWORK”ÜDÜR. XUNIT AİLESİNDEN TÜREMİŞTİR.

https://github.com/sebastianbergmann/phpunit/

http://phpunit.de/manual/3.8/en/installation.htmlhttp://phpunit.de/manual/3.8/en/installation.html

Page 14: Php unit ve tdd

PHPUNIT GEREKSİNİMLERİ VE YÜKLEME

PHPUNIT 3.7 GEREKSİNİMLERMIN PHP 5.3.3 ÖNERİLEN PHP 5.4.7

PHPUNIT 3.8 GEREKSİNİMLERPHP 5.4.7

YÜKLEME

PEARpear config-set auto_discover 1pear install pear.phpunit.de/PHPUnit

COMPOSER{ "require": { "phpunit/phpunit": "3.8.*" }, "config": { "bin-dir": "/usr/local/bin/" }}

PHARwget http://pear.phpunit.de/get/phpunit.pharchmod +x phpunit.phar

Page 15: Php unit ve tdd

temel kuralLAR

1. Test sınıfları “PHPUnit_Framework_TestCase” sınıfından türetilmelidir.

2. Test sınıfları “Test“ kelimesi ile biltmelidir.(FooBarTest)

3. Test sınıflarının isimleri ile bulunduğu dosyaların isimleri aynı olmalıdır.(FooBarTest.php)

4. Test metodları “test“ kelimesi ile başlamalıdır (testDemoMethod) veya test “annotation“ı kullanılmalıdır.

5. Test metodları “public“ olmalıdır.

6. Test sınıfları en az 1 adet test metodu içermelidir. Aksi durumda test başarısız olur.

7. Test metodları en az 1 adet onaylama (assertion) içermelidir.

Page 16: Php unit ve tdd

İLK İLK TESTTEST

class DemoTest extends PHPUnit_Framework_TestCaseclass DemoTest extends PHPUnit_Framework_TestCase{{ public function testDemo()public function testDemo() {{ $this->assertTrue(true);$this->assertTrue(true); }}}}

Page 17: Php unit ve tdd

ONAYLAMA İFADELERİ, BELİRLİ PARAMETRELER İLE TEST EDİLEN BİRİMİN VERDİĞİ DÖNÜŞ DEĞERİNİ KONTROL ETMEYE YARAR.

public function testArrayHasKey(){

$this->assertArrayHasKey('foo', array('bar' => 'baz'));}

Failed asserting that an array has the key 'foo'.

FAIL!

public function testArrayHasKey(){

$this->assertArrayHasKey('bar', array('bar' => 'baz'));}

SUCCESS!

ONAYLAMA İFADELERİ (ASSERTIONS)

Page 18: Php unit ve tdd

assertArrayHasKey()assertClassHasAttribute()assertClassHasStaticAttribute()assertContains()assertContainsOnly()assertContainsOnlyInstancesOf()assertCount()assertEmpty()assertEqualXMLStructure()assertEquals()assertFalse()assertFileEquals()assertFileExists()assertGreaterThan()assertGreaterThanOrEqual()assertInstanceOf()assertInternalType()assertJsonFileEqualsJsonFile()assertJsonStringEqualsJsonFile()assertJsonStringEqualsJsonString()

assertLessThan()assertLessThanOrEqual()assertNull()assertObjectHasAttribute()assertRegExp()assertStringMatchesFormat()assertStringMatchesFormatFile()assertSame()assertSelectCount()assertSelectEquals()assertSelectRegExp()assertStringEndsWith()assertStringEqualsFile()assertStringStartsWith()assertTag()assertThat()assertTrue()assertXmlFileEqualsXmlFile()assertXmlStringEqualsXmlFile()AssertXmlStringEqualsXmlString()

ONAYLAMA İFADELERİ (ASSERTIONS)PHPUNIT, FARKLI DURUMLARIN DOĞRULUĞUNU KONTROL ETMEK İÇİN ÇOK SAYIDA

DOĞRULAMA İFADESİ SAĞLAR.

http://phpunit.de/manual/3.8/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.assertions

Page 19: Php unit ve tdd

ONAYLAMA İFADELERİ (ASSERTIONS)KENDİ DOĞRULAMA İFADELERİNİZİ YAZABİLİRSİNİZ.

/** * Assert response code * * @param int $code * @param string $message * @return void */ public function assertResponseCode($code, $message = '') { $this->_incrementAssertionCount(); require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php'; $constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader(); $response = $this->response; if (!$constraint->evaluate($response, __FUNCTION__, $code)) { $constraint->fail($response, $message); } }

Page 20: Php unit ve tdd

BİR TEST İÇİNDE BİR TEST İÇİNDE BİRDEN FAZLA ONAYLAMA İFADESİBİRDEN FAZLA ONAYLAMA İFADESİ KULLANABİLİRSİNİZ. KULLANABİLİRSİNİZ.TESTİN BAŞARILI OLABİLMESİ İÇİN TESTİN BAŞARILI OLABİLMESİ İÇİN BÜTÜN ONAYLAMA İFADELERİ SAĞLANMALIDIRBÜTÜN ONAYLAMA İFADELERİ SAĞLANMALIDIR..

ONAYLAMA İFADELERİ (ONAYLAMA İFADELERİ (ASSERTIONSASSERTIONS))

Page 21: Php unit ve tdd

AnnotationsPHPUNIT, “annotatıon” KULLANARAK AÇIKLAMA SATIRINDA TEST METODU İÇİN

BELLİ DEKLARASYONLAR YAPMAYI DESTEKLER.

@author@backupGlobals@backupStaticAttributes@codeCoverageIgnore*@covers@coversNothing@dataProvider@depends@expectedException@expectedExceptionCode

@expectedExceptionMessage@group@outputBuffering@preserveGlobalState@requires@runTestsInSeparateProcesses@runInSeparateProcess@test@testdox@ticket

http://phpunit.de/manual/3.8/en/appendixes.annotations.html

Page 22: Php unit ve tdd

DATA PROVIDER“@dataprovider providerMethodName” şeklinde belirtilir ve test

için kullanılacak verileri dizi olarak sağlar.

class DataTest extends PHPUnit_Framework_TestCase{ /** * @dataProvider provider */ public function testAdd($a, $b, $c) { $this->assertEquals($c, $a + $b); } public function provider() { return array( array(0, 0, 0), array(0, 1, 1), array(1, 0, 1), array(1, 1, 3) ); }

1) DataProviderTest::testAdd with data set #3 (1, 1, 3)Failed asserting that 2 matches expected 3.

Page 23: Php unit ve tdd

Depends“@depends dependedMethodName” şeklinde belirtilir ve test

metodları arasındaki bağımlılıkları belirtir.

class DependencyTest extends PHPUnit_Framework_TestCase{ public function testEmpty() { $stack = array(); $this->assertEmpty($stack);

return $stack; }

/** * @depends testEmpty */ public function testPush(array $stack) { array_push($stack, 'foo'); $this->assertEquals('foo', $stack[count($stack)-1]); $this->assertNotEmpty($stack);

return $stack; }}

Page 24: Php unit ve tdd

EXPECTED EXCEPTION / CODE“@expectedException NotFoundException” şeklinde kullanılır ve beklenilen hata türü belirlenir.

“@expectedExceptionCode 100” şeklinde kullanılır ve beklenilen hata kodu belirlenir.

“@expectedExceptionMessage Right Message” şeklinde kullanılır ve beklenilen hata mesajı belirlenir.

class ExceptionTest extends PHPUnit_Framework_TestCase{ /** * @expectedException InvalidArgumentException * @expectedExceptionCode 20 * @expectedExceptionMessage Right Message */ public function testExceptionHasRightCode() { throw new InvalidArgumentException('Right Message', 20); }}

Page 25: Php unit ve tdd

TAKLİT NESNELERİ TAKLİT NESNELERİ ((MOCK OBJECTSMOCK OBJECTS))

Testİn Yazıldığı BİRİMDE bulunan bağımlı Testİn Yazıldığı BİRİMDE bulunan bağımlı nesneler GİBİ davranan taklİt nesnelerİDİR.nesneler GİBİ davranan taklİt nesnelerİDİR.

TEMEL AMAÇ; TEMEL AMAÇ; DIŞA BAĞIMLILIĞI KALDIRMAKDIŞA BAĞIMLILIĞI KALDIRMAK VE VE TESTLERİN İZOLASYONUNUTESTLERİN İZOLASYONUNU SAĞLAMAK. SAĞLAMAK.

GENELDE VERİTABANI, MAıL CLIENT VE WEB GENELDE VERİTABANI, MAıL CLIENT VE WEB SERVİSLER İÇİN KULLANILIR.SERVİSLER İÇİN KULLANILIR.

Page 26: Php unit ve tdd

TAKLİT NESNELERİ (TAKLİT NESNELERİ (MOCK OBJECTSMOCK OBJECTS))<?phpclass Service_User{ ... public function setUserModel($model) { $this->_userModel = $model; } ... public function getBankAccountByUserId($userId) { $bankAccount = $this->_userModel->getBankAccountByUserId($userId); (is_array($bankAccount) && sizeof($bankAccount > 0)) ? $this->setServiceResponseData($bankAccount) : $this->setServiceResponseError ('bankAccount', 'Bank account cannot be found.');

return $this->getServiceResponse(); } ...

Page 27: Php unit ve tdd

TAKLİT NESNELERİ (MOCK OBJECTS)<?php

class Model_User{

... public function getBankAccountByUserId($userId) { $select = $this->db()->select() ->from(array('BA' => 'bankAccount')) ->join(array('B' => 'bank'), 'B.id = BA.bankId') ->where('userId = ?', $userId); return $this->db()->fetchRow($select); } ...}

Page 28: Php unit ve tdd

TAKLİT NESNELERİ (TAKLİT NESNELERİ (MOCK OBJECTSMOCK OBJECTS))<?php

class UserServiceTest extends Zend_Test_PHPUnit_ControllerTestCase{ public function testGetBankAccountByUserId() { $userService = new Service_User(); $mockOfModel = $this->getMock('Model_User'); $mockOfModel->expects($this->once()) ->method('getBankAccountByUserId') ->with(0) ->will($this->returnValue(array(1, 2, 3, 4, 5)));

$userService->setUserModel($mockOfModel); $serviceResponse = $userService->getBankAccountByUserId(0); if ($serviceResponse->getSuccess()) { $this->assertTrue(is_array($serviceResponse->getData())); } else { $this->assertTrue(false); } }}

Page 29: Php unit ve tdd

PHPUNIT EKLENTİLERİ

DBUNITpear install phpunit/DbUnit"phpunit/dbunit": ">=1.2"

Veritabanı etkileşimlerini test etmeye yarar.

INVOKERpear install phpunit/PHP_Invoker"phpunit/php-invoker": "*"

Zaman aşımı durumlarını test etmeye yarar.

SELENIUMpear install phpunit/PHPUnit_Selenium"phpunit/phpunit-selenium": ">=1.2"

PHPUnit için Selenium RC entegrasyonu sağlar.

XHProfpear install phpunit/PHPUnit_TestListener_XHProf

Test edilen kodu otomatik olarak analiz eder.

http://phpunit.de/manual/3.8/en/installation.html

Page 30: Php unit ve tdd

Command Lıne Tool

Bir yapılandırma dosyanız var ise, testler phpunit komutu ile çalıştırılır.Yapılandırma dosyanız yok ise yardım için phpunit yazmanız yeterli.

phpunit DependencyTestphpunit DependencyTest.php

➜ tests phpunit DependencyTest PHPUnit 3.7.19 by Sebastian Bergmann.

...SFI.E.

Time: 0 seconds, Memory: 5.50Mb

OK (3 tests, 5 assertions)

(.) ➜ Test başarılı(F) ➜ Test başarısız(S) ➜ Test değerlendirmeye alınmadı(I) ➜ Test henüz tamamlanmamış $this->markTestIncomplete();(E) ➜ Hata oluşma durumu

http://phpunit.de/manual/3.8/en/textui.html

Page 31: Php unit ve tdd

Code Coverage

Code Coverage, yazılan testlerin, projenizdeki kodların ne kadarını kapsadığını ölçümler ve raporlar.

Fakat bunun için xDebug'ın kurulu olması gerekmektedir.

PHPUnit, bu raporu HTML olarak oluşturabilir.

Code Coverage sürekli yapılan geliştirmelerde kodunuzun güvenirliği üzerindeki değişimi rahatça görebilmenizi sağlar.

Page 32: Php unit ve tdd

Code Coverage

Page 33: Php unit ve tdd

Code Coverage

Page 34: Php unit ve tdd

Code Coverage

Page 35: Php unit ve tdd

Code Coverage

Page 36: Php unit ve tdd

Phpunıt YapılandırmasıTestlerin genel yapılandırması bir xml dosyası ile belirlenebilir.

testsuites: Test paketleri oluşturulmasını sağlar.groups: Testlere dahil edilecek veya çıkarılacak gruplar belirlenir.filter: Code Coverage'a dahil edilecek veya hariç tutulacak birimler belirlenebilir.

phpunit.xml

<phpunit bootstrap="./bootstrap.php" colors="true"> <testsuite name="Application Test Suite"> <directory>./application</directory> </testsuite> <testsuite name="Library Test Suite"> <directory>./library</directory> </testsuite> <filter> <blacklist> <directory suffix=".php">/usr/lib/php/pear/Zend</directory> </blacklist> </filter></phpunit>

http://phpunit.de/manual/3.8/en/appendixes.configuration.html

Page 37: Php unit ve tdd

Test tİPLERİ

BİRİM TEST

ENTEGRASYON TESTİ

SİSTEM TESTİ

KULLANICI KABUL TESTİ

➜➜

Page 38: Php unit ve tdd

ENTEGRASYON TESTİ

ASLINDA BİRİM TESTİN BİR TÜRÜDÜR.BİRİM TEST, BİRİMİ TEST EDERKEN; ENTEGRASYON TESTİ BERABER ÇALIŞAN BİRİMLERİ, MODÜLLERİ TEST EDER.

1. BİLEŞEN TESTİ: SADECE BİR BİLEŞENİ TEST EDER. DIŞA BAĞIMLILIKLAR İÇİN TAKLİT NESNELERİ (MOCK OBJECTS) KULLANILIR.

2. ENTEGRASYON TESTİ: BİR VEYA BİRDEN FAZLA BİLEŞENİ TEST EDER. İHTİYAÇ DUYULMASI DURUMUNDA DIŞA BAĞIMLI BİLEŞENLERE ERİŞEBİLİR.

Page 39: Php unit ve tdd

SİSTEM TESTİ

YAZILIM VE DONANIM SİSTEMLERİNİN ENTEGRE EDİLMESİYLE, SİSTEMİN BEKLENEN ŞARTLARA UYGUNLUĞUNUN TEST EDİLMESİDİR.

YAZILIM PERFORMAS TESTİYÜK TESTİUYUMLULUK TESTİSTRES TESTİÖLÇEKLENEBİLİRLİK TESTİVS...

Page 40: Php unit ve tdd

KULLANICI KABUL TESTİ

GELİŞTİRİLEN YAZILIMın, SON KULLANICININ BEKLENTİLERİNİ KARŞILAYIP KARŞILAYAMADIĞINI TEST EDER.

ÖNCEDEN TANIMLANMIŞ TEST SENARYOLARININ DOĞRULUĞUNU KONTROL EDer.KULLANICI KABUL TESTİ, TEST UZMANLARI TARAFINDAN GERÇEKLEŞTİRİLİR.

SON KULLANICI TESTLERİ BEHAT VEYA SELENIUM KULLANARAK OTOMATİZE EDİLEBİLİR.

Page 41: Php unit ve tdd

kaynaklar

http://www.slideshare.net/lemiorhan/the-engines-of-software-development-testing-and-test-driven-developmenthttp://www.slideshare.net/markstory/phpunit-and-you?from_search=10http://www.slideshare.net/mjlivelyjr/automated-unit-testing?from_search=38http://www.slideshare.net/ferca_sl/unit-testing-with-phpunit?from_search=47http://www.cihataltuntas.com/test-driven-development/http://en.wikipedia.org/wiki/Test-driven_developmenthttp://en.wikipedia.org/wiki/Software_testing

Resimlerhttp://diogoosorio.com/blog/entry/test-driven-development-tdd-using-phpunithttp://elberling.dk/advertising-illustrations/crash-test-dummy-head-038/http://www.thesaleslion.com/massive-blog-growth-havetime-takes/http://amyshirateitel.com/2011/12/17/vintage-space-fun-fact-gene-kranzs-vest/http://toutelaculture.com/arts/folk-rock-et-protest-songs-dylan-sexpose-a-la-cite-de-la-musique/http://www.ahawallpaper.com/the-ring-two/1280x1024-0-773500.htmlhttp://www.movievortex.com/2009/11/fight-clubs-blu-ray-debut-contains-surprise/http://commons.wikimedia.org/wiki/File:Martin_Fowler_-_Swipe_Conference_2012_.jpghttp://www.freegreatpicture.com/green-sky/grass-material-15815

Page 42: Php unit ve tdd

sorularsorular