Php unit ve tdd

4,414 views

Published on

0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,414
On SlideShare
0
From Embeds
0
Number of Embeds
2,829
Actions
Shares
0
Downloads
26
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

Php unit ve tdd

  1. 1. PHPUnit Mustafa İlerİ TEMMUZ'13 -PHPISt Test Driven Development
  2. 2. Mustafa İLERİ @mustafaileri http://tr.linkedin.com/in/mustafaileri mustafa.ileri@sonsuzdongu.com http://sonsuzdongu.com/blog
  3. 3. 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.
  4. 4. 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.
  5. 5. BİRİM (UNIT) GELİŞTİRİLEN YAZILIMIN Test edİLEBİLİR EN KÜÇÜK PARÇASIDIR.
  6. 6. 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.
  7. 7. 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.
  8. 8. 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!
  9. 9. YeŞİlİ koruyalım Kodunuzu göndermeden önce mutlaka tüm testleri çalıştırın.
  10. 10. Whenever you are tempted to type something intoWhenever you are tempted to type something into a print statement or a debugger expression, writea print statement or a debugger expression, write it as a test instead.it as a test instead. Martin FowlerMartin Fowler
  11. 11. 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).
  12. 12. Ç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 - %35UZATIRKENUZATIRKEN PROJEDEKİ HATA (BUG) SAYISINIPROJEDEKİ HATA (BUG) SAYISINI %40 - %90%40 - %90AZALTIYOR.AZALTIYOR.
  13. 13. 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
  14. 14. PHPUNIT GEREKSİNİMLERİ VE YÜKLEME PHPUNIT 3.7 GEREKSİNİMLER MIN PHP 5.3.3 ÖNERİLEN PHP 5.4.7 PHPUNIT 3.8 GEREKSİNİMLER PHP 5.4.7 YÜKLEME PEAR pear config-set auto_discover 1 pear install pear.phpunit.de/PHPUnit COMPOSER { "require": { "phpunit/phpunit": "3.8.*" }, "config": { "bin-dir": "/usr/local/bin/" } } PHAR wget http://pear.phpunit.de/get/phpunit.phar chmod +x phpunit.phar
  15. 15. 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.
  16. 16. İ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); }} }}
  17. 17. 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)
  18. 18. 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
  19. 19. 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); } }
  20. 20. BİR TEST İÇİNDEBİ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İ İÇİNTESTİN BAŞARILI OLABİLMESİ İÇİN BÜTÜN ONAYLAMA İFADELERİ SAĞLANMALIDIRBÜTÜN ONAYLAMA İFADELERİ SAĞLANMALIDIR.. ONAYLAMA İFADELERİ (ONAYLAMA İFADELERİ (ASSERTIONSASSERTIONS))
  21. 21. Annotations PHPUNIT, “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
  22. 22. 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.
  23. 23. 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; } }
  24. 24. 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); } }
  25. 25. 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 VEVE TESTLERİN İZOLASYONUNUTESTLERİN İZOLASYONUNU SAĞLAMAK.SAĞLAMAK. GENELDE VERİTABANI, MAıL CLIENT VE WEBGENELDE VERİTABANI, MAıL CLIENT VE WEB SERVİSLER İÇİN KULLANILIR.SERVİSLER İÇİN KULLANILIR.
  26. 26. TAKLİT NESNELERİ (TAKLİT NESNELERİ (MOCK OBJECTSMOCK OBJECTS)) <?php class 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(); } ...
  27. 27. 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); } ... }
  28. 28. 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); } } }
  29. 29. PHPUNIT EKLENTİLERİ DBUNIT pear install phpunit/DbUnit "phpunit/dbunit": ">=1.2" Veritabanı etkileşimlerini test etmeye yarar. INVOKER pear install phpunit/PHP_Invoker "phpunit/php-invoker": "*" Zaman aşımı durumlarını test etmeye yarar. SELENIUM pear install phpunit/PHPUnit_Selenium "phpunit/phpunit-selenium": ">=1.2" PHPUnit için Selenium RC entegrasyonu sağlar. XHProf pear install phpunit/PHPUnit_TestListener_XHProf Test edilen kodu otomatik olarak analiz eder. http://phpunit.de/manual/3.8/en/installation.html
  30. 30. 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 DependencyTest phpunit 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
  31. 31. 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.
  32. 32. Code Coverage
  33. 33. Code Coverage
  34. 34. Code Coverage
  35. 35. Code Coverage
  36. 36. 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
  37. 37. Test tİPLERİ BİRİM TEST ENTEGRASYON TESTİ SİSTEM TESTİ KULLANICI KABUL TESTİ ➜➜➜
  38. 38. 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.
  39. 39. 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...
  40. 40. 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.
  41. 41. kaynaklar http://www.slideshare.net/lemiorhan/the-engines-of-software-development-testing-and-test-driven-development http://www.slideshare.net/markstory/phpunit-and-you?from_search=10 http://www.slideshare.net/mjlivelyjr/automated-unit-testing?from_search=38 http://www.slideshare.net/ferca_sl/unit-testing-with-phpunit?from_search=47 http://www.cihataltuntas.com/test-driven-development/ http://en.wikipedia.org/wiki/Test-driven_development http://en.wikipedia.org/wiki/Software_testing Resimler http://diogoosorio.com/blog/entry/test-driven-development-tdd-using-phpunit http://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.html http://www.movievortex.com/2009/11/fight-clubs-blu-ray-debut-contains-surprise/ http://commons.wikimedia.org/wiki/File:Martin_Fowler_-_Swipe_Conference_2012_.jpg http://www.freegreatpicture.com/green-sky/grass-material-15815
  42. 42. sorularsorular

×