kirchbaum-development / laravel-openapi-validator
Laravel HTTP测试的自动OpenAPI验证
Requires
- php: ^8.0
- illuminate/support: ^9.0|^10.0|^11.0
- league/openapi-psr7-validator: ^0.14|^0.15|^0.16|^0.17|^0.18|^0.19|^0.20|^0.21|^0.22
- nyholm/psr7: ^1.3
- symfony/psr-http-message-bridge: ^2.0|^7.0
Requires (Dev)
- fakerphp/faker: ^1.9.1
- mockery/mockery: ^1.3.1
- orchestra/testbench: 7.*|^8.0|^9.0
- phpunit/phpunit: ^9.0|^10.5
README
使用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.yaml
或openapi.json
文件的位置),请使用以下方式发布配置
php artisan vendor:publish --provider="Kirschbaum\OpenApiValidator\OpenApiValidatorServiceProvider"
并在config/openapi_validator.php
中配置OpenAPI规范的路径以符合您的需求。
使用
将特质应用到测试类后,每次您与HTTP测试方法(如get
、post
、put
、delete
、postJson
、call
等)交互时,验证器将验证请求和响应。
跳过验证
在最初编写测试时(如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('/'); }
请注意,withoutRequestValidation
、withoutResponseValidation
和withoutValidation
仅适用于下一个请求/响应,之后将重置。
基于响应代码跳过响应
默认情况下,我们假设任何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)。有关更多信息,请参阅许可证文件。