Una biblioteca Composer con atributos adicionales para mejorar las pruebas con PHPUnit.
El compositor requiere --dev eliashaeussler/phpunit-attributes
La biblioteca se entrega con una extensión PHPUnit lista para usar. Debe estar registrado en su archivo de configuración de PHPUnit:
<?xml versión="1.0" codificación="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="proveedor/phpunit/phpunit/phpunit.xsd" bootstrap="proveedor/autoload.php" >+ <extensiones>+ <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension" />+ </extensiones> <testsuites> <nombre del conjunto de pruebas="unidad"> <directorio>pruebas</directorio> </testsuite> </testsuites> <fuente> <incluir> <directorio>src</directorio> </incluir> </fuente> </phpunidad>
Algunos atributos se pueden configurar con parámetros de extensión personalizados. Estos deben agregarse a la sección de registro de extensión de la siguiente manera:
<extensiones>- <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension" />+ <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension">+ <parameter name="fancyParameterName" value="fancyParameterValue" />+ </bootstrap> </extensiones>
Los siguientes atributos se envían con esta biblioteca:
#[RequiresClass]
#[RequiresPackage]
#[RequiresClass]
Alcance: nivel de clase y método
Con este atributo, las pruebas o casos de prueba se pueden marcar para que solo se ejecuten si existe una determinada clase. La clase dada debe poder cargarse mediante el cargador de clases actual (que normalmente es el cargador de clases predeterminado de Composer).
De forma predeterminada, se omiten los casos de prueba que requieren clases inexistentes. Sin embargo, este comportamiento se puede configurar utilizando el parámetro de extensión handleMissingClasses
. Si se configura como fail
, los casos de prueba a los que les faltan clases fallarán (el valor predeterminado es skip
):
<extensiones> <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension"> <parámetro nombre="handleMissingClasses" valor="fallo" /> </arranque> </extensiones>
la clase final DummyTest extiende TestCase { #[RequiresClass(AnImportantClass::class)]función pública testDummyAction(): void{// ...} }
Nivel de clase:
#[RequiresClass(AnImportantClass::class)]clase final DummyTest extiende TestCase {función pública testDummyAction(): void{// Se omite si falta una ClaseImportante.}función pública testOtherDummyAction(): void{// Se omite si falta una ClaseImportante.} }
Nivel de método:
la clase final DummyTest extiende TestCase { #[RequiresClass(AnImportantClass::class)]función pública testDummyAction(): void{// Omitida si falta AnImportantClass.}función pública testOtherDummyAction(): void{// No omitida.} }
Nivel de clase:
#[RequiresClass(AnImportantClass::class, 'Esta prueba requiere la clase `AnImportantClass`.')]clase final DummyTest extiende TestCase {función pública testDummyAction(): void{// Se omite si falta una ClaseImportante, junto con un mensaje personalizado.}función pública testOtherDummyAction(): void{// Se omite si falta una ClaseImportante, junto con un mensaje personalizado.} }
Nivel de método:
la clase final DummyTest extiende TestCase { #[RequiresClass(AnImportantClass::class, 'Esta prueba requiere la clase `AnImportantClass`.')]función pública testDummyAction(): void{// Se omite si falta AnImportantClass, junto con el mensaje personalizado.}función pública testOtherDummyAction(): void{// No omitido.} }
Nivel de clase:
#[RequiresClass(AnImportantClass::class, resultBehavior: OutcomeBehavior::Fail)]clase final DummyTest extiende TestCase {función pública testDummyAction(): void{// falla si falta una clase importante.}función pública testOtherDummyAction(): void{// falla si falta una clase importante.} }
Nivel de método:
la clase final DummyTest extiende TestCase { #[RequiresClass(AnImportantClass::class, resultBehavior: OutcomeBehavior::Fail)]función pública testDummyAction(): void{// Falla si falta AnImportantClass.}función pública testOtherDummyAction(): void{// No falla.} }
Nivel de clase:
#[RequiereClase(UnaClaseImportante::clase)] #[RequiresClass(AnotherVeryImportantClass::class)]clase final DummyTest extiende TestCase {función pública testDummyAction(): void{// Se omite si falta una ClaseImportante y/o OtraClaseMuyImportante.}función pública testOtherDummyAction(): void{// Se omite si falta unaClaseImportante y/o OtraClaseMuyImportante.} }
Nivel de método:
la clase final DummyTest extiende TestCase { #[RequiereClase(UnaClaseImportante::clase)] #[RequiresClass(AnotherVeryImportantClass::class)]función pública testDummyAction(): void{// Omitida si falta una AnImportantClass y/o OtraVeryImportantClass.}función pública testOtherDummyAction(): void{// No omitida.} }
#[RequiresPackage]
Alcance: nivel de clase y método
Este atributo se puede utilizar para definir requisitos de paquete específicos para pruebas individuales, así como para clases de prueba completas. Se espera que se instale un paquete requerido a través de Composer. Opcionalmente, puede definir una restricción de versión y un mensaje personalizado.
Importante
El atributo determina los paquetes de Composer instalados a partir de la clase InstalledVersions
generada en el momento de la compilación y creada por Composer. Para poder leer correctamente esta clase, es esencial incluir el cargador automático generado por Composer en su script de arranque PHPUnit:
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php"><! -- ... --></phpunit>
También puede pasar el script como opción de comando: phpunit --bootstrap vendor/autoload.php
De forma predeterminada, se omiten los casos de prueba con requisitos no satisfechos. Sin embargo, este comportamiento se puede configurar mediante el parámetro de extensión handleUnsatisfiedPackageRequirements
. Si se configura como fail
, los casos de prueba con requisitos no satisfechos fallarán (el valor predeterminado es skip
):
<extensiones> <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension"> <parámetro nombre="handleUnsatisfiedPackageRequirements" valor="fallo" /> </arranque> </extensiones>
la clase final DummyTest extiende TestCase { #[RequiresPackage('symfony/console')]función pública testDummyAction(): void{// ...} }
Nivel de clase:
#[RequiresPackage('symfony/console')]clase final DummyTest extiende TestCase {función pública testDummyAction(): void{// Se omite si Symfony/console no está instalado.}función pública testOtherDummyAction(): void{// Se omite si Symfony/console no está instalado.} }
Nivel de método:
la clase final DummyTest extiende TestCase { #[RequiresPackage('symfony/console')]función pública testDummyAction(): void{// Omitida si Symfony/console no está instalado.}función pública testOtherDummyAction(): void{// No omitida.} }
Nivel de clase:
#[RequiresPackage('symfony/*')]clase final DummyTest extiende TestCase {función pública testDummyAction(): void{// Se omite si no hay paquetes Symfony/* instalados.}función pública testOtherDummyAction(): void{// Se omite si no hay paquetes Symfony/* instalados.} }
Nivel de método:
la clase final DummyTest extiende TestCase { #[RequiresPackage('symfony/*')]función pública testDummyAction(): void{// Omitida si no hay paquetes Symfony/* instalados.}función pública testOtherDummyAction(): void{// No omitida.} }
Nivel de clase:
#[RequiresPackage('symfony/console', '>= 7')]clase final DummyTest extiende TestCase {función pública testDummyAction(): void{// Se omite si la versión instalada de Symfony/console es < 7.}función pública testOtherDummyAction(): void{// Se omite si la versión instalada de Symfony/console es < 7.} }
Nivel de método:
la clase final DummyTest extiende TestCase { #[RequiresPackage('symfony/console', '>= 7')]función pública testDummyAction(): void{// Se omite si la versión instalada de Symfony/console es < 7.}función pública testOtherDummyAction(): void{// No omitido.} }
Nivel de clase:
#[RequiresPackage('symfony/console', mensaje: 'Esta prueba requiere la consola Symfony.')]clase final DummyTest extiende TestCase {public function testDummyAction(): void{// Se omite si Symfony/console no está instalado, junto con el mensaje personalizado.}public function testOtherDummyAction(): void{// Se omite si Symfony/console no está instalado, junto con el mensaje personalizado. } }
Nivel de método:
la clase final DummyTest extiende TestCase { #[RequiresPackage('symfony/console', mensaje: 'Esta prueba requiere la consola Symfony.')]función pública testDummyAction(): void{// Se omite si Symfony/console no está instalado, junto con el mensaje personalizado.}función pública testOtherDummyAction(): void{// No omitido.} }
Nivel de clase:
#[RequiresPackage('symfony/console', resultBehavior: OutcomeBehavior::Fail)]clase final DummyTest extiende TestCase {función pública testDummyAction(): void{// Falla si Symfony/console no está instalado.}función pública testOtherDummyAction(): void{// Falla si Symfony/console no está instalado.} }
Nivel de método:
la clase final DummyTest extiende TestCase { #[RequiresPackage('symfony/console', resultBehavior: OutcomeBehavior::Fail)]función pública testDummyAction(): void{// Falla si Symfony/console no está instalado.}función pública testOtherDummyAction(): void{// No fallar.} }
Nivel de clase:
#[RequiresPackage('symfony/consola')] #[RequiresPackage('guzzlehttp/guzzle')]clase final DummyTest extiende TestCase {función pública testDummyAction(): void{// Se omite si symfony/console y/o guzzlehttp/guzzle no están instalados.}función pública testOtherDummyAction(): void{// Se omite si symfony/console y/o guzzlehttp/guzzle no están instalados instalado.} }
Nivel de método:
la clase final DummyTest extiende TestCase { #[RequiresPackage('symfony/consola')] #[RequiresPackage('guzzlehttp/guzzle')]función pública testDummyAction(): void{// Omitida si Symfony/console y/o guzzlehttp/guzzle no están instalados.}función pública testOtherDummyAction(): void{// No omitida. } }
Por favor, eche un vistazo a CONTRIBUTING.md
.
Este proyecto tiene la licencia GNU General Public License 3.0 (o posterior).