框架篇:6.简单测试

PHP DIY系列–一起手写一个api框架


虽然框架基本完成,但我们还没有测试过。

我们使用postman作为接口测试工具(http://saif.com/test)。

// 自定义路由
return [
    'debug' => false,
    'route' => [
        '' => 'demo/welcome',
        'test' => 'demo/test',
    ],
];



class DemoController extends Controller
{
    public function welcome($params)
    {
        return $this->response->json(['hello' => 'welcome']);
    }

    public function test($params)
    {
        return $this->response->json($params);
    }
}

postman

我们测试下:

image
image
image

我们发现能正常获取获取GET参数,但没有获取到POST参数。

debug:

我们发现Content-Type输出是:

multipart/form-data; boundary=--------------------------498010462598077868347660

我们优化一下代码:

public function getBodyParams()
{
    $contentType = strtolower($this->getHeader('Content-Type'));
        // p($contentType);
    if (strpos($contentType, 'multipart/form-data') === false) {
        $this->_bodyParams = \json_decode(file_get_contents("php://input"), true);
    } else {
        $this->_bodyParams = $_POST;
    }
        
    return $this->_bodyParams?? [];
}

另外我们发现getHeader方法有点问题:

public function getHeader($name, $defaultValue = null)
{
    $name = ucfirst($name);
    if (function_exists('apache_request_headers')) {
        $headers = apache_request_headers();
        p($headers);
        return $headers[$name]?? $defaultValue;
    }
    // $_SERVER使用下划线
    $name = strtoupper(str_replace('-', '_', $name));
    // 部分自定义参数需要加上HTTP_
    return $_SERVER[$name]?? ($_SERVER['HTTP_'.$name] ?? $defaultValue);
}

image

测试正常。

另外,做一下说明,我们可以使用public function test($params),是源于我们Request,将参数注入到方法里。

public function runAction($route)
{
    ... 省略代码

    return $controller->$action(array_merge($this->getQueryParams(), $this->getBodyParams()));
}

性能测试

我们使用的是wrk压测

wrk

> git clone https://github.com/wg/wrk
> cd wrk 
> make
> ln -s ./wrk /usr/bin/wrk
wrk参数:

-c,    --connections(连接数):      total number of HTTP connections to keep open with each thread handling N = connections/threads
-d,    --duration(测试持续时间):     duration of the test, e.g. 2s, 2m, 2h
-t,    --threads(线程):            total number of threads to use
-s,    --script(脚本):             LuaJIT script, see SCRIPTING
-H,    --header(头信息):           HTTP header to add to request, e.g. "User-Agent: wrk"
       --latency(响应信息):         print detailed latency statistics
       --timeout(超时时间):         record a timeout if a response is not received within this amount of time.
-v,    --version(版本信息)          Print version details

我们仅仅在控制返回空信息,然后对比yii2(返回字符串“yii2”),laravel5.5(返回字符串“laravel5.5”)。

image

image

因为我们的框架没有中间件、组件之类的,所以性能对比yii2、laravel,QPS要高很多。


框架篇:6.简单测试
https://blog.puresai.com/2020/02/13/phpframe09/
作者
puresai
许可协议