Beginning PHPUnit

3,531 views

Published on

Published in: Technology

Beginning PHPUnit

  1. 1. Beginning PHPUnit
  2. 2. Jace Ju / jaceju / PHP Smarty Plurk: http://www.plurk.com/jaceju >////<
  3. 3. • PHPUnit
  4. 4. • PHPUnit• PHPUnit
  5. 5. • PHPUnit• PHPUnit•
  6. 6. • PHPUnit• PHPUnit••
  7. 7. Question 1
  8. 8. Web
  9. 9. Question 2
  10. 10. Question 3
  11. 11. bugbugs
  12. 12. Bugs
  13. 13. Example
  14. 14. 1 + 2 + 3 + ... + N = ?
  15. 15. project├── application└── library│ └── Math.php└── run_test.php
  16. 16. project├── application└── library│ └── Math.php└── run_test.php
  17. 17. project├── application└── library│ └── Math.php└── run_test.php
  18. 18. project├── application└── library│ └── Math.php└── run_test.php
  19. 19. project├── application└── library│ └── Math.php└── run_test.php
  20. 20. Math.php
  21. 21. Math.php
  22. 22. Math.php <?php class Math { }
  23. 23. Math.php <?php class Math { Math::sum     public static function sum($min, $max)     {         $sum = 0;         for ($i = $min; $i <= $max; $i++) {             $sum += $i;         }         return $sum;     } }
  24. 24. Math.php // TEST_MODE if (defined(TEST_MODE)) { }
  25. 25. Math.php // if (defined(TEST_MODE)) {     // Test 1     $result = Math::sum(1, 10); 1 10     if (55 !== $result) {         echo "Test 1 failed!n";     } else {         echo "Test 1 OK!n";     } }
  26. 26. Math.php // if (defined(TEST_MODE)) {     // Test 1     $result = Math::sum(1, 10);     if (55 !== $result) {         echo "Test 1 failed!n";     } else {         echo "Test 1 OK!n";     }     // Test 2     $result = Math::sum(1, 100);     if (5050 !== $result) { 1 100         echo "Test 2 failed!n";     } else {         echo "Test 2 OK!n";     } }
  27. 27. run_test.php
  28. 28. run_test.php
  29. 29. run_test.php <?php TEST_MODE define(TEST_MODE, true);
  30. 30. run_test.php <?php define(TEST_MODE, true); require_once __DIR__ . /library/Math.php;
  31. 31. # php run_test.php
  32. 32. # php run_test.phpTest 1 OK!Test 2 OK!
  33. 33. ...
  34. 34. PHPUnit by Sebastian Bergmann http://phpunit.de
  35. 35. JUnit http://www.junit.org/
  36. 36. xUnithttp://en.wikipedia.org/wiki/List_of_unit_testing_frameworks
  37. 37. # pear channel-discover pear.symfony-project.com# pear install symfony/YAML# pear channel-discover pear.phpunit.de# pear channel-discover components.ez.no# pear install -o phpunit/phpunit
  38. 38. PHPUnit
  39. 39. project├── application└── library └── Math.php
  40. 40. project├── application├── library│ └── Math.php└── tests
  41. 41. project ├── application ├── library │ └── Math.php └── tests ├── application( tests ) └── library
  42. 42. project├── application├── library│ └── Math.php└── tests ├── application └── library
  43. 43. project ├── application ├── library │ └── Math.php └── tests ├── application └── librarylibrary MathTest.php └── MathTest.php
  44. 44. MathTest.php
  45. 45. MathTest.php <?php class MathTest Test Case { }
  46. 46. MathTest.php <?php class MathTest { }
  47. 47. MathTest.php <?php require_once __DIR__ . /Math.php; class MathTest { }
  48. 48. MathTest.php <?php require_once __DIR__ . /Math.php; PHPUnit class MathTest extends PHPUnit_Framework_TestCase TestCase { }
  49. 49. MathTest.php <?php require_once __DIR__ . /Math.php; class MathTest extends PHPUnit_Framework_TestCase {     public function testSum()     {     } }
  50. 50. MathTest.php <?php require_once __DIR__ . /Math.php; class MathTest extends PHPUnit_Framework_TestCase {     public function testSum() test     {     } }
  51. 51. MathTest.php <?php require_once __DIR__ . /Math.php; class MathTest extends PHPUnit_Framework_TestCase { test     public function testSum()     { CamelCase     } }
  52. 52. MathTest.php <?php require_once __DIR__ . /Math.php; class MathTest extends PHPUnit_Framework_TestCase {     public function testSum()     {         $this->assertEquals(55, Math::sum(1, 10)); PHPUnit         $this->assertEquals(5050, Math::sum(1, 100)); assertions     } }
  53. 53. MathTest.php <?php require_once __DIR__ . /Math.php; class MathTest extends PHPUnit_Framework_TestCase {     public function testSum()     {         $this->assertEquals(55, Math::sum(1, 10));         $this->assertEquals(5050, Math::sum(1, 100));     } }
  54. 54. MathTest.php <?php require_once __DIR__ . /Math.php; class MathTest extends PHPUnit_Framework_TestCase {     public function testSum()     {         $this->assertEquals(55, Math::sum(1, 10));         $this->assertEquals(5050, Math::sum(1, 100));     } }
  55. 55. # phpunit tests/library/MathTest consolephp
  56. 56. # phpunit tests/library/MathTestPHPUnit 3.5.15 by Sebastian Bergmann..Time: 0 seconds, Memory: 5.25MbOK (1 test, 2 assertions)
  57. 57. # phpunit tests/library/MathTest PHPUnit 3.5.15 by Sebastian Bergmann. . Time: 0 seconds, Memory: 5.25Mb OK (1 test, 2 assertions)assertions
  58. 58. phpunitPHPUnit
  59. 59. Test Case Tests testXxxx
  60. 60. Testassertions
  61. 61. assertions
  62. 62. Data Provider
  63. 63. MathTest.php <?php require_once dirname(dirname(__DIR__)) . /library/Math.php; class MathTest extends PHPUnit_Framework_TestCase {     public function testSum() MathTest     {         $this->assertEquals(55, Math::sum(1, 10 ));     } }
  64. 64. MathTest.php <?php require_once dirname(dirname(__DIR__)) . /library/Math.php; class MathTest extends PHPUnit_Framework_TestCase {     public function testSum($expected, $min, $max)     {         $this->assertEquals(55, Math::sum(1, 10 ));     } }
  65. 65. MathTest.php <?php require_once dirname(dirname(__DIR__)) . /library/Math.php; class MathTest extends PHPUnit_Framework_TestCase {     public function testSum($expected, $min, $max)     {         $this->assertEquals($expected, Math::sum($min, $max));     } }
  66. 66. MathTest.php <?php require_once dirname(dirname(__DIR__)) . /library/Math.php; class MathTest extends PHPUnit_Framework_TestCase {     public function testSum($expected, $min, $max)     {         $this->assertEquals($expected, Math::sum($min, $max));     }     public function myDataProvider() public     {         return array(             array(55, 1, 10),             array(5050, 1, 100)         );     } }
  67. 67. MathTest.php <?php require_once dirname(dirname(__DIR__)) . /library/Math.php; class MathTest extends PHPUnit_Framework_TestCase {     public function testSum($expected, $min, $max)     {         $this->assertEquals($expected, Math::sum($min, $max));     }     public function myDataProvider()     {         return array(             array(55, 1, 10),             array(5050, 1, 100)         );     } }
  68. 68. MathTest.php <?php require_once dirname(dirname(__DIR__)) . /library/Math.php; class MathTest extends PHPUnit_Framework_TestCase {     /** PHPUnit      * @dataProvider myDataProvider @dataProvider      */ annotation     public function testSum($expected, $min, $max) data provider     {         $this->assertEquals($expected, Math::sum($min, $max));     }     public function myDataProvider()     {         return array(             array(55, 1, 10),             array(5050, 1, 100)         );     } }
  69. 69. # phpunit tests/library/MathTest
  70. 70. # phpunit tests/library/MathTest PHPUnit 3.5.15 by Sebastian Bergmann. .. Time: 0 seconds, Memory: 5.25Mb OK (2 tests, 2 assertions)tests
  71. 71. Provider Test
  72. 72. Situation
  73. 73. Math::sum ...
  74. 74. Math::sum ...
  75. 75. 1 + 2 + 3 + ... + N =
  76. 76. Math::sum
  77. 77. Math.php <?php Math.php class Math { public static function sum($min, $max) { $sum = 0; for ($i = $min; $i <= $max; $i++) { $sum += $i; } return $sum; } }
  78. 78. Math.php <?php class Math { public static function sum($min, $max) { $sum = 0; return $sum; } }
  79. 79. Math.php <?php class Math { public static function sum($min, $max) { $sum = $min + $max * $max / 2; return $sum; } }
  80. 80. # phpunit tests/library/MathTestMathTest.php
  81. 81. # phpunit tests/library/MathTestPHPUnit 3.5.15 by Sebastian Bergmann.FTime: 0 seconds, Memory: 6.00MbThere was 1 failure:1) MathTest03::testSumFailed asserting that <integer:51> matches expected <integer:55>./path/to/tests/library/MathTest.php:7FAILURES!Tests: 1, Assertions: 1, Failures: 1.
  82. 82. # phpunit tests/library/MathTest PHPUnit 3.5.15 by Sebastian Bergmann. F Time: 0 seconds, Memory: 6.00Mb There was 1 failure: 1) MathTest03::testSum Failed asserting that <integer:51> matches expected <integer:5551 55>. /path/to/tests/library/MathTest.php:7 FAILURES! Tests: 1, Assertions: 1, Failures: 1.
  83. 83. Math.php <?php class Math { /** * */ public static function sum($min, $max) { $sum = $min + $max * $max / 2; return $sum; } }
  84. 84. Math.php <?php class Math { /** * */ public static function sum($min, $max) { $sum = ($min + $max) * $max / 2; return $sum; } }
  85. 85. # phpunit tests/library/MathTestPHPUnit 3.5.15 by Sebastian Bergmann..Time: 0 seconds, Memory: 5.25MbOK (1 test, 2 assertions)
  86. 86. SQL SelectORM Framework
  87. 87. • DbSelect
  88. 88. • DbSelect•
  89. 89. • DbSelect• ‣ from SELECT FROM
  90. 90. • DbSelect• ‣ from SELECT FROM ‣ cols SELECT *
  91. 91. Example 1 $select = new DbSelect(); echo $select->from(‘table’); SELECT * FROM table
  92. 92. Example 2 $select = new DbSelect(); echo $select->from(‘table’)->cols(array(     ‘col_a’, ‘col_b’)); SELECT col_a, col_b FROM table
  93. 93. project├── application├── library│ └── DbSelect.php└── tests ├── application └── library └── DbSelectTest.php
  94. 94. DbSelect.php <?php DbSelect class DbSelect { }
  95. 95. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase { }
  96. 96. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase {     public function testFrom()     { from          } }
  97. 97. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase {     public function testFrom()     {         $select = new DbSelect();         $select->from(test);         $this->assertEquals(SELECT * FROM test,  $select->__toString());     } }
  98. 98. DbSelect.php <?php DbSelect.php class DbSelect { }
  99. 99. DbSelect.php <?php class DbSelect {               public function from($table) from     {     }           }
  100. 100. DbSelect.php <?php class DbSelect {          public function from($table)     {     }               public function __toString() __toString     {     } }
  101. 101. DbSelect.php <?php class DbSelect {          public function from($table)     {     }               public function __toString()     {         return SELECT * FROM test;     } }
  102. 102. # phpunit tests/library/DbSelectTestPHPUnit 3.5.15 by Sebastian Bergmann..Time: 0 seconds, Memory: 5.25MbOK (1 test, 1 assertions)
  103. 103. DbSelect.php <?php class DbSelect {               public function from($table)     {     }               public function __toString()     { table         return SELECT * FROM  . $this->_table;     } }
  104. 104. DbSelect.php <?php class DbSelect { $_table     protected $_table = table;               public function from($table)     {     }               public function __toString()     {         return SELECT * FROM  . $this->_table;     } }
  105. 105. DbSelect.php <?php class DbSelect {     protected $_table = table;               public function from($table)     { if (!preg_match(/[0-9a-z]+/i, $table)) {      throw new IllegalNameException(Illegal Table Name); from } setter         $this->_table = $table;         return $this;     }               public function __toString()     {         return SELECT * FROM  . $this->_table;     } }
  106. 106. # phpunit tests/library/DbSelectTestPHPUnit 3.5.15 by Sebastian Bergmann..Time: 0 seconds, Memory: 5.25MbOK (1 test, 1 assertions)
  107. 107. Design → Write Test → CodingDirection → Find Target → Fire
  108. 108. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase { DbSelectTest.php     public function testFrom()     {         $select = new DbSelect();         $select->from(test);         $this->assertEquals(SELECT * FROM test, $select->__toString());     } }
  109. 109. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase {     public function testFrom()     {         $select = new DbSelect();         $select->from(test);         $this->assertEquals(SELECT * FROM test,  $select->__toString());     }          public function testCols()     { cols         $select = new DbSelect();         $select->from(test)->cols(array(             col_a,             col_b,         ));         $this->assertEquals(SELECT col_a, col_b FROM test,  $select->__toString());     } }
  110. 110. DbSelect.php <?php DbSelect.php class DbSelect {     protected $_table = table;               public function from($table)     { if (!preg_match(/[0-9a-z]+/i, $table)) {      throw new IllegalNameException(Illegal Table Name); }         $this->_table = $table;         return $this;     }               public function __toString()     {         return SELECT * FROM  . $this->_table;     } }
  111. 111. DbSelect.php <?php class DbSelect {     protected $_table = table;               public function from($table)     { if (!preg_match(/[0-9a-z]+/i, $table)) {      throw new IllegalNameException(Illegal Table Name); }         $this->_table = $table;         return $this;     }      cols     public function cols($cols)     {         $this->_cols = (array) $cols;         return $this;     }       public function __toString()     {         return SELECT * FROM  . $this->_table;     } }
  112. 112. DbSelect.php <?php class DbSelect {     protected $_table = table;      $_cols     protected $_cols = *;          public function from($table)     { if (!preg_match(/[0-9a-z]+/i, $table)) {      throw new IllegalNameException(Illegal Table Name); }         $this->_table = $table;         return $this;     }          public function cols($cols)     {         $this->_cols = (array) $cols;         return $this;     }       public function __toString()     {         return SELECT * FROM  . $this->_table;     } }
  113. 113. DbSelect.php <?php class DbSelect {     protected $_table = table;          protected $_cols = *;          public function from($table)     { if (!preg_match(/[0-9a-z]+/i, $table)) {      throw new IllegalNameException(Illegal Table Name); }         $this->_table = $table;         return $this;     }          public function cols($cols)     {         $this->_cols = (array) $cols;         return $this;     }       public function __toString()     { $_cols         $cols = implode(, , (array) $this->_cols); *         return SELECT  . $cols .  FROM  . $this->_table;     } }
  114. 114. # phpunit tests/library/DbSelectTestPHPUnit 3.5.15 by Sebastian Bergmann..Time: 0 seconds, Memory: 5.25MbOK (2 test, 2 assertions)
  115. 115. bug
  116. 116. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; DbSelectTest.php class DbSelectTest extends PHPUnit_Framework_TestCase {     public function testFrom()     {         $select = new DbSelect();         $select->from(test);         $this->assertEquals(SELECT * FROM test,  $select->__toString());     }          public function testCols()     {         $select = new DbSelect();         $select->from(test)->cols(array(             col_a,             col_b,         ));         $this->assertEquals(SELECT col_a, col_b FROM test,  $select->__toString());     } }
  117. 117. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase {     public function testFrom()     {         $select = new DbSelect();         $select->from(test);         $this->assertEquals(SELECT * FROM test, $select->__toString());     }      new DbSelect()     public function testCols()     {         $select = new DbSelect();         $select->from(test)->cols(array(             col_a,             col_b,         ));         $this->assertEquals(SELECT col_a, col_b FROM test, $select->__toString());     } }
  118. 118. DRYDont Repeat Yourself
  119. 119. Fixture
  120. 120. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase {     public function testFrom()     {         $select->from(test);         $this->assertEquals(SELECT * FROM test, new DbSelect()  $select->__toString());     }          public function testCols()     {         $select->from(test)->cols(array(col_a, col_b));         $this->assertEquals(SELECT col_a, col_b FROM test,   $select->__toString());     }      }
  121. 121. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase { fixture     protected $_select;               public function testFrom()     {         $select->from(test);         $this->assertEquals(SELECT * FROM test, $select->__toString());     }          public function testCols()     {         $select->from(test)->cols(array(col_a, col_b));         $this->assertEquals(SELECT col_a, col_b FROM test,   $select->__toString());     }      }
  122. 122. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase {     protected $_select;          protected function setUp()     { setUp         $this->_select = new DbSelect(); fixture     }          public function testFrom()     {         $select->from(test);         $this->assertEquals(SELECT * FROM test, $select->__toString());     }          public function testCols()     {         $select->from(test)->cols(array(col_a, col_b));         $this->assertEquals(SELECT col_a, col_b FROM test,   $select->__toString());     } }
  123. 123. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase {     protected $_select;          protected function setUp()     {         $this->_select = new DbSelect();     }          public function testFrom()     {         $select->from(test);         $this->assertEquals(SELECT * FROM test,  $select->__toString());     }          public function testCols()     {         $select->from(test)->cols(array(col_a, col_b));         $this->assertEquals(SELECT col_a, col_b FROM test,   $select->__toString());     }          protected function tearDown()     {         $this->_select = null; tearDown     } fixture }
  124. 124. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase {     protected $_select;          protected function setUp()     {         $this->_select = new DbSelect();     }          public function testFrom()     {         $this->_select->from(test);         $this->assertEquals(SELECT * FROM test,  $this->_select->__toString()); $select     } $this->_select          public function testCols()     {         $this->_select->from(test)->cols(array(col_a, col_b));         $this->assertEquals(SELECT col_a, col_b FROM test,   $this->_select->__toString());     }          protected function tearDown()     {         $this->_select = null;     } }
  125. 125. setUp() → testFrom() → tearDown()setUp() → testCols() → tearDown()
  126. 126. # phpunit tests/library/DbSelectTestDbSelectTest PHPUnit 3.5.15 by Sebastian Bergmann. . Time: 0 seconds, Memory: 5.25Mb OK (2 test, 2 assertions)
  127. 127. “Houston, we have a problem.”
  128. 128. DbSelect bug
  129. 129. $select = new DbSelect(); $select->from(table)->where(id = 1);where
  130. 130. $select = new DbSelect();$select->from(table)->where(id = 1);//// SELECT * FROM table WHERE id = 1
  131. 131. $select = new DbSelect();$select->from(table WHERE id = 1);//// SELECT * FROM table WHERE id = 1
  132. 132. Bug
  133. 133. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; DbSelectTest.php class DbSelectTest extends PHPUnit_Framework_TestCase {     // ... ... }
  134. 134. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase {     // ... ...     public function testIllegalTableName()     {         try {             $this->_select->from(test WHERE id = 1);         }         catch (IllegalNameException $e) {             throw $e;         }     } }
  135. 135. DbSelectTest.php <?php require_once dirname(dirname(__DIR__)) . /library/DbSelect.php; class DbSelectTest extends PHPUnit_Framework_TestCase {     // ... ...     /** PHPUnit      * @expectedException IllegalNameException@expectedException      */ annotation     public function testIllegalTableName()     {         try {             $this->_select->from(test WHERE id = 1);         }         catch (IllegalNameException $e) {             throw $e;         }     } }
  136. 136. # phpunit tests/library/DbSelectTest PHPUnit 3.5.15 by Sebastian Bergmann. .F. Time: 0 seconds, Memory: 6.00Mb There was 1 failure: 1) DbSelectTest::testIllegalTableNameIllegalNameException Expected exception IllegalNameException FAILURES! Tests: 3, Assertions: 3, Failures: 1.
  137. 137. DbSelectTest.php <?php DbSelect.php class DbSelect {     // ... ...     public function from($table)     { if (!preg_match(/[0-9a-z]+/i, $table)) {      throw new Exception(Illegal Table Name:  . $table); }         $this->_table = $table;         return $this;     }     // ... ... }
  138. 138. DbSelectTest.php <?php class DbSelect {     // ... ...     public function from($table)     { if (!preg_match(/[0-9a-z]+/i, $table)) {      throw new Exception(Illegal Table Name:  . $table); }         $this->_table = $table;         return $this;     }     // ... ... }
  139. 139. DbSelectTest.php <?php class DbSelect {     // ... ...     public function from($table)     { ^ $ if (!preg_match(/^[0-9a-z]+$/i, $table)) {      throw new Exception(Illegal Table Name:  . $table); }         $this->_table = $table;         return $this;     }     // ... ... }
  140. 140. # phpunit tests/library/DbSelectTestPHPUnit 3.5.15 by Sebastian Bergmann....Time: 1 second, Memory: 5.50MbOK (3 tests, 3 assertions)
  141. 141. bug
  142. 142. Test Suite
  143. 143. tests phpunit tests
  144. 144. phpunit.xml
  145. 145. project ├── application ├── library └── testsphpunit.xml tests └── phpunit.xml
  146. 146. phpunit.xml <phpunit> root tag phpunit </phpunit>
  147. 147. phpunit.xml <phpunit colors=”true”> root tag </phpunit>
  148. 148. phpunit.xml <phpunit colors=”true”> test suites <testsuite name="Application Test Suite"> <directory>./application</directory> </testsuite> <testsuite name="Library Test Suite"> <directory>./library</directory> </testsuite> </phpunit>
  149. 149. phpunit.xml # phpunit -c tests/phpunit.xml PHPUnit 3.5.15 by Sebastian Bergmann. .... Time: 0 seconds, Memory: 6.00Mb colors=”true” OK (4 tests, 4 assertions)
  150. 150. phpunit.xml <phpunit colors=”true” bootstrap=”./bootstrap.php”> <testsuite name="Application Test Suite"> PHP <directory>./application</directory> </testsuite> <testsuite name="Library Test Suite"> <directory>./library</directory> </testsuite> </phpunit>
  151. 151. bootstrap.php <?php define(PROJECT_PATH, realpath(dirname(__DIR__))); set_include_path(implode(PATH_SEPARATOR, array(     realpath(PROJECT_PATH . /library),     realpath(PROJECT_PATH . /application),     get_include_path() ))); function autoload($className) {     $className = str_replace(_, /, $className);     require_once "$className.php"; } spl_autoload_register(autoload);
  152. 152. phpunit.xml http://goo.gl/tvmq4
  153. 153. Slides

×