brunty/api-testcase

此包已被废弃,不再维护。未建议替代包。

一个扩展PHPUnit以帮助测试HTTP(主要API)端点的测试用例。

1.0.2 2017-04-09 09:46 UTC

This package is auto-updated.

Last update: 2022-02-01 13:03:41 UTC


README

Build Status Coverage Status SensioLabsInsight

一些基本的辅助功能,用于帮助测试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!

虽然这个项目规模不大,但开放性和包容性被认真对待。为此,已采纳以下行为准则。

贡献者行为准则