Tdd Presentation

2,342 views

Published on

Test Driven Development from December's PHP Israel and Tapuz Forum meeting at Zend's offices

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,342
On SlideShare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Tdd Presentation

  1. 4. <?php $a = 1; do_smething_to_var( $a ); if ( $a ===1) die ( 'test failed' ); echo 'test did not fail. Yey!' ; function do_something_to_var( & $var ){ $var += 1; }
  2. 6. <ul><li>interface SomeBehaviour{ </li></ul><ul><ul><li>public function doOneThing( $var ); </li></ul></ul><ul><ul><li>public function doOtherThing( $var ); </li></ul></ul><ul><ul><li>public function doThirdThing( $var ); </li></ul></ul><ul><li>} </li></ul>
  3. 7. <ul><li>class SomeBehaviour{ </li></ul><ul><ul><li>public function doOneThing( $var ){ /* ... */ } </li></ul></ul><ul><ul><li>public function doOtherThing( $var ){ /* ... */ } </li></ul></ul><ul><ul><li>public function doThirdThing( $var ){ /* ... */ } </li></ul></ul><ul><ul><li>protected function willDoItThing( $var ){ /* ... */ } </li></ul></ul><ul><ul><li>protected function willDoAnotherThing( $var ){ /* ... */ } </li></ul></ul><ul><li>} </li></ul>
  4. 8. <ul><li>class SomeTest extends PHPUnit_Framework_Testcase { </li></ul><ul><ul><li>public function testSomeBehaviuor() { </li></ul></ul><ul><ul><ul><li>/* </li></ul></ul></ul><ul><ul><ul><li>some assertions </li></ul></ul></ul><ul><ul><ul><li>*/ </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public function testSomeOtherBehaviour() { </li></ul></ul><ul><ul><ul><li>/* </li></ul></ul></ul><ul><ul><ul><li>some assertions </li></ul></ul></ul><ul><ul><ul><li>*/ </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>{ </li></ul><ul><li>class Some { </li></ul><ul><ul><li>public function someBehaviuor( $var ) { </li></ul></ul><ul><ul><ul><li>/* </li></ul></ul></ul><ul><ul><ul><ul><li>some expected action </li></ul></ul></ul></ul><ul><ul><ul><li>*/ </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public function someOtherBehaviour( $var ) { </li></ul></ul><ul><ul><ul><li>/* </li></ul></ul></ul><ul><ul><ul><ul><li>some expected action </li></ul></ul></ul></ul><ul><ul><ul><li>*/ </li></ul></ul></ul><ul><ul><li>{ </li></ul></ul><ul><li>} </li></ul>
  5. 10. Active Record : מייצג את הישות &quot; הודעה &quot; באתר . אחראי על כל הפעולות שנעשה על עם הודעה אחראי על מנגנון ההרשאות באתר . מימוש יחודי לכל אתר בנפרד
  6. 11. <ul><li>//From MessagePermissionHandlerTest </li></ul><ul><li>public function testOpenPermission () { </li></ul><ul><ul><li>user::setId(1); </li></ul></ul><ul><ul><li>$permissionHandler = new MessagePermissionHandler(); </li></ul></ul><ul><ul><li>$this -> assertTrue ($permissionHandler ->doesHavePermission( 'open' ,1)); </li></ul></ul><ul><ul><li>user::setId(2); </li></ul></ul><ul><ul><li>$this -> assertFalse ($permissionHandler ->doesHavePermission( 'open' ,1)); </li></ul></ul><ul><li>} </li></ul><ul><li>//From MessagePermissionHandler </li></ul><ul><li>public function doesHavePermission( $type , $forum_id = false , $message_id = false ){ </li></ul><ul><ul><li>if (user :: getInstance()->canOpenForum( $forum_id )) return true ; </li></ul></ul><ul><ul><li>return false ; </li></ul></ul><ul><li>} </li></ul>
  7. 12. <ul><li>/ /From MessagePermissionHandlerTest </li></ul><ul><li>public function testOpenPermission () { </li></ul><ul><ul><li>user::setId(1); </li></ul></ul><ul><ul><li>$permissionHandler = new MessagePermissionHandler(); </li></ul></ul><ul><ul><li>$this -> assertTrue ($permissionHandler ->doesHavePermission( 'open' ,1)); </li></ul></ul><ul><ul><li>user::setId(2); </li></ul></ul><ul><ul><li>$this -> assertFalse ($permissionHandler ->doesHavePermission( 'open' ,1)); </li></ul></ul><ul><li>} </li></ul><ul><li>public function testCreatePermission () { </li></ul><ul><ul><li>user::setId(1); </li></ul></ul><ul><ul><li>$permissionHandler = new MessagePermissionHandler(); </li></ul></ul><ul><ul><li>$this -> assertTrue ($permissionHandler ->doesHavePermission( ‘create' ,1)); </li></ul></ul><ul><ul><li>user::setId(2); </li></ul></ul><ul><ul><li>$this -> assertFalse ($permissionHandler ->doesHavePermission( ‘create' ,1)); </li></ul></ul><ul><li>} </li></ul><ul><li>public function testUpdatePermission () { </li></ul><ul><ul><li>user::setId(1); </li></ul></ul><ul><ul><li>$permissionHandler = new MessagePermissionHandler(); </li></ul></ul><ul><ul><li>$this -> assertTrue ($permissionHandler ->doesHavePermission( ‘update' ,1,3)); </li></ul></ul><ul><ul><li>user::setId(2); </li></ul></ul><ul><ul><li>$this -> assertFalse ($permissionHandler ->doesHavePermission( ‘update' ,1,3)); </li></ul></ul><ul><li>} </li></ul>
  8. 13. <ul><li>//From PermissionHandler </li></ul><ul><li>public function doesHavePermission( $type , $forum_id = false , $message_id = false ){ </li></ul><ul><ul><li>if (user:::getId() === 1) return true ; </li></ul></ul><ul><ul><li>return false ; </li></ul></ul><ul><li>} </li></ul>
  9. 14. <ul><li>class a{ </li></ul><ul><ul><li>private $b = null ; </li></ul></ul><ul><ul><li>public function __construct(){ </li></ul></ul><ul><ul><li>$this ->b = new B(); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul><ul><li>class a{ </li></ul><ul><ul><li>private $b = null ; </li></ul></ul><ul><ul><li>public function __construct(B $b ){ </li></ul></ul><ul><ul><li>$this ->b = $b; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul><ul><li>$b = new B(); </li></ul><ul><li>$a = new a( $b ); </li></ul>הוצאנו את הבנאי מחוץ למחלקה – ו &quot; הזרקנו &quot; את המחלקה המוכנה . Type hinting – בד &quot; כ לממשק
  10. 16. <ul><li>public function setParent(Message $parent ){ </li></ul><ul><ul><li>if ( null != $this ->parent){ </li></ul></ul><ul><ul><ul><li>throw new Exception( ‘parent set’ ); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>$this ->parent = $parent ; </li></ul></ul><ul><li>} </li></ul><ul><ul><li>public function testSetParent(){ </li></ul></ul><ul><ul><ul><li>$ph = $this ->getMock( ‘PermissionHandler’ ); </li></ul></ul></ul><ul><ul><ul><li>$pr = $this ->getMock( ‘Message’ ); </li></ul></ul></ul><ul><ul><ul><li>$this ->message = new Message( $ph ); </li></ul></ul></ul><ul><ul><ul><li>$this ->message->setParent( $pr ); </li></ul></ul></ul><ul><ul><ul><li>$this ->assertTrue( $this ->message instanceof Message); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>//from Message </li></ul><ul><li>public function __construct( PermissionHandler $ph ){ </li></ul><ul><ul><li>$this ->handler = $ph ; </li></ul></ul><ul><li>} </li></ul>שם המחלקה אותה נרצה לזייף הזרקת תלות
  11. 17. <ul><li>//from MessageTest </li></ul><ul><li>/** </li></ul><ul><li>* @expectedException NoPermissionException </li></ul><ul><li>*/ </li></ul><ul><li>public function testSetIdNoPermission(){ </li></ul><ul><ul><li>$ph = $this </li></ul></ul><ul><ul><li>->getMock( ‘PermissionHandler’ , array ( ‘doesHavePermission’ )); </li></ul></ul><ul><ul><li>$ph ->expects( $this ->once()) </li></ul></ul><ul><ul><ul><li>->method( ‘doesHavePermission’ ) </li></ul></ul></ul><ul><ul><ul><li>->will( $this ->returnValue( false )); </li></ul></ul></ul><ul><ul><li>$message = new Message( $ph ); </li></ul></ul><ul><ul><li>$message ->setId(1); </li></ul></ul><ul><li>} </li></ul><ul><li>//from Message </li></ul><ul><li>public function setId( $id ){ </li></ul><ul><ul><li>if (! $this ->handler->doesHavePermission( ‘open’ , $this ->getForumId())){ </li></ul></ul><ul><ul><ul><li>throw new NoPermissionException( ‘open’ ); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>$this ->openMessage( $id ); </li></ul></ul><ul><li>} </li></ul>כמה פעמים לצפות שהמתודה תיקרא יכול לקבל : once, any, exactly( int ) . שם המתודה איזה ערך להחזיר . יכול גם לקבל מערך של ערכים ( למקרה שנרצה שהמתודה תיקרא מספר פעמים ) מערך של מתודות שנרצה שידומו Annotaitions : שימוש ב Dock-Block כדי להגדיר עוד תנאים למבחן – במקרה הזה – לצפות לחריגה מסוג מסויים
  12. 19. <ul><li>public function setUp(){ </li></ul><ul><ul><li>$this ->initDB(); </li></ul></ul><ul><li>} </li></ul><ul><li>// some tests </li></ul><ul><li>public function tearDown(){ </li></ul><ul><ul><li>$this ->emptyDB(); </li></ul></ul><ul><li>} </li></ul><ul><li>protected function initDB(){ </li></ul><ul><ul><li>$pdo = new PDO( 'mysql:host:=localhost;dbname=test_db’ , ’root’ , ’1234’ ); </li></ul></ul><ul><ul><li>$sql = file_get_contents ( dirname (__FILE__). '/../db/test_sql.sql' ); </li></ul></ul><ul><ul><li>$sql = explode ( ';' , $sql ); </li></ul></ul><ul><ul><li>foreach ( $sql as $stmt ){ </li></ul></ul><ul><ul><li>try { </li></ul></ul><ul><ul><li>$pdo ->query( $stmt ); </li></ul></ul><ul><ul><li>} catch (Exception $e ){} </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>INSERT INTO `messages` VALUES ( '1' , '1' , '1' , '1' ); INSERT INTO `messages` VALUES ( '2' , '1' , '1.2' , '1' ); INSERT INTO `messages` VALUES ( '3' , '1' , '1.3' , '1' ); INSERT INTO `messages` VALUES ( '4' , '1' , '1.2.4' , '1' ); INSERT INTO `messages` VALUES ( '5' , '1' , '5' , '5' ); INSERT INTO `messages` VALUES ( '7' , '1' , '1.3.7' , '1' ); INSERT INTO `messages` VALUES ( '8' , '1' , '5.8' , '5' ); TRUNCATE TABLE `forums` ; TRUNCATE TABLE `message_contents` ; TRUNCATE TABLE `message_extras` ; TRUNCATE TABLE `messages` ; TRUNCATE TABLE `users` ;
  13. 21. <ul><li>public function testProtectedMethod(){ </li></ul><ul><ul><li>$tester = new MessageTester(); </li></ul></ul><ul><ul><li>$this ->assertTrue ( </li></ul></ul><ul><ul><ul><li>$tester -> public _ protectedMethodReturnsTrue() </li></ul></ul></ul><ul><ul><li>); </li></ul></ul><ul><li>} </li></ul>אם המתודה מתחילה ב _public וקיימת במחלקה תבדוק אם למחלקה יש כבר __call

×