×
PhalApi 2.x 前言

PhalApi 2.x 快速开发

1.1 下载与安装1.2 运行Hello World1.3 如何请求接口服务1.4 接口响应与在线调试1.5 Api接口层1.6 Domain领域层和ADM模式1.7 Model数据层与数据库操作1.8 单元测试1.9 自动加载和PSR-41.10 接口文档

PhalApi 2.x 数据库

2.1 数据库链接2.2 数据库与NotORM2.3 数据库使用和查询2.4 数据库分库分表策略2.5 连接多个数据库2.6 打印和保存SQL语句2.7 定制你的Model基类

PhalApi 2.x 高级专题

3.1 PhalApi 2.x 接口参数3.2 PhalApi 2.x 配置3.3 PhalApi 2.x 日志3.4 PhalApi 2.x 缓存3.5 PhalApi 2.x 过滤器3.6 PhalApi 2.x COOKIE3.7 PhalApi 2.x 加密3.8 PhalApi 2.x 国际化3.9 PhalApi 2.x CURL请求3.10 PhalApi 2.x 工具和杂项3.11 PhalApi 2.x DI服务汇总

PhalApi 2.x 发现更多

4.1 PhalApi 2.x 扩展类库4.2 PhalApi 2.x SDK包的使用4.3 PhalApi 2.x 脚本命令

关于PhalApi 2.x

5.1 PhalApi 2.x 版本完美诠释5.2 PhalApi 2.x 升级指南5.3 PhalApi 2.x VS PhalApi 1.x

1.8 PhalApi 2.x 单元测试


测试驱动开发与PHPUnit

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

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

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

定义接口服务的函数签名

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

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

<?php
namespace AppApi;

use PhalApiApi;

/**
 * 评论服务
 */
class Comment extends Api {

    public function getRules() {
        return array(
            'get' => array(
                'id' => array('name' => 'id', 'type' => 'int', 'require' => true, 'min' => 1, 'desc' => '评论ID'),
            ),
        );
    }

    /**
     * 获取评论
     * @desc 根据评论ID获取对应的评论信息
     * @return int      id      评论ID,不存在时不返回
     * @return string   content 评论内容,不存在时不返回
     */
    public function get() {

    }
}

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

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

phalapi-buildtest自动生成测试代码

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

生成的命令是:

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,可以看到类似以下代码:

class PhpUnderControl_AppApiComment_Test extends PHPUnit_Framework_TestCase
{
    public $appApiComment;

    protected function setUp()
    {
        parent::setUp();

        $this->appApiComment = new AppApiComment();
    }

    protected function tearDown()
    {
        // 输出本次单元测试所执行的SQL语句
        // var_dump(DI()->tracer->getSqls());

        // 输出本次单元测试所涉及的追踪埋点
        // var_dump(DI()->tracer->getSqls());
    }

    /**
     * @group testGet
     */
    public function testGet()
    {
        $rs = $this->appApiComment->get();

        $this->assertTrue(is_int($rs));

    }
}

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

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

完善单元测试用例

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

class PhpUnderControl_AppApiComment_Test extends PHPUnit_Framework_TestCase
{
    public function testGet()
    {
        // Step 1. 构造
        $url = 's=Comment.Get';
        $params = array('id' => 1);

        // Step 2. 操作
        $rs = PhalApiHelperTestRunner::go($url, $params);

        // Step 3. 检验
        $this->assertEquals(1, $rs['id']);
        $this->assertArrayHasKey('content', $rs);
    }
}

执行单元测试

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

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

会看到类似这样的输出:


PHPUnit 4.3.4 by Sebastian Bergmann.

.F

Time: 39 ms, Memory: 8.00Mb

There was 1 failure:

1) PhpUnderControl_AppApiComment_Test::testGet
Failed asserting that false is true.

/path/to/phalapi/tests/app/Api/Comment_Test.php:53

FAILURES!
Tests: 2, Assertions: 1, Failures: 1.

实现接口服务

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

<?php
namespace AppApi;

use PhalApiApi;

class Comment extends Api {

    public function get() {
        return array('id' => 1, 'content' => '这是一条模拟的评论');
    }
}

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

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


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)