1.8 PhalApi 2.x 單元測(cè)試

2018-07-28 21:23 更新

PhalApi 2.x 單元測(cè)試

測(cè)試驅(qū)動(dòng)開(kāi)發(fā)與PHPUnit

PhalApi推薦使用測(cè)試驅(qū)動(dòng)開(kāi)發(fā)最佳實(shí)踐,并主要使用的是PHPUnit進(jìn)行單元測(cè)試。

PHPUnit官網(wǎng):https://phpunit.de,如需進(jìn)行單元測(cè)試,請(qǐng)先安裝PHPUnit。

以下是在PhalApi下簡(jiǎn)化后TDD步驟。

定義接口服務(wù)的函數(shù)簽名

當(dāng)新增一個(gè)接口服務(wù)時(shí),可先定義好接口服務(wù)的函數(shù)簽名,通俗來(lái)說(shuō),即確定類名和方法名,以及輸入、輸出參數(shù)、接口服務(wù)的名稱與描述等。

例如,對(duì)于獲取評(píng)論的接口服務(wù),可以這樣定義。

<?php
namespace App\Api;


use PhalApi\Api;


/**
 * 評(píng)論服務(wù)
 */
class Comment extends Api {


    public function getRules() {
        return array(
            'get' => array(
                'id' => array('name' => 'id', 'type' => 'int', 'require' => true, 'min' => 1, 'desc' => '評(píng)論ID'),
            ),
        );
    }


    /**
     * 獲取評(píng)論
     * @desc 根據(jù)評(píng)論ID獲取對(duì)應(yīng)的評(píng)論信息
     * @return int      id      評(píng)論ID,不存在時(shí)不返回
     * @return string   content 評(píng)論內(nèi)容,不存在時(shí)不返回
     */
    public function get() {


    }
}

通過(guò)在線接口詳情文檔,可以看到對(duì)應(yīng)生成的接口文檔內(nèi)容。

這樣就完成了我們偉大的第一步,是不是很簡(jiǎn)單,很有趣?

phalapi-buildtest自動(dòng)生成測(cè)試代碼

接下來(lái)是為新增的接口類編寫(xiě)對(duì)應(yīng)的單元測(cè)試。單元測(cè)試的代碼,可以手動(dòng)編寫(xiě),也可以使用phalapi-buildtest腳本命令自動(dòng)生成。

生成的命令是:

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

保存的測(cè)試文件,統(tǒng)一放在tests目錄下,保持與產(chǎn)品代碼結(jié)構(gòu)平行,并以“_Test.php”為后綴。

查看生成的單元測(cè)試代碼文件./tests/app/Api/Comment_Test.php,可以看到類似以下代碼:

class PhpUnderControl_AppApiComment_Test extends \PHPUnit_Framework_TestCase
{
    public $appApiComment;


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


        $this->appApiComment = new App\Api\Comment();
    }


    protected function tearDown()
    {
        // 輸出本次單元測(cè)試所執(zhí)行的SQL語(yǔ)句
        // var_dump(DI()->tracer->getSqls());


        // 輸出本次單元測(cè)試所涉及的追蹤埋點(diǎn)
        // var_dump(DI()->tracer->getSqls());
    }


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


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


    }
}

生成的骨架只是初步的代碼,還需要手動(dòng)調(diào)整一下才能最終正常運(yùn)行。例如需要調(diào)整bootstrap.php的文件引入路徑。

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

完善單元測(cè)試用例

最為重要的是,應(yīng)該根據(jù)構(gòu)造-操作-檢驗(yàn)(BUILD-OPERATE-CHECK)模式編寫(xiě)測(cè)試用例。對(duì)于Api接口層,還需要依賴[]()進(jìn)行模擬請(qǐng)求。例如這里的:

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


        // Step 2. 操作
        $rs = PhalApi\Helper\TestRunner::go($url, $params);

        
        // Step 3. 檢驗(yàn)
        $this->assertEquals(1, $rs['id']);
        $this->assertArrayHasKey('content', $rs);
    }
}

執(zhí)行單元測(cè)試

使用phpunit,可以執(zhí)行剛生成的測(cè)試文件。執(zhí)行:

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

會(huì)看到類似這樣的輸出:



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.

實(shí)現(xiàn)接口服務(wù)

在單元測(cè)試驅(qū)動(dòng)的引導(dǎo)下,完成接口服務(wù)的具體功能,例如這里簡(jiǎn)單地返回:

<?php
namespace App\Api;


use PhalApi\Api;


class Comment extends Api {


    public function get() {
        return array('id' => 1, 'content' => '這是一條模擬的評(píng)論');
    }
}

再次執(zhí)行單元測(cè)試,便可通過(guò)了。

溫馨提示:以上示例代碼可從這里查看。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)