使用PHPUnit进行单元测试

在开发过程中使用单元测试有助于程序的调试。但是如果像TDD、BDD那样对于每个功能点都要写测试用例又太过于极端了。DHH 说了,TDD 已死。不过对于该测试的还是得测。

首先下载PHPUnit工具: https://phar.phpunit.de/phpunit.phar

PHPUnit对应的配置文件为app/phpunit.xml.dist,这是个以.dist能结尾的文件,可能需要将其复制一份到app/phpunit.xml。它配置了一些测试参数,其内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- http://phpunit.de/manual/4.1/en/appendixes.configuration.html -->
  3. <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd"
  5. backupGlobals="false"
  6. colors="true"
  7. bootstrap="bootstrap.php.cache"
  8. >
  9. <testsuites>
  10. <testsuite name="Project Test Suite">
  11. <directory>../src/*/*Bundle/Tests</directory>
  12. <directory>../src/*/Bundle/*Bundle/Tests</directory>
  13. </testsuite>
  14. </testsuites>
  15. <!--
  16. <php>
  17. <server name="KERNEL_DIR" value="/path/to/your/app/" />
  18. </php>
  19. -->
  20. <filter>
  21. <whitelist>
  22. <directory>../src</directory>
  23. <exclude>
  24. <directory>../src/*/*Bundle/Resources</directory>
  25. <directory>../src/*/*Bundle/Tests</directory>
  26. <directory>../src/*/Bundle/*Bundle/Resources</directory>
  27. <directory>../src/*/Bundle/*Bundle/Tests</directory>
  28. </exclude>
  29. </whitelist>
  30. </filter>
  31. </phpunit>

单元测试的目的是独立测试应用程序的个别单元。因此建议单元测试的文件目录结构应与应用程序的一致。例如要测试src/Blogger/BlogBundle/Controller/PageController.phpPageController.php控制器,那么对应的测试文件为src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php。如下是目录结构示例:

  1. src/Blogger/BlogBundle/
  2. Entity/
  3. Blog.php
  4. Comment.php
  5. Controller/
  6. PageController.php
  7. Twig/
  8. Extensions/
  9. BloggerBlogExtension.php
  10. Tests/
  11. Entity/
  12. BlogTest.php
  13. CommentTest.php
  14. Controller/
  15. PageControllerTest.php
  16. Twig/
  17. Extensions/
  18. loggerBlogExtensionTest.php

现在我们对PageCotrollerindex方法进行测试,编写测试用例:

  1. // src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php
  2. class PageControllerTest extends WebTestCase
  3. {
  4. /**
  5. * test index page.
  6. */
  7. public function testIndex()
  8. {
  9. $client = static::createClient();
  10. $crawler = $client->request('GET', '/');
  11. $this->assertTrue($crawler->filter('title:contains("symblog")')->count() > 0);
  12. }
  13. }

然后执行单元测试:

  1. $ phpunit -c app src/Blogger/BlogBundle/Tests/Controller/PageControllerTest.php

这样就可以在代码改动之后通过单元测试来检查当前有没有错误。

关于PHPUnit的使用可以参考它的文档: https://phpunit.de/documentation.html