系列文章---框架篇:6.简单测试


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 自定义路由
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

我们优化一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
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方法有点问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
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,将参数注入到方法里。

1
2
3
4
5
6
public function runAction($route)
{
... 省略代码

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

性能测试

我们使用的是wrk压测

wrk

1
2
3
4
> git clone https://github.com/wg/wrk
> cd wrk
> make
> ln -s ./wrk /usr/bin/wrk
1
2
3
4
5
6
7
8
9
10
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要高很多。