单元测试(Unit testing)

适当的测试有帮于更好的编写软件。如果你设置了适当的测试用例,可以消除大多数功能性的错误,并且更好地维护你的软件。

整合 PHPunit 到 phalcon(Integrating PHPunit with phalcon)

如果你还没有安装好 phpunit,可以使用以下 composer 命令:

  1. composer require phpunit/phpunit:^5.0

或者手动添加 composer.json:

  1. {
  2. "require-dev": {
  3. "phpunit/phpunit": "^5.0"
  4. }
  5. }

phpunit 安装后将会在你的根目录创建一个名为 ‘tests’ 的目录:

  1. app/
  2. public/
  3. tests/

接下来,我们需要用一个 ‘helper’ 文件来引导单元测试程序。

PHPunit 辅助文件(The PHPunit helper file)

需要使用 helper 文件来引导运行测试程序。我们预先准备好一个示例文件,将该文件放到 tests/ 目录下并命名为 TestHelper.php

  1. <?php
  2. use Phalcon\Di;
  3. use Phalcon\Di\FactoryDefault;
  4. use Phalcon\Loader;
  5. ini_set("display_errors", 1);
  6. error_reporting(E_ALL);
  7. define("ROOT_PATH", __DIR__);
  8. set_include_path(
  9. ROOT_PATH . PATH_SEPARATOR . get_include_path()
  10. );
  11. // Required for phalcon/incubator
  12. include __DIR__ . "/../vendor/autoload.php";
  13. // Use the application autoloader to autoload the classes
  14. // Autoload the dependencies found in composer
  15. $loader = new Loader();
  16. $loader->registerDirs(
  17. [
  18. ROOT_PATH,
  19. ]
  20. );
  21. $loader->register();
  22. $di = new FactoryDefault();
  23. Di::reset();
  24. // Add any needed services to the DI here
  25. Di::setDefault($di);

你需要从自己的 library 类库中测试组件,将它们添加到 autoloader 加载器或在主程序中使用 autoloader 加载器。

为了更好地帮助你构建单元测试,我们写了一些抽象的类库,你可以使用这些抽象类来引导单元测试。 这些文件在 @ https://github.com/phalcon/incubator.

你可以添加 incubator 依赖库:

  1. composer require phalcon/incubator

或手动添加到 composer.json:

  1. {
  2. "require": {
  3. "phalcon/incubator": "^3.0"
  4. }
  5. }

你也可以使用链接克隆仓库。

PHPunit.xml 文件(PHPunit.xml file)

现在,创建一个 phpunit 文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <phpunit bootstrap="./TestHelper.php"
  3. backupGlobals="false"
  4. backupStaticAttributes="false"
  5. verbose="true"
  6. colors="false"
  7. convertErrorsToExceptions="true"
  8. convertNoticesToExceptions="true"
  9. convertWarningsToExceptions="true"
  10. processIsolation="false"
  11. stopOnFailure="false"
  12. syntaxCheck="true">
  13. <testsuite name="Phalcon - Testsuite">
  14. <directory>./</directory>
  15. </testsuite>
  16. </phpunit>

按照你的需求修改 phpunit.xml 然后保存到 tests/ 目录。

你将在 tests/ 目录运行所有测试。

简单的单元测试(Sample unit test)

要运行任何单元测试,你要事先定义好。autoloader 加载器将确保正确的文件被加载进来,所以你需要做的是创建文件然后 phpunit 运行测试。

该示例不包含配置文件,但大多数测试用例都需要配置文件,你可以将它添加到 DI 得到 UnitTestCase 文件。

首先在 /tests 目录创建一个 UnitTestCase.php 基本单元测试:

  1. <?php
  2. use Phalcon\Di;
  3. use Phalcon\Test\UnitTestCase as PhalconTestCase;
  4. abstract class UnitTestCase extends PhalconTestCase
  5. {
  6. /**
  7. * @var bool
  8. */
  9. private $_loaded = false;
  10. public function setUp()
  11. {
  12. parent::setUp();
  13. // Load any additional services that might be required during testing
  14. $di = Di::getDefault();
  15. // Get any DI components here. If you have a config, be sure to pass it to the parent
  16. $this->setDi($di);
  17. $this->_loaded = true;
  18. }
  19. /**
  20. * Check if the test case is setup properly
  21. *
  22. * @throws \PHPUnit_Framework_IncompleteTestError;
  23. */
  24. public function __destruct()
  25. {
  26. if (!$this->_loaded) {
  27. throw new \PHPUnit_Framework_IncompleteTestError(
  28. "Please run parent::setUp()."
  29. );
  30. }
  31. }
  32. }

独立命名空间的单元测试是一个很好的主意,对于这个测试创建命名空间 ‘Test’,即创建一个文件名为 testsTestUnitTest.php:

  1. <?php
  2. namespace Test;
  3. /**
  4. * Class UnitTest
  5. */
  6. class UnitTest extends \UnitTestCase
  7. {
  8. public function testTestCase()
  9. {
  10. $this->assertEquals(
  11. "works",
  12. "works",
  13. "This is OK"
  14. );
  15. $this->assertEquals(
  16. "works",
  17. "works1",
  18. "This will fail"
  19. );
  20. }
  21. }

你现在可以在命令行 tests 目录执行 ‘phpunit’ 得到以下输出:

  1. $ phpunit
  2. PHPUnit 3.7.23 by Sebastian Bergmann.
  3. Configuration read from /private/var/www/tests/phpunit.xml
  4. Time: 3 ms, Memory: 3.25Mb
  5. There was 1 failure:
  6. 1) Test\UnitTest::testTestCase
  7. This will fail
  8. Failed asserting that two strings are equal.
  9. --- Expected
  10. +++ Actual
  11. @@ @@
  12. -'works'
  13. +'works1'
  14. /private/var/www/tests/Test/UnitTest.php:25
  15. FAILURES!
  16. Tests: 1, Assertions: 2, Failures: 1.

现在,你可以开始构建单元测试了。你可以在这里查看一份很好的指南(如果你不熟悉PHPUnit,我们也推荐阅读PHPUnit文档)

http://blog.stevensanderson.com/2009/08/24/writing-great-unit-tests-best-and-worst-practises/