Eine Composer-Bibliothek mit zusätzlichen Attributen zur Verbesserung des Testens mit PHPUnit.
Composer erfordert --dev eliashaeussler/phpunit-attributes
Die Bibliothek wird mit einer gebrauchsfertigen PHPUnit-Erweiterung ausgeliefert. Es muss in Ihrer PHPUnit-Konfigurationsdatei registriert sein:
<?xml version="1.0"kodierung="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" >+ <extensions>+ <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension" />+ </extensions> <testsuites> <testsuite name="unit"> <directory>tests</directory> </testsuite> </testsuites> <Quelle> <einschließen> <directory>src</directory> </include> </Quelle> </phpunit>
Einige Attribute können mit benutzerdefinierten Erweiterungsparametern konfiguriert werden. Diese müssen wie folgt zum Abschnitt zur Erweiterungsregistrierung hinzugefügt werden:
<extensions>- <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension" />+ <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension">+ <parameter name="fancyParameterName" value="fancyParameterValue" />+ </bootstrap> </extensions>
Die folgenden Attribute werden mit dieser Bibliothek geliefert:
#[RequiresClass]
#[RequiresPackage]
#[RequiresClass]
Geltungsbereich: Klassen- und Methodenebene
Mit diesem Attribut können Tests oder Testfälle so gekennzeichnet werden, dass sie nur ausgeführt werden, wenn eine bestimmte Klasse existiert. Die angegebene Klasse muss vom aktuellen Klassenlader geladen werden können (normalerweise der Standard-Klassenlader von Composer).
Standardmäßig werden Testfälle, die nicht vorhandene Klassen erfordern, übersprungen. Dieses Verhalten kann jedoch mithilfe des Erweiterungsparameters handleMissingClasses
konfiguriert werden. Wenn die Einstellung auf fail
gesetzt ist, schlagen Testfälle mit fehlenden Klassen fehl (standardmäßig wird skip
):
<Erweiterungen> <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension"> <parameter name="handleMissingClasses" value="fail" /> </bootstrap> </extensions>
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresClass(AnImportantClass::class)]public function testDummyAction(): void{// ...} }
Klassenstufe:
#[RequiresClass(AnImportantClass::class)]finale Klasse DummyTest erweitert TestCase {öffentliche Funktion testDummyAction(): void{// Übersprungen, wenn AnImportantClass fehlt.}öffentliche Funktion testOtherDummyAction(): void{// Übersprungen, wenn AnImportantClass fehlt.} }
Methodenebene:
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresClass(AnImportantClass::class)]öffentliche Funktion testDummyAction(): void{// Übersprungen, wenn AnImportantClass fehlt.}öffentliche Funktion testOtherDummyAction(): void{// Nicht übersprungen.} }
Klassenstufe:
#[RequiresClass(AnImportantClass::class, 'Dieser Test erfordert die Klasse 'AnImportantClass'.')]finale Klasse DummyTest erweitert TestCase {public function testDummyAction(): void{// Übersprungen, wenn AnImportantClass fehlt, zusammen mit benutzerdefinierter Nachricht.}public function testOtherDummyAction(): void{// Übersprungen, wenn AnImportantClass fehlt, zusammen mit benutzerdefinierter Nachricht.} }
Methodenebene:
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresClass(AnImportantClass::class, 'Dieser Test erfordert die Klasse 'AnImportantClass'.')]public function testDummyAction(): void{// Wird übersprungen, wenn AnImportantClass fehlt, zusammen mit einer benutzerdefinierten Nachricht.}public function testOtherDummyAction(): void{// Nicht übersprungen.} }
Klassenstufe:
#[RequiresClass(AnImportantClass::class, resultsBehavior: OutcomeBehavior::Fail)]final class DummyTest erweitert TestCase {public function testDummyAction(): void{// schlägt fehl, wenn AnImportantClass fehlt.}public function testOtherDummyAction(): void{// schlägt fehl, wenn AnImportantClass fehlt.} }
Methodenebene:
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresClass(AnImportantClass::class, resultsBehavior: OutcomeBehavior::Fail)]public function testDummyAction(): void{// schlägt fehl, wenn AnImportantClass fehlt.}public function testOtherDummyAction(): void{// schlägt nicht fehl.} }
Klassenstufe:
#[RequiresClass(AnImportantClass::class)] #[RequiresClass(AnotherVeryImportantClass::class)]finale Klasse DummyTest erweitert TestCase {öffentliche Funktion testDummyAction(): void{// Übersprungen, wenn AnImportantClass und/oder AnotherVeryImportantClass fehlen.}öffentliche Funktion testOtherDummyAction(): void{// Übersprungen, wenn AnImportantClass und/oder AnotherVeryImportantClass fehlen.} }
Methodenebene:
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresClass(AnImportantClass::class)] #[RequiresClass(AnotherVeryImportantClass::class)]öffentliche Funktion testDummyAction(): void{// Übersprungen, wenn AnImportantClass und/oder AnotherVeryImportantClass fehlen.}öffentliche Funktion testOtherDummyAction(): void{// Nicht übersprungen.} }
#[RequiresPackage]
Geltungsbereich: Klassen- und Methodenebene
Mit diesem Attribut können spezifische Paketanforderungen für einzelne Tests sowie komplette Testklassen definiert werden. Es wird erwartet, dass ein erforderliches Paket über Composer installiert wird. Sie können optional eine Versionseinschränkung und eine benutzerdefinierte Nachricht definieren.
Wichtig
Das Attribut bestimmt installierte Composer-Pakete aus der zur Buildzeit generierten InstalledVersions
-Klasse, die von Composer erstellt wurde. Um richtig aus dieser Klasse lesen zu können, ist es wichtig, den von Composer generierten Autoloader in Ihr PHPUnit-Bootstrap-Skript einzubinden:
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php"><! -- ... --></phpunit>
Sie können das Skript auch als Befehlsoption übergeben: phpunit --bootstrap vendor/autoload.php
Standardmäßig werden Testfälle mit nicht erfüllten Anforderungen übersprungen. Dieses Verhalten kann jedoch mithilfe des Erweiterungsparameters handleUnsatisfiedPackageRequirements
konfiguriert werden. Wenn die Einstellung auf fail
eingestellt ist, schlagen Testfälle mit nicht erfüllten Anforderungen fehl (standardmäßig „ skip
):
<Erweiterungen> <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension"> <parameter name="handleUnsatisfiedPackageRequirements" value="fail" /> </bootstrap> </extensions>
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresPackage('symfony/console')]public function testDummyAction(): void{// ...} }
Klassenstufe:
#[RequiresPackage('symfony/console')]final class DummyTest erweitert TestCase {public function testDummyAction(): void{// Übersprungen, wenn Symfony/Console nicht installiert ist.}public function testOtherDummyAction(): void{// Übersprungen, wenn Symfony/console nicht installiert ist.} }
Methodenebene:
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresPackage('symfony/console')]public function testDummyAction(): void{// Übersprungen, wenn symfony/console nicht installiert ist.}public function testOtherDummyAction(): void{// Nicht übersprungen.} }
Klassenstufe:
#[RequiresPackage('symfony/*')]final class DummyTest erweitert TestCase {public function testDummyAction(): void{// Übersprungen, wenn keine Symfony/*-Pakete installiert sind.}public function testOtherDummyAction(): void{// Übersprungen, wenn keine Symfony/*-Pakete installiert sind.} }
Methodenebene:
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresPackage('symfony/*')]public function testDummyAction(): void{// Wird übersprungen, wenn keine symfony/*-Pakete installiert sind.}public function testOtherDummyAction(): void{// Nicht übersprungen.} }
Klassenstufe:
#[RequiresPackage('symfony/console', '>= 7')]final class DummyTest erweitert TestCase {public function testDummyAction(): void{// Übersprungen, wenn die installierte Version von Symfony/Console < 7 ist.}public function testOtherDummyAction(): void{// Übersprungen, wenn die installierte Version von Symfony/console < 7 ist.} }
Methodenebene:
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresPackage('symfony/console', '>= 7')]public function testDummyAction(): void{// Übersprungen, wenn die installierte Version von Symfony/console < 7 ist.}public function testOtherDummyAction(): void{// Nicht übersprungen.} }
Klassenstufe:
#[RequiresPackage('symfony/console', message: 'Dieser Test erfordert die Symfony-Konsole.')]finale Klasse DummyTest erweitert TestCase {public function testDummyAction(): void{// Übersprungen, wenn Symfony/Console nicht installiert ist, zusammen mit einer benutzerdefinierten Nachricht.}public function testOtherDummyAction(): void{// Übersprungen, wenn Symfony/console nicht installiert ist, zusammen mit einer benutzerdefinierten Nachricht. } }
Methodenebene:
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresPackage('symfony/console', message: 'Dieser Test erfordert die Symfony Console.')]public function testDummyAction(): void{// Wird übersprungen, wenn symfony/console nicht installiert ist, zusammen mit einer benutzerdefinierten Nachricht.}public function testOtherDummyAction(): void{// Nicht übersprungen.} }
Klassenstufe:
#[RequiresPackage('symfony/console', resultsBehavior: OutcomeBehavior::Fail)]final class DummyTest erweitert TestCase {public function testDummyAction(): void{// schlägt fehl, wenn Symfony/Console nicht installiert ist.}public function testOtherDummyAction(): void{// schlägt fehl, wenn Symfony/console nicht installiert ist.} }
Methodenebene:
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresPackage('symfony/console', resultsBehavior: OutcomeBehavior::Fail)]public function testDummyAction(): void{// Schlägt fehl, wenn symfony/console nicht installiert ist.}public function testOtherDummyAction(): void{// Nicht scheitern.} }
Klassenstufe:
#[RequiresPackage('symfony/console')] #[RequiresPackage('guzzlehttp/guzzle')]final class DummyTest erweitert TestCase {public function testDummyAction(): void{// Übersprungen, wenn Symfony/console und/oder guzzlehttp/guzzle nicht installiert sind.}public function testOtherDummyAction(): void{// Übersprungen, wenn Symfony/console und/oder guzzlehttp/guzzle nicht installiert sind installiert.} }
Methodenebene:
Die letzte Klasse DummyTest erweitert TestCase { #[RequiresPackage('symfony/console')] #[RequiresPackage('guzzlehttp/guzzle')]public function testDummyAction(): void{// Übersprungen, wenn Symfony/console und/oder guzzlehttp/guzzle nicht installiert sind.}public function testOtherDummyAction(): void{// Nicht übersprungen. } }
Bitte werfen Sie einen Blick auf CONTRIBUTING.md
.
Dieses Projekt ist unter der GNU General Public License 3.0 (oder höher) lizenziert.