Integrationstestbibliothek in PHP für Datenbanken und andere gängige infrastrukturbezogene Tests.
Es wurde als eine Reihe von Erweiterungen für PHPUnit entwickelt, die verschiedene Ereignisse einbinden und Ihre Fixtures ausführen.
Derzeit können Sie benutzerdefinierte Fixtures auf den folgenden PHPUnit-Hooks ausführen:
Vor dem ersten Test
VorTest
NachTest
AfterLastTest
In Bearbeitung: AMQP-spezifische Testvorrichtungen mit WithBeforeTestFixtureName und WithAfterTestFixtureName
PHPUnit
Über den Komponisten
composer require --dev hrodic/php-integration-testing
In der PHPUnit-Konfigurations-XML-Datei müssen Sie die Erweiterung mit ihrer Konfiguration angeben.
Sie können den Namen der Konfigurationsdatei angeben, die Sie verwenden möchten. Standardmäßig ist .integration-testing.json
<extensions> <extension class="IntegrationTestingPHPUnitRunnerExtensionHandler"> <arguments> <string>.integration-testing.json</string> </arguments> </extension> </extensions>
Sehen Sie sich auch das Beispiel phpunit-integration.xml.dist an
Wenn Sie Hilfe zu PHPUnit-Erweiterungen benötigen, lesen Sie bitte die offizielle Dokumentation
Wenn Sie die Integration von MySQL oder MariaDB testen müssen, verwenden Sie die PDO-Treibererweiterung.
Es sind Konfigurationsparameter erforderlich, die in der JSON-Konfigurationsdatei zu finden sind.
Die wichtigsten Parameter sind DSN, Benutzername und Passwort Ihrer Datenbank sowie einige Fixture-Pfaddefinitionen.
Beispiel:
"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" } } },
Sie können auch AMQP-Geräte und -Operationen (getestet auf RabbitMQ) ausprobieren.
Konfigurieren Sie Ihre Konnektivität und die Hook-Operationen mithilfe der Konfigurationsdatei.
Hinweise:
Hook-Definitionen sind optional, konfigurieren Sie also einfach die, die Sie benötigen.
Sie können Nachrichten nur auf beforeFirstTest
und beforeTest
veröffentlichen.
Sie können Warteschlangen in allen vier Hooks löschen.
Dateierweiterung von Nachrichtentexten zum Veröffentlichen standardmäßig in json
Verwenden Sie routing_key
, wenn Ihr Austausch als direct
konfiguriert ist. Sie können es als leere Zeichenfolge definieren, wenn es zu 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": [] } } }
Ein PDO-Gerät ist nur eine SQL-Datei.
Alle Fixtures, die sich in einer bestimmten Hook-Kategorie befinden, werden der Reihe nach und innerhalb einer Transaktion ausgeführt.
Wie Sie das SQL und die Integrität der Datenbank in jeder Phase erstellen, bleibt Ihnen überlassen. Die Bibliothek zwingt Sie nicht, irgendwelchen Konventionen zu folgen, obwohl es üblich ist, am Anfang Vorrichtungen einzurichten und nach jedem Test das Durcheinander zu beseitigen.
Sie können erstellen, einfügen, löschen oder was auch immer Sie für Ihren Benutzer konfigurieren. Denken Sie daran, dass Ihre Testdatenbank von jeder realen Datenbank isoliert sein muss!
Alle vier Fixture-Hook-Typen können in dem von Ihnen bevorzugten Verzeichnis abgelegt werden.
Für BeforeTest- und AfterTest-Hooks, die in jedem spezifischen Test auftreten, können Sie auch bestimmte Fixtures bereitstellen, die direkt nach den generischen Before- und After-Fixture-Fixtures ausgeführt werden, indem Sie die Schnittstellen WithBeforeTestFixtureName und/oder WithAfterTestFixtureName implementieren.
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!) } }
Die Erweiterung prüft, ob die Methoden definiert sind, und verwendet sie, um Unterverzeichnisse in den Hauptverzeichnissen BEFORE_TEST_PDO_FIXTURES_PATH und AFTER_TEST_PDO_FIXTURES_PATH zu finden.
Wenn Sie einen Blick auf den Ordner „Tests/Fixtures“ werfen, sehen Sie ein Beispiel, wie Sie Ihre Fixtures organisieren können. Sie können mehrere SQL-Dateien haben und die Erweiterung liest und führt sie der Reihe nach aus.
├── 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
Für Integrationstests muss eine gewisse Infrastruktur vorhanden sein.
Diese Bibliothek geht davon aus (Sie können sich die Datei docker-compose.yml als Inspiration ansehen), dass Sie bereits über eine zugängliche Datenbank oder andere Infrastruktur verfügen und die Datenbank erstellt wurde.