kent013 / artisan-command-spectator-test
一个使用 OpenAPI 和 Spectator 生成 HTTP 测试的 artisan 命令。
Requires
- php: ^8.3
- devizzent/cebe-php-openapi: ^1.0
- hotmeteor/spectator: ^2.0
- laravel/framework: ^10.0 || ^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.17
- larastan/larastan: ^2.0
- orchestra/testbench: ^8.5
- phpstan/extension-installer: ^1.3.1
- phpstan/phpstan-webmozart-assert: ^1.2
README
使用 OpenAPI 和 spectator 生成 HTTP 测试用例的 artisan 命令。
免责声明
此命令仅生成支架。您需要进一步实现以测试您的 API。
我使用 api blueprint 进行 API 规范。使用 apib2swagger 生成 OpenAPI json。
虽然我没有直接编写 OpenAPI,但一些数据(如操作 ID)可能不太自然。这可能会在此命令中引起问题。
安装
composer require --dev kent013/artisan-command-spectator-test
生成配置文件
php artisan vendor:publish --tag="spectator-test"
配置
默认命名空间
如果您想更改测试命名空间,请在您的 .env
文件中添加以下行并更改值。
SPECTATORTEST_NAMESPACE=Feature
OpenAPI 文件路径
您可以在您的 .env
文件中添加以下行以设置默认 Open API 路径并更改值。
SPECTATORTEST_OPENAPI_PATH=documents/api/api.openapi3.json
此值可以通过 openapi-path
选项进行覆盖。
命令行参数
./artisan make:spectator-test TestCaseClassName APIMethodPath...
APIMethodPath
的用法
/api/v1/organization/{organization_id}/projects/{project_id}
将生成与路径相对应的所有 HTTP 方法。如果您想选择要生成的测试 HTTP 方法,请在路径前加上逗号分隔的 HTTP 方法,如下所示。
GET,PUT:/api/v1/organization/{organization_id}/projects/{project_id}
您还可以将多个 APIMethodPath
传递给命令,如下所示。
GET,PUT:/api/v1/organization/{organization_id}/projects/{project_id} GET,DELETE:/api/v1/organization/{organization_id}/projects/{project_id}
例如,
./artisan make:spectator-test Http/Api/V1/OrganizationProjectTest GET,PUT:/api/v1/organization/{organization_id}
使用标签
如果您使用标签来分组 API 路径,则可以使用 --tags
参数,如下所示。
./artisan make:spectator-test:testcase --tags Http/Api/V1/ProjectTest projects
命令行选项
--openapi-path
Open API 规范的路径。您可以指定 Json 或 Yaml 路径或 URL。
--force
是否覆盖类文件;
--tags
生成与标签匹配的测试方法。如果没有 --tags
选项,参数将被视为路径。您不能使用标签选择 HTTP 方法。
--test-name-with-path
从路径生成测试方法名,例如 testApiV1OrganizationProjectsPut204
。默认情况下,命令将使用 operationId,例如 testProjects200
示例测试
./artisan make:spectator-test Http/Api/V1/OrganizationProjectTest GET,PUT:/api/v1/organization/{organization_id}/projects/{project_id}
<?php declare(strict_types=1); namespace Tests\Feature\Http\Api\V1; use Spectator\Spectator; use Tests\TestCase; class OrganizationProjectTest extends TestCase { public function setUp(): void { parent::setUp(); Spectator::using('api.openapi3.json'); } /** * get /api/v1/organization/{organization_id}/projects/{project_id} Get status code 200 */ public function testGet200(): void { $this->getJson('/api/v1/organization/1/projects/1') ->assertStatus(200) ->assertValidRequest() ->assertValidResponse(); } /** * get /api/v1/organization/{organization_id}/projects/{project_id} Get status code 401 */ public function testGet401(): void { $this->getJson('/api/v1/organization/1/projects/1') ->assertStatus(401) ->assertValidRequest() ->assertValidResponse(); } /** * get /api/v1/organization/{organization_id}/projects/{project_id} Get status code 403 */ public function testGet403(): void { $this->getJson('/api/v1/organization/1/projects/1') ->assertStatus(403) ->assertValidRequest() ->assertValidResponse(); } /** * put /api/v1/organization/{organization_id}/projects/{project_id} Update status code 204 */ public function testUpdate204(): void { $requestBody = [ 'name' => 'Fofi', 'description' => 'An Advanced Form Filler', ]; $this->putJson('/api/v1/organization/1/projects/1', $requestBody) ->assertStatus(204) ->assertValidRequest() ->assertValidResponse(); } /** * put /api/v1/organization/{organization_id}/projects/{project_id} Update status code 401 */ public function testUpdate401(): void { $requestBody = [ 'name' => 'Fofi', 'description' => 'An Advanced Form Filler', ]; $this->putJson('/api/v1/organization/1/projects/1', $requestBody) ->assertStatus(401) ->assertValidRequest() ->assertValidResponse(); } /** * put /api/v1/organization/{organization_id}/projects/{project_id} Update status code 403 */ public function testUpdate403(): void { $requestBody = [ 'name' => 'Fofi', 'description' => 'An Advanced Form Filler', ]; $this->putJson('/api/v1/organization/1/projects/1', $requestBody) ->assertStatus(403) ->assertValidRequest() ->assertValidResponse(); } /** * put /api/v1/organization/{organization_id}/projects/{project_id} Update status code 422 */ public function testUpdate422(): void { $requestBody = [ 'name' => 'Fofi', 'description' => 'An Advanced Form Filler', ]; $this->putJson('/api/v1/organization/1/projects/1', $requestBody) ->assertStatus(422) ->assertValidRequest() ->assertValidResponse(); } }