hrodic/php-integration-testing

PHP 集成测试库

v1.0 2020-06-15 09:51 UTC

This package is auto-updated.

Last update: 2024-09-14 18:36:52 UTC


README

PHP 的数据库和其他常见基础设施相关测试的集成测试库。

Build Status Maintainability Test Coverage

它作为一套 PHPUnit 扩展来开发,可以在不同事件上挂钩并执行您的测试用例。

目前您可以在以下 PHPUnit 挂钩上运行自定义测试用例

  • BeforeFirstTest
  • BeforeTest
  • AfterTest
  • AfterLastTest

路线图

  • 工作进展:带有 WithBeforeTestFixtureName 和 WithAfterTestFixtureName 的 AMQP 特定测试用例

要求

PHPUnit

安装

通过 composer

composer require --dev hrodic/php-integration-testing

配置

在 PHPUnit 配置 XML 文件中,您必须指定扩展及其配置。

您可以为要使用的配置文件名指定名称。默认为 .integration-testing.json

<extensions>
    <extension class="IntegrationTesting\PHPUnit\Runner\Extension\Handler">
        <arguments>
            <string>.integration-testing.json</string>
        </arguments>
    </extension>
</extensions>

您还可以查看 phpunit-integration.xml.dist 示例

如果您需要有关 PHPUnit 扩展的帮助,请参阅官方文档

PDO 测试用例

如果您需要测试 MySQL 或 MariaDB 的集成,请使用 PDO 驱动器扩展。

它需要配置参数,可在 json 配置文件中找到。

最重要的参数是数据库的 DSN、用户名和密码 + 一些测试用例路径定义。

示例

"pdo": {
    "dsn": "mysql:host=localhost:3306;dbname=test;charset=utf8",
    "user": "test",
    "password": "test",
    "fixtures": {
      "beforeFirstTest": {
        "path": "tests/fixtures/before-first-test",
        "extension": "sql"
      },
      "beforeTest": {
        "path": "tests/fixtures/before-test",
        "extension": "sql"
      },
      "afterTest": {
        "path": "tests/fixtures/after-test"
      },
      "afterLastTest": {
        "path": "tests/fixtures/after-last-test"
      }
    }
},

AMQP 测试用例

您还可以尝试 AMQP(在 RabbitMQ 上测试)测试用例和操作。

使用配置文件配置您的连接和钩子操作。

注意

  • 钩子定义是可选的,因此只需配置您需要的钩子。
  • 您只能在 beforeFirstTestbeforeTest 上发布消息。
  • 您可以在所有四个钩子中清除队列。
  • 消息体的文件扩展名默认为 json
  • 如果您的交换机配置为 direct,请使用 routing_key。如果配置为 fanout,则可以将其定义为空字符串。
"amqp": {
    "host": "localhost",
    "port": 5672,
    "user": "test",
    "password": "test",
    "vhost": "/",
    "fixtures": {
      "beforeFirstTest": {
        "purgeQueues": [
          "before-first-test-queue"
        ],
        "publishMessages": [
          {
            "exchange": "test-exchange",
            "queue": "before-first-test-queue",
            "routing_key": "before-first-test",
            "path": "tests/fixtures/before-first-test",
            "extension": "json"
          }
        ]
      },
      "beforeTest": {
        "purgeQueues": [
          "before-test-queue"
        ],
        "publishMessages": [
          {
            "exchange": "test-exchange",
            "queue": "before-test-queue",
            "routing_key": "before-test",
            "path": "tests/fixtures/before-test"
          }
        ]
      },
      "afterTest": {
        "purgeQueues": [
          "before-test-queue"
        ]
      },
      "afterLastTest": {
        "purgeQueues": []
      }
    }
  }

测试用例创建

PDO 测试用例只是一个 SQL 文件。

所有位于特定钩子类别的测试用例将按顺序执行,并在事务内执行。

您如何创建 SQL 和每个阶段的数据库完整性取决于您。该库不会强制您遵循任何约定,尽管在测试开始时设置测试用例并在每次测试后清理是很常见的。

您可以创建、插入、删除或配置您的用户要做的任何事情。请记住,您的测试数据库必须与任何真实数据库隔离!

所有四种测试用例钩子类型都可以放置在您喜欢的目录中。

对于在每次特定测试中发生的 BeforeTest 和 AfterTest 钩子,您还可以通过实现 WithBeforeTestFixtureName 和/或 WithAfterTestFixtureName 接口提供特定的测试用例,以便在通用的 Before 和 After 测试用例之后执行。

final class YourIntegrationTest extends TestCase implements WithBeforeTestFixtureName, WithAfterTestFixtureName
{
    private const FIXTURE_NAME = 'pdo-integration-test';

    public static function getAfterTestFixtureName(): string
    {
        return self::FIXTURE_NAME;
    }

    public static function getBeforeTestFixtureName(): string
    {
        return self::FIXTURE_NAME;
    }

    public function testYourRepositoryHere(): void
    {
        // arrange
        // act
        // assert against real database (your fixtures are already there!)       
    }
}

扩展将检查是否定义了这些方法,并使用它们来定位主 BEFORE_TEST_PDO_FIXTURES_PATH 和 AFTER_TEST_PDO_FIXTURES_PATH 目录中的子目录。

执行流程

如果您查看 tests/fixtures 文件夹,您将看到如何组织您的测试用例的示例。您可以有多个 SQL 文件,扩展将按顺序读取和执行它们。

├── after-last-test                     # AFTER_LAST_TEST_PDO_FIXTURES_PATH, executed once, at the end
│   └── 01.sql
├── after-test                          # AFTER_TEST_PDO_FIXTURES_PATH, executed after each test
│   ├── 01.sql
│   └── pdo-integration-test            # executed after each test inside the class that defines this fixture name
│       └── 01.sql
├── before-first-test                   # BEFORE_FIRST_TEST_PDO_FIXTURES_PATH, executed once, at the beginning
│   └── 01.sql
└── before-test                         # BEFORE_TEST_PDO_FIXTURES_PATH, executed before each test
    ├── 01.sql
    └── pdo-integration-test            # executed before each test inside the class that defines this fixture name
        └── 01.sql

故障排除

集成测试需要一些基础设施。

此库假设(您可以在 docker-compose.yml 文件中查找灵感)您已经有一个可访问的数据库或其他基础设施,并且数据库已创建。