Integrationen testen
Diese Seite richtet sich an Entwickler und Tester von Integrationen. Eine Integration hat zwei Systeme, ein Netzwerk und Daten, die sich unter ihr ändern; die meisten ihrer Fehler lassen sich mit ein paar Arten von Tests vor dem Go-live finden. Die Mechanik auf Seiten der Erweiterung steht unter Tests für Erweiterungen.
Inhalt
- Die Testpyramide einer Integration
- Unit-Tests ohne Datenbank
- Das andere System als Test-Double
- Tests mit geladenem Kernel
- Probeläufe und der Idempotenztest
- Mail, Webhooks und Sandboxes
- Abnahme mit dem Kunden
Die Testpyramide einer Integration
| Ebene | Was sie beweist | Wie oft |
|---|---|---|
| Unit-Tests (ohne Datenbank) | Zuordnung, Parsen, Validierung, Aufbau der Nutzlast, Signaturprüfungen | Bei jedem Commit, in der CI |
| Vertragstests mit einem Test-Double | Ihr Client behandelt jede Antwort des anderen Systems, auch Fehler | Bei jedem Commit |
| Skripttests mit dem Kernel | Objekte werden angelegt, über die Remote-ID gefunden und nur bei Änderung aktualisiert | Vor jedem Release, auf einer Entwicklungsinstallation |
| Probeläufe auf einer Kopie der Produktion | Echte Daten lassen sich parsen; die Zahlen sind plausibel | Vor dem Go-live und nach Änderungen am Quellformat |
| Ende zu Ende in einer Staging-Umgebung mit der Testinstanz des anderen Systems | Der ganze Fluss funktioniert, mit echten Zugangsdaten der Testsysteme | Vor dem Go-live und nach Upgrades |
| Abnahme mit dem Kunden | Das fachliche Ergebnis stimmt | Einmal, unterschrieben |
Unit-Tests ohne Datenbank
Halten Sie die Logik, die keinen Kernel braucht, in einfachen Klassen: den CSV-Parser, die Zuordnung einer Quellzeile
zu Attributwerten, den Aufbau der Nutzlast, die Signaturprüfung. Sie laufen in Millisekunden mit dem PHPUnit aus dem
vendor/ des Kernels:
use PHPUnit\Framework\TestCase;
final class ProductMappingTest extends TestCase
{
public function testPriceIsWrittenInThePriceDatatypeFormat(): void
{
$mapping = new myIntegrationProductMapping();
$attributes = $mapping->attributes( array( 'ARTNR' => '10442', 'NAME' => ' Trail shoe ', 'PRICE' => '119.00', 'STOCK' => '7' ) );
$this->assertSame( '119.00|1|1', $attributes['price'] );
$this->assertSame( 'Trail shoe', $attributes['name'] );
}
public function testRowsWithoutAnArticleNumberAreRefused(): void
{
$this->assertNull( ( new myIntegrationProductMapping() )->attributes( array( 'ARTNR' => '', 'PRICE' => '1' ) ) );
}
}Führen Sie sie aus dem Verzeichnis der Erweiterung mit php ../../vendor/bin/phpunit und einer phpunit.xml.dist
wie im oben genannten Kapitel aus (PHPUnit-Tests ohne Datenbank).
Das andere System als Test-Double
Legen Sie das andere System hinter eine eigene Schnittstelle (myIntegrationHubClient mit send()), und geben Sie
Tests eine Attrappe, die Aufrufe aufzeichnet und beantwortet, was der Test braucht: Erfolg, 429 mit Retry-After,
500, ein Timeout, einen ungültigen Inhalt. Testen Sie dann, dass Ihr Sender Zeilen nur bei Erfolg als gesendet
markiert, bei 429 zurückweicht und eine Zeile nach dem letzten Versuch in die Dead-Letter-Ablage verschiebt. Bewahren
Sie einige aufgezeichnete echte Antworten des anderen Systems als Fixtures auf und aktualisieren Sie sie, wenn sich
dessen API ändert.
Tests mit geladenem Kernel
Ein Testskript, das mit php bin/php/ezexec.php <script> -s <siteaccess> auf einer Entwicklungsinstallation läuft,
kann Objekte mit einem Testpräfix anlegen, prüfen und wieder entfernen:
// extension/myintegration/tests/scripts/upsert_check.php, run with bin/php/ezexec.php on a development copy only
$importer = new myIntegrationProductImport( $cli, false );
$remoteID = 'test-erp-product-' . time();
// ... call the upsert with a test record, then:
$object = eZContentObject::fetchByRemoteID( $remoteID );
$cli->output( $object instanceof eZContentObject ? 'PASS created' : 'FAIL not created' );
if ( $object instanceof eZContentObject )
{
$object->removeThis(); // or remove its node to the trash; development copies only
}ezexec.php aktiviert die Testklassen im Verzeichnis tests/ einer Erweiterung für ein Skript darin. Führen Sie
solche Skripte nie gegen die Produktion aus.
Probeläufe und der Idempotenztest
- Kopieren Sie die Produktion (Datenbank und
var/storage) auf eine Testinstallation; anonymisieren Sie personenbezogene Daten, wenn die Kopie die Produktionsumgebung verlässt. - Führen Sie den Import mit
--dry-runaus: Die Zahlen müssen plausibel sein (nicht "20 000 angelegt" auf einer Website, die alle schon hat). - Führen Sie ihn wirklich aus; prüfen Sie eine Stichprobe von Objekten.
- Führen Sie ihn sofort noch einmal aus: Er darf nur
unchangedmelden. Jedesupdatedbedeutet, dass die Änderungserkennung Formate vergleicht, die sich unterscheiden. - Entfernen Sie einen Datensatz aus der Quelle und führen Sie ihn erneut aus: Die Regel für Entfernungen muss greifen, und der Sicherheitsstopp muss auslösen, wenn die Quelle absichtlich gekürzt wird.
Mail, Webhooks und Sandboxes
- Mail:
site.ini [MailSettings] Transport=fileauf jeder Testinstallation, und prüfen Sie, dasssettings/overridekeinen anderen Transport erzwingt; Testadressen aufexample.invalid. - Ausgehende Webhooks: Richten Sie sie auf einen eigenen Empfänger im Testnetzwerk und testen Sie die Signaturprüfung mit einem falschen Geheimnis und einem alten Zeitstempel.
- Zahlungs- und Identitätsanbieter: Verwenden Sie deren Sandboxes; nie echte Karten oder echte Konten.
- API-Schlüssel: eigene Schlüssel für Testinstallationen, mit kurzer Laufzeit.
Abnahme mit dem Kunden
Schreiben Sie Abnahmefälle in der Sprache des Kunden, mit Daten, die er kennt: "Artikel 10442, um 14:00 im ERP geändert, zeigt bis 14:10 den neuen Preis auf der Produktseite." Lassen Sie sie vor dem Go-live abzeichnen und bewahren Sie sie für das nächste Upgrade auf, wenn sie zum Regressionstest werden (Upgrades ohne defekte Integrationen).
Verwandte Seiten
- Tests für Erweiterungen
- Anwendungen testen
- Qualitätstore und Abnahme
- Go-live-Checkliste für Integrationen
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.