kirchbaum-development/laravel-openapi-validator

Laravel HTTP测试的自动OpenAPI验证

1.0.0 2024-04-04 11:08 UTC

This package is auto-updated.

Last update: 2024-09-10 12:09:07 UTC


README

Laravel Supported Versions MIT Licensed

使用OpenAPI规范是一种创建和共享API遵守的合同的好方法。此包将自动验证在您的集成和功能测试中使用的请求和响应,无论在哪里使用Laravel HTTP测试方法(如->get('/uri')等)。

在幕后,此包将Laravel HTTP助手与Laravel HTTP助手连接到PHP League的OpenAPI验证器

安装

您可以通过composer安装此包

composer require kirschbaum-development/laravel-openapi-validator

设置

在任何功能/集成测试中(例如那些扩展框架的Tests\TestCase基类),添加ValidatesOpenApiSpec特质

use Kirschbaum\OpenApiValidator\ValidatesOpenApiSpec;

class HttpTest extends TestCase
{
    use ValidatesOpenApiSpec;
}

在许多情况下,默认值应处理配置。如果您需要自定义配置(特别是openapi.yamlopenapi.json文件的位置),请使用以下方式发布配置

php artisan vendor:publish --provider="Kirschbaum\OpenApiValidator\OpenApiValidatorServiceProvider"

并在config/openapi_validator.php中配置OpenAPI规范的路径以符合您的需求。

使用

将特质应用到测试类后,每次您与HTTP测试方法(如getpostputdeletepostJsoncall等)交互时,验证器将验证请求和响应。

跳过验证

在最初编写测试时(如TDD),关闭请求或响应验证直到测试接近完成可能很有帮助。您可以按如下方式操作

public function testEndpointInProgress()
{
    $response = $this->withoutRequestValidation()->get('/'); // Skips request validation, still validates response
    // or
    $response = $this->withoutResponseValidation()->get('/'); // Validates the request, but skips response
    // or
    $response = $this->withoutValidation()->get('/'); // No validation
}

您可以根据上述示例链式调用这些方法,或者单独调用它们

public function testEndpointInProgress()
{
    $this->withoutRequestValidation();
    $response = $this->get('/');
}

请注意,withoutRequestValidationwithoutResponseValidationwithoutValidation仅适用于下一个请求/响应,之后将重置。

基于响应代码跳过响应

默认情况下,我们假设任何5xx状态代码不应被验证。您可以通过设置测试类的受保护属性responseCodesToSkip或使用skipResponseCode方法(单个、数组或正则表达式模式)来更改此设置来更改此设置。

use Kirschbaum\OpenApiValidator\ValidatesOpenApiSpec;

class HttpTest extends TestCase
{
    use ValidatesOpenApiSpec;

    protected $responseCodesToSkip = [200]; // Will validate every response EXCEPT 200

    public function testNoRedirects()
    {
        $this->skipResponseCode(300); // Will skip 200 and 300
        $this->skipResponseCode(301, 302); // Will skip 200, 300, 301, 302
        $this->skipResponseCode('3[1-2]1'); // Will skip 200, 300, 301, 302, 311, and 321
        // ...
    }
}

身份验证/授权

在大多数测试中,您可能使用Laravel的助手,如actingAs($user)来处理身份验证。默认情况下,此包假设您正在使用bearer令牌作为授权头,并且这已在您的OpenAPI规范中指定。验证器会期望授权是请求的一部分,即使Laravel没有发送它们。如果您使用除bearer令牌之外的安全机制,应重写getAuthenticatedRequest方法并添加适当的头。请注意,它们不需要有效(除非您的代码将检查它们),它们只需要存在以满足验证器。

贡献

有关详细信息,请参阅CONTRIBUTING

安全

如果您发现任何与安全相关的问题,请通过security@kirschbaumdevelopment.com发送电子邮件,而不是使用问题跟踪器。

鸣谢

赞助

本软件包的开发由Kirschbaum开发集团赞助,该集团是一家以解决问题、团队建设和社区为中心的驱动型开发公司。了解更多 关于我们加入我们

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件