PHP 中的集成测试库,用于数据库和其他常见基础设施相关测试。
它是作为 PHPUnit 的一组扩展开发的,可挂钩不同的事件并执行您的装置。
目前,您可以在以下 PHPUnit 挂钩上运行自定义装置:
第一次测试前
测试前
测试后
上次测试后
WIP:带有 WithBeforeTestFixtureName 和 WithAfterTestFixtureName 的 AMQP 特定测试装置
PHP单元
通过作曲家
composer require --dev hrodic/php-integration-testing
在 PHPUnit 配置 XML 文件中,您必须指定扩展及其配置。
您可以指定将使用的配置文件名。默认为 .integration-testing.json
<extensions> <extension class="IntegrationTestingPHPUnitRunnerExtensionHandler"> <arguments> <string>.integration-testing.json</string> </arguments> </extension> </extensions>
您还可以检查 phpunit-integration.xml.dist 示例
如果您需要 PHPUnit 扩展的帮助,请参阅官方文档
如果您需要测试 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(在 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 目录内的子目录。
如果您查看测试/固定装置文件夹,您将看到一个有关如何组织固定装置的示例。您可以有多个 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 文件以获取灵感)您已经拥有可访问的数据库或其他基础设施,并且数据库已创建。