PhpUnit 接口API單元測試

一,安裝PhpUnit

1.下載phpunit:點擊進入

2.配置phpunit:

1)添加環境變量

右鍵 我的電腦 ,選擇 屬性 。點擊左側的 高級系統設置 。此時彈出 系統屬性 ,選擇 高級 選項卡,點擊右下角的 環境變量 。 在用戶變量裏面,雙擊 PATH ,在 變量值 後面添加 ;D:\repository\CourseManagement\mobile_api_test (注意最前面的分號,路徑填存放phpunit.phar的路徑)。配置這個是爲了在任意位置都能使用PHPUnit,不配置的話,需要在phpunit.phar的路徑下才能使用PHPUnit。

2)配置:

進入存放phpunit.phar的路徑,命令窗口運行

echo @php "%~dp0phpunit.phar" %* > phpunit.cmd

二,項目目錄文件

1.API請求類

目錄:./lib/CurlClient.php

<?php
/**
 * 封裝curl的http客戶端操作類
 */
class CurlClient {
    /**
     * 執行get請求
     *
     * @access public
     * @param string $url 遠程地址
     * @param string $cookie cookie
     * @param array $options curl配置
     * @param integer $time_out 讀取數據超時時間
     * @param integer $con_timeout 連接超時時間
     * @return array
     */
    public function get($url,$cookie="", array $options=array(), $time_out=30, $con_timeout=20) {

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $con_timeout);
        curl_setopt($ch, CURLOPT_TIMEOUT, $time_out);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_COOKIE, $cookie);

        foreach ($options as $key => $val) {
            curl_setopt($ch, $key, $val);
        }
        unset($val);

        // 執行遠程請求,並清除utf8的bom輸出
        $content = $this -> remove_utf8_bom(curl_exec($ch));
        // 執行之後才能獲取狀態碼
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if($httpcode != 200){
            die("網絡錯誤");
        }

        return $content;
    }

    /**
     * 執行post請求
     *
     * @access public
     * @param string $url 遠程地址
     * @param mixed $data 數據集合
     * @param string $cookie cookie
     * @param array $options curl配置
     * @param integer $timeout 讀取數據超時時間
     * @param integer $con_timeout 連接超時時間
     * @return string
     */
    public function post($url, $data=null,$cookie="",$is_show_header=0, array $options=array(), $timeout=30, $con_timeout=20) {

        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_HEADER, $is_show_header);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $con_timeout);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_COOKIE, $cookie);

        !empty($data) and curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

        foreach ($options as $key => $val) {
            curl_setopt($ch, $key, $val);
        }
        unset($val);

        // 執行遠程請求,並清除utf8的bom輸出
        $ch_res = curl_exec($ch);
        if($is_show_header){
            $content  = $this -> get_cookie($ch_res);
        }else{
            $content  = $this -> remove_utf8_bom($ch_res);
        }
        //執行之後才能獲取狀態碼
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($httpcode != 200){
            die("網絡錯誤");
        }
        curl_close($ch);

        return $content;
    }

    /**
     * 清除utf-8的bom頭
     *
     * @access public
     * @param string $text 字符串
     * @return string
     */
    private function remove_utf8_bom($text) {
        $bom = pack('H*', 'EFBBBF');
        $text = preg_replace("/^{$bom}+?/", '', $text);

        return $text;
    }
    private function get_cookie($text){
        list($header, $body) = explode("\r\n\r\n", $text);
        preg_match("/set\-cookie:([^\r\n]*)/i", $header, $matches);
        $cookie = explode(';', $matches[1])[0];
        return $cookie;
    }
}

/* End of this file */

2.基礎配置類:配置域名,引用請求類

目錄:./project/config.php

<?php
require_once(dirname(__FILE__)."/../lib/CurlClient.php");
define("PREFIX", "http://localhost.insure.qy.com");

3.API單元測試類:

目錄:./project/TestAPI.php

<?php
require_once(dirname(__FILE__) . '/config.php');
use PHPUnit\Framework\TestCase;

class TestAPI extends TestCase
{
    /** 測試登錄,並保持cookie */
    public function testLogin()
    {
        $param = array(
            "ajax_act"=>"login",
            'data' => '{"acct":"admin","password":"adminpass","code":"","cache_acct":1}'
        );
        $url = '/index.php?m=login';
        $cookie = $this->get_post_cookie($url, $param);
        file_put_contents("./cookie.txt",$cookie);
        $this->assertEquals(1, 1);

    }
    /** 100 保存表單 */
    public function testForm100()
    {
        $param = array(
            'data' => '{"title_item":"input157846865167924"}'
        );
        $url = '/index.php?model=form&m=ajax&cmd=100';
        $this->call_post($url, $param);
    }
    /** 101 獲取表單列表 */
    public function testForm101()
    {
        $param = array();
        $url = '/index.php?model=form&m=ajax&cmd=101';
        $this->call_post($url, $param);
    }

    private function call_get($path, $param, $expect = '0')
    {
        $curl = new CurlClient();
        $url = PREFIX . "$path?" . http_build_query($param);
        $buf = $curl->get($url);
        $obj = json_decode($buf, True);
        $this->assertEquals($obj['errcode'], $expect);
        return $obj;
    }

    private function call_post($path, $param, $expect = '0')
    {
        $curl = new CurlClient();
        $url = PREFIX . $path ;
        $cookie = file_get_contents("./cookie.txt");
        $buf = $curl->post($url,$param,$cookie);
        $obj = json_decode($buf, True);
        if($obj['errcode'] != 0) {
            print_r([
                "url"=>$url,
                "obj"=>$obj
            ]);
            die;
        }
        $this->assertEquals($obj['errcode'], $expect);
        return [$obj,$cookie];
    }
    private function get_post_cookie($path, $param)
    {
        $curl = new CurlClient();
        $url = PREFIX . $path ;
        $cookie = $curl->post($url,$param,"",1);
        return $cookie;
    }
}

三,測試運行

phpunit TestFormApi.php

四,正常結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章