hrodic / php-integration-testing
PHP 集成测试库
Requires
- php: ^7.3
- ext-json: *
- ext-pdo: *
Requires (Dev)
- ext-json: *
- ext-mbstring: *
- ext-pdo_mysql: *
- ext-xml: *
- friendsofphp/php-cs-fixer: ^2.16
- php-amqplib/php-amqplib: ^2.11
- phpunit/phpunit: ^8.5
- squizlabs/php_codesniffer: ^3.5
Suggests
- ext-pdo_mysql: For PDO related integration tests
- php-amqplib/php-amqplib: For AMQP related integration tests
This package is auto-updated.
Last update: 2024-09-14 18:36:52 UTC
README
PHP 的数据库和其他常见基础设施相关测试的集成测试库。
它作为一套 PHPUnit 扩展来开发,可以在不同事件上挂钩并执行您的测试用例。
目前您可以在以下 PHPUnit 挂钩上运行自定义测试用例
- BeforeFirstTest
- BeforeTest
- AfterTest
- AfterLastTest
路线图
- 工作进展:带有 WithBeforeTestFixtureName 和 WithAfterTestFixtureName 的 AMQP 特定测试用例
要求
安装
通过 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 上测试)测试用例和操作。
使用配置文件配置您的连接和钩子操作。
注意
- 钩子定义是可选的,因此只需配置您需要的钩子。
- 您只能在
beforeFirstTest和beforeTest上发布消息。 - 您可以在所有四个钩子中清除队列。
- 消息体的文件扩展名默认为
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 文件中查找灵感)您已经有一个可访问的数据库或其他基础设施,并且数据库已创建。