brunty / api-testcase
一个扩展PHPUnit以帮助测试HTTP(主要API)端点的测试用例。
Requires
- php: 7.0.*||7.1.*
- guzzlehttp/guzzle: ^6.2
- phpunit/phpunit: ^6.0
- spatie/array-to-xml: ^2.2
Requires (Dev)
- satooshi/php-coveralls: ^1.0
README
一些基本的辅助功能,用于帮助测试API端点。
兼容性
- PHP 7.0及以上
- PHPUnit 6.0及以上
- Guzzlehttp 6.2及以上
安装
composer require brunty/api-testcase --dev
使用
将API的基础URL添加到您的PHPUnit配置中环境变量
<?xml version="1.0" encoding="UTF-8"?> <phpunit> <php> <env name="api_base_url" value="http://httpbin.org"/> </php> </phpunit>
扩展\Brunty\ApiTestCase
类。如果您需要配置客户端,请在调用parent::setUp()
之前调用$this->configureClientOptions($options);
<?php use Brunty\ApiTestCase; class BooksApiTest extends ApiTestCase { public function setUp() { $options = [ // ... ]; // use this if you want to add additional options to the client when it's constructed $this->configureClientOptions($options); parent::setUp(); } }
可用方法和请求
测试用例在底层使用Guzzle(\GuzzleHttp\Client
),因此请求实际上是通过它进行的。如果您需要访问客户端,您可以在测试类中使用$this->client();
。
GET
get(string $path [, array $options])
<?php use Brunty\ApiTestCase; class BooksApiTest extends ApiTestCase { /** * @test */ public function the_api_retrieves_all_books() { $this->get('/books'); $this->assertResponseOk(); } }
POST
post(string $path [, array $options])
<?php use Brunty\ApiTestCase; class BooksApiTest extends ApiTestCase { /** * @test */ public function the_api_creates_a_book() { $this->post('/books', ['title' => 'My Book']); $this->assertResponseOk(); } }
PATCH
patch(string $path [, array $options])
<?php use Brunty\ApiTestCase; class BooksApiTest extends ApiTestCase { /** * @test */ public function the_api_updates_a_book() { $this->patch('/books/1', ['title' => 'My Updated Book']); $this->assertResponseOk(); } }
PUT
put(string $path [, array $options])
<?php use Brunty\ApiTestCase; class BooksApiTest extends ApiTestCase { /** * @test */ public function the_api_creates_or_updates_a_book() { $this->put('/books', ['title' => 'My Updated Book']); $this->assertResponseOk(); } }
DELETE
delete(string $path [, array $options])
<?php use Brunty\ApiTestCase; class BooksApiTest extends ApiTestCase { /** * @test */ public function the_api_deletes_a_book() { $this->delete('/books/1'); $this->assertResponseOk(); } }
头部 & 响应
getHeader(string $name)
返回匹配名称的响应头。
response()
返回响应对象。
statusCode()
返回响应的状态码。
rawResponseBody()
返回响应体的内容。
responseBody($asArray)
返回响应体,解析为(如果$asArray
为true)数组或:如果是JSON响应,则为\stdClass
;如果是XML响应,则为\SimpleXmlElement
。
如果无法确定响应的内容类型为XML或JSON,将抛出\Brunty\ContentTypeNotFound
异常。
getContentType()
返回第一个Content-Type
头元素的值。
contentTypeIsXml()
如果内容类型是XML,则返回true
;否则返回false
。
contentTypeIsJson()
如果内容类型是JSON,则返回true
;否则返回false
。
\Brunty\Response
类包含所有HTTP状态码的常量列表 - 这些可以帮助使状态码断言更易于阅读 - 例如
$this->assertResponseStatus(\Brunty\Response::HTTP_NO_CONTENT);
与 $this->assertResponseStatus(204);
相反
断言
断言 | 注意 |
---|---|
assertResponseStatus($status) |
|
assertResponseOk() |
(响应码 200) |
assertResponseWasSuccess() |
(200 <= 响应码 < 300) |
assertResponseWasRedirect() |
(300 <= 响应码 < 400) 注意,你可能需要将 allow_redirects 选项设置为 false ,否则重定向后的页面状态码可能会被使用。 |
assertResponseWasClientError() |
(400 <= 响应码 < 500) |
assertResponseWasServerError() |
(500 <= 响应码) |
assertResponseWasJson() |
|
assertResponseWasXml() |
|
assertResponseHasKey($key) |
|
assertNodeIsValue($xPathQuery, $value) |
对结果执行 xpath 查询(是的,即使是 JSON - 尽管 |
assertRedirectedTo($path) |
路径可以是绝对路径,也可以是相对于根 api_base_url 的相对路径 |
贡献
这最初是周五晚上无聊时开始的工程,如果你在使用它,并且想要更多功能,请随时提出建议,或提交 PR!
虽然这个项目规模不大,但开放性和包容性被认真对待。为此,已采纳以下行为准则。