kent013/artisan-command-spectator-test

一个使用 OpenAPI 和 Spectator 生成 HTTP 测试的 artisan 命令。

v0.0.6 2024-04-18 04:28 UTC

This package is auto-updated.

Last update: 2024-09-18 05:21:48 UTC


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();
    }
}