PhalApi 2.x 单元测试

测试驱动开发与PHPUnit

PhalApi推荐使用测试驱动开发最佳实践,并主要使用的是PHPUnit进行单元测试。

PHPUnit官网:https://phpunit.de,如需进行单元测试,请先安装PHPUnit。

以下是在PhalApi下简化后TDD步骤。

定义接口服务的函数签名

当新增一个接口服务时,可先定义好接口服务的函数签名,通俗来说,即确定类名和方法名,以及输入、输出参数、接口服务的名称与描述等。

例如,对于获取评论的接口服务,可以这样定义。

  1. <?php
  2. namespace App\Api;
  3. use PhalApi\Api;
  4. /**
  5. * 评论服务
  6. */
  7. class Comment extends Api {
  8. public function getRules() {
  9. return array(
  10. 'get' => array(
  11. 'id' => array('name' => 'id', 'type' => 'int', 'require' => true, 'min' => 1, 'desc' => '评论ID'),
  12. ),
  13. );
  14. }
  15. /**
  16. * 获取评论
  17. * @desc 根据评论ID获取对应的评论信息
  18. * @return int id 评论ID,不存在时不返回
  19. * @return string content 评论内容,不存在时不返回
  20. */
  21. public function get() {
  22. }
  23. }

通过在线接口详情文档,可以看到对应生成的接口文档内容。

1.8 单元测试 - 图1

这样就完成了我们伟大的第一步,是不是很简单,很有趣?

phalapi-buildtest自动生成测试代码

接下来是为新增的接口类编写对应的单元测试。单元测试的代码,可以手动编写,也可以使用phalapi-buildtest脚本命令自动生成。

生成的命令是:

  1. phalapi$ ./bin/phalapi-buildtest ./src/app/Api/Comment.php App\\Api\\Comment > ./tests/app/Api/Comment_Test.php

保存的测试文件,统一放在tests目录下,保持与产品代码结构平行,并以“_Test.php”为后缀。

查看生成的单元测试代码文件./tests/app/Api/Comment_Test.php,可以看到类似以下代码:

  1. class PhpUnderControl_AppApiComment_Test extends \PHPUnit_Framework_TestCase
  2. {
  3. public $appApiComment;
  4. protected function setUp()
  5. {
  6. parent::setUp();
  7. $this->appApiComment = new App\Api\Comment();
  8. }
  9. protected function tearDown()
  10. {
  11. // 输出本次单元测试所执行的SQL语句
  12. // var_dump(DI()->tracer->getSqls());
  13. // 输出本次单元测试所涉及的追踪埋点
  14. // var_dump(DI()->tracer->getSqls());
  15. }
  16. /**
  17. * @group testGet
  18. */
  19. public function testGet()
  20. {
  21. $rs = $this->appApiComment->get();
  22. $this->assertTrue(is_int($rs));
  23. }
  24. }

生成的骨架只是初步的代码,还需要手动调整一下才能最终正常运行。例如需要调整bootstrap.php的文件引入路径。

  1. require_once dirname(__FILE__) . '/../../bootstrap.php';

完善单元测试用例

最为重要的是,应该根据构造-操作-检验(BUILD-OPERATE-CHECK)模式编写测试用例。对于Api接口层,还需要依赖进行模拟请求。例如这里的:

  1. class PhpUnderControl_AppApiComment_Test extends \PHPUnit_Framework_TestCase
  2. {
  3. public function testGet()
  4. {
  5. // Step 1. 构造
  6. $url = 's=Comment.Get';
  7. $params = array('id' => 1);
  8. // Step 2. 操作
  9. $rs = PhalApi\Helper\TestRunner::go($url, $params);
  10. // Step 3. 检验
  11. $this->assertEquals(1, $rs['id']);
  12. $this->assertArrayHasKey('content', $rs);
  13. }
  14. }

执行单元测试

使用phpunit,可以执行刚生成的测试文件。执行:

  1. phalapi$ phpunit ./tests/app/Api/Comment_Test.php

会看到类似这样的输出:

  1. PHPUnit 4.3.4 by Sebastian Bergmann.
  2. .F
  3. Time: 39 ms, Memory: 8.00Mb
  4. There was 1 failure:
  5. 1) PhpUnderControl_AppApiComment_Test::testGet
  6. Failed asserting that false is true.
  7. /path/to/phalapi/tests/app/Api/Comment_Test.php:53
  8. FAILURES!
  9. Tests: 2, Assertions: 1, Failures: 1.

实现接口服务

在单元测试驱动的引导下,完成接口服务的具体功能,例如这里简单地返回:

  1. <?php
  2. namespace App\Api;
  3. use PhalApi\Api;
  4. class Comment extends Api {
  5. public function get() {
  6. return array('id' => 1, 'content' => '这是一条模拟的评论');
  7. }
  8. }

再次执行单元测试,便可通过了。

温馨提示:以上示例代码可从这里查看。


Last modified 05/31 21:06 memo Edit Document © 2015-2018 PhalApi All Rights Reserved. 粤ICP备15028808号

原文: http://docs.phalapi.net/#/v2.0/unit-test