Entropy ist eine Bibliothek, die Tools für die Arbeit mit randomisierten Tests in PHPUnit sowie für Testsysteme bereitstellt, die PHPs Zufallsfunktionen wie rand
und shuffle
nutzen.
Manchmal erfordern Unit-Tests Änderungen am globalen Status oder decken Funktionen ab, die diesen Status ändern. Obwohl dies nie eine ideale Situation ist, kann dies häufig zur Entstehung unbeabsichtigter Abhängigkeiten von anderen Tests führen.
Durch die Aktivierung der Test-Shuffling-Funktionalität von Entropy wird die Reihenfolge Ihrer Tests randomisiert und hilft so, diese Abhängigkeiten hervorzuheben.
Durch das Test-Shuffling von Entropy wird außerdem vermieden, dass die Reihenfolge der Tests mithilfe der @depends
-Funktionalität von PHPUnit geändert wird. Zukünftige Arbeiten werden darauf abzielen, sicherzustellen, dass diese Tests bei Bedarf weiterhin gemischt werden können.
Manchmal befinden Sie sich in einer Situation, in der der Bereich der Eingaben für eine Funktion so groß ist, dass die Verwendung eines Querschnitts dieser Eingaben eine effizientere Nutzung Ihrer Ressourcen darstellt. Aber was passiert, wenn dieser Querschnitt Löcher aufweist, an denen Ihre Tests möglicherweise scheitern?
Eine Möglichkeit, dies zu umgehen, besteht darin, zufällige Eingaben zu verwenden, bei denen die Eingaben so generiert werden, dass ein zufälliger Querschnitt der Bereiche entsteht. Mit anderen Worten, die Verwendung rand
oder einem anderen nichtdeterministischen Ansatz.
Eine Erweiterung dieses eigenschaftsbasierten Testens ist die Praxis, zufällige Eingaben auf Ihre Anwendung oder Funktion anzuwenden und zu beobachten, dass die Ausgabe bestimmten Regeln entspricht oder bestimmte Eigenschaften relativ zur Eingabe aufweist, anstatt die Gleichheit mit einem bekannten Ergebnis genau zu testen Satz.
Durch die Verwaltung des zufälligen Startwerts für Ihre Tests ermöglicht Entropy nicht nur die Verwendung dieser Ansätze, sondern auch deren Wiederholbarkeit, indem entweder ein fester Startwert akzeptiert oder dieser vom letzten fehlgeschlagenen Lauf bis zum Bestehen Ihrer Testsuite wiederhergestellt wird.
Sie können diese Bibliothek mit Composer zu Ihrem Projekt hinzufügen:
$ composer require datto/phpunit-entropy
Nach der Konfiguration können Sie Ihre Testsuite wie gewohnt ausführen. Der Zuhörer wird auf sich selbst aufpassen. Bei einem Testfehler oder -fehler wird der verwendete Seed in einer temporären Datei gespeichert, sodass er beim nächsten Durchlauf wiederverwendet wird und kein neuer Seed generiert wird.
Der Startwert für den Zufallszahlengenerator wird von bis zu vier Standorten bereitgestellt, die hier in der Reihenfolge ihrer Priorität aufgeführt sind.
Wenn festgelegt, wird die Umgebungsvariable SEED
verwendet, um alle anderen Einstellungen zu überschreiben. Es kann über export
festgelegt werden, es wird jedoch empfohlen, es nur für den aktuellen Lauf festzulegen:
SEED=123456 phpunit -c phpunit.xml tests
Der Startwert kann durch Konfiguration festgelegt werden; Weitere Informationen finden Sie im Abschnitt „Konfiguration“ weiter unten.
Schlägt ein Testlauf fehl, wird der verwendete Seed in einer temporären Datei gespeichert. Dies wird dann bei einem nachfolgenden Test geladen und bleibt bestehen, bis die Suite erneut erfolgreich ist.
Wenn über die oben genannten Methoden kein Startwert festgelegt wird, besteht die letzte Methode darin, die rand
-Funktion von PHP zu verwenden.
Nach der Installation über Composer müssen Sie zum Konfigurieren des Test-Listeners lediglich Ihre PHPUnit-Konfigurationsdatei (häufig phpunit.xml
) ändern:
< phpunit xmlns : xsi = " http://www.w3.org/2001/XMLSchema-instance "
xsi : noNamespaceSchemaLocation = " http://schema.phpunit.de/4.1/phpunit.xsd "
backupGlobals = " false "
colors = " true "
bootstrap = " bootstrap.php "
>
< listeners >
< listener class = " DattoPHPUnitEntropyListener " >
< arguments >
< array >
< element key = " seeding " >
< array >
< element key = " enabled " >
< boolean >true</ boolean >
</ element >
< element key = " seed " >
< integer >1234567</ integer >
</ element >
< element key = " file " >
< string >/tmp/phpentropy-seed</ string >
</ element >
</ array >
</ element >
< element key = " shuffle " >
< boolean >true</ boolean >
</ element >
</ array >
</ arguments >
</ listener >
</ listeners >
</ phpunit >
Wenn es auf „true“ gesetzt ist, wird der Zufallszahlengenerator vom Listener gesät.
Wenn Sie den Startwert über dieses Argument festlegen, wird nur dieser Wert zum Startwert des Zufallszahlengenerators verwendet. Siehe den Abschnitt zur Seed-Priorität weiter unten.
Wenn diese Datei festgelegt ist, wird sie zum Speichern des letzten fehlgeschlagenen Zufallsstartwerts verwendet. Der Standardwert ist [TMPDIR LOCATION]/phpunit-entropy-seed
.
Wenn auf „true“ gesetzt, wird die Reihenfolge, in der Komponententests ausgeführt werden, zufällig ausgewählt (außer bei Suiten, in denen @depends
verwendet wird). Dies ist hilfreich bei der Bestimmung und Identifizierung von Abhängigkeiten zwischen Tests.
Christopher Hoult <[email protected]>