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 檔案以獲取靈感)您已經擁有可存取的資料庫或其他基礎設施,並且資料庫已建立。