本文将介绍Guzzle
,Guzzle
在单元测试中的使用。
来自Guzzle
中文文档的解释:
Guzzle是一个PHP的HTTP客户端,用来轻而易举地发送请求,并集成到我们的WEB服务上。
- 接口简单:构建查询语句、POST请求、分流上传下载大文件、使用HTTP cookies、上传JSON数据等等。
- 发送同步或异步的请求均使用相同的接口。
- 使用PSR-7接口来请求、响应、分流,允许你使用其他兼容的PSR-7类库与Guzzle共同开发。
- 抽象了底层的HTTP传输,允许你改变环境以及其他的代码,如:对cURL与PHP的流或socket并非重度依赖,非阻塞事件循环。
- 中间件系统允许你创建构成客户端行为。
$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://api.github.com/user', [
'auth' => ['user', 'pass']
]);
echo $res->getStatusCode();
// "200"
echo $res->getHeader('content-type');
// 'application/json; charset=utf8'
echo $res->getBody();
// {"type":"User"...'
// 发送一个异步请求
$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
$promise = $client->sendAsync($request)->then(function ($response) {
echo 'I completed! ' . $response->getBody();
});
$promise->wait();
安装Guzzle
使用composer
安装
php composer.phar require guzzlehttp/guzzle:~6.0
或者编辑项目的composer.json
文件,添加Guzzle作为依赖
{
"require": {
"guzzlehttp/guzzle": "~6.0"
}
}
执行 composer update
Guzzle基本使用
- 发送请求
use GuzzleHttp\Client;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'http://httpbin.org',
// You can set any number of default request options.
'timeout' => 2.0,
]);
$response = $client->get('http://httpbin.org/get');
$response = $client->delete('http://httpbin.org/delete');
$response = $client->head('http://httpbin.org/get');
$response = $client->options('http://httpbin.org/get');
$response = $client->patch('http://httpbin.org/patch');
$response = $client->post('http://httpbin.org/post');
$response = $client->put('http://httpbin.org/put');
- 设置查询字符串
$response = $client->request('GET', 'http://httpbin.org?foo=bar');
或使用 query
请求参数来声明查询字符串参数:
$client->request('GET', 'http://httpbin.org', [
'query' => ['foo' => 'bar']
]);
- 设置POST表单
传入 form_params
数组参数
$response = $client->request('POST', 'http://httpbin.org/post', [
'form_params' => [
'field_name' => 'abc',
'other_field' => '123',
'nested_field' => [
'nested' => 'hello'
]
]
]);
- 使用响应
# 状态码
$code = $response->getStatusCode(); // 200
$reason = $response->getReasonPhrase(); // OK
# header
// Check if a header exists.
if ($response->hasHeader('Content-Length')) {
echo "It exists";
}
// Get a header from the response.
echo $response->getHeader('Content-Length');
// Get all of the response headers.
foreach ($response->getHeaders() as $name => $values) {
echo $name . ': ' . implode(', ', $values) . "\r\n";
}
# 响应体
$body = $response->getBody();
// Implicitly cast the body to a string and echo it
echo $body;
// Explicitly cast the body to a string
$stringBody = (string) $body;
// Read 10 bytes from the body
$tenBytes = $body->read(10);
// Read the remaining contents of the body as a string
$remainingBytes = $body->getContents();
安装PHPUnit
同Guzzle的安装, 也适用Composer工具。
composer global require "phpunit/phpunit=5.5.*"
或者在composer.json文件中声明对phpunit/phpunit的依赖
{
"require-dev": {
"phpunit/phpunit": "5.5.*"
}
}
执行安装
API 单元测试
我们在tests\unit\MyApiTest.php
中定义了两个测试用例
<?php
class MyApiTest extends \PHPUnit_Framework_TestCase
{
protected $client;
public function setUp()
{
$this->client = new \GuzzleHttp\Client( [
'base_uri' => 'http://myhost.com',
'http_errors' => false, #设置成 false 来禁用HTTP协议抛出的异常(如 4xx 和 5xx 响应),默认情况下HTPP协议出错时会抛出异常。
]);
}
public function testAction1()
{
$response = $this->client->get('/api/v1/action1');
$body = $response->getBody();
//添加测试
$this->assertEquals(200, $response->getStatusCode());
$data = json_decode($body, true);
$this->assertArrayHasKey('errorno', $data);
$this->assertArrayHasKey('errormsg', $data);
$this->assertArrayHasKey('data', $data);
$this->assertEquals(0, $data['errorno']);
$this->assertInternalType('array', $data['data']);
}
public function testAction2()
{
$response = $this->client->post('/api/v1/action2', [
'form_params' => [
'name' => 'myname',
'age' => 20,
],
]);
$body = $response->getBody();
//添加测试
$this->assertEquals(200, $response->getStatusCode());
$data = json_decode($body, true);
$this->assertArrayHasKey('errorno', $data);
$this->assertArrayHasKey('errormsg', $data);
$this->assertArrayHasKey('data', $data);
$this->assertEquals(0, $data['errorno']);
$this->assertInternalType('array', $data['data']);
}
}
运行测试
在项目根目录执行命令
php vendor/bin/phpunit tests/unit/MyApiTest.php
总结
通过Guzzle
强大的功能,可以方便进行API单元测试。大家可以查看Guzzle
文档,详细了解Guzzle
的使用。