Secciones

Pruebas Unitarias


Resumen

Escribir pruebas adecuadas puede ayudar a escribir mejor software. Si configura correctamente los casos de prueba puede eliminar la mayoría de errores funcionales y mantener mejor su software.

Integrando PHPUnit con Phalcon

composer require --dev phpunit/phpunit:^9.0

o agregando manualmente al archivo composer.json:

{
    "require-dev": {
        "phpunit/phpunit": "^9.0"
    }
}

Una vez que PHPUnit está instalado, cree un directorio llamado tests en el directorio raíz del proyecto con un subdirectorio llamado Unit:

app/
src/
public/
tests/Unit/

Configurar el espacio de nombres de prueba

Para autocargar nuestro directorio de pruebas, debemos añadir nuestro espacio de nombres de prueba a composer. Añada lo siguiente a composer y modifíquelo según sus necesidades.

{
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests"
        }
    }
}

Ahora, cree un fichero phpunit.xml como sigue:

El archivo phpunit.xml

Modifique el siguiente phpunit.xml para cubrir sus necesidades y guárdelo en el directorio raíz de su proyecto. Esto ejecutará cualquier prueba bajo el directorio tests/Unit.

<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         verbose="true"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">

    <testsuite name="Phalcon - Unit Test">
        <directory>./tests/Unit</directory>
    </testsuite>
</phpunit>

Phalcon Incubator Test

Phalcon proporciona una librería de pruebas que proporciona algunas clases abstractas que puede usar para arrancar las Pruebas Unitarias. Estos ficheros existen en el repositorio Phalcon Incubator Test.

Puede usar la librería de pruebas de Incubator añadiéndola como dependencia:

composer require --dev phalcon/incubator-test:^v1.0.0-alpha.1

o agregando manualmente al archivo composer.json:

{
    "require-dev": {
        "phalcon/incubator-test": "^v1.0.0-alpha.1"
    }
}

Creando una prueba unitaria

Siempre es aconsejable autocargar sus clases usando espacios de nombres. La configuración siguiente asume que está usando PSR-4 para autocargar las clases de su proyecto vía configuración de composer. Entonces, el autocargador se asegurará de que se carguen los ficheros apropiados, por lo que todo lo que necesita es crear los ficheros y phpunit ejecutará las pruebas por usted.

Este ejemplo no contiene un archivo de configuración, ya que la mayoría de los casos debería estar simulando sus dependencias. Si necesita uno, puede añadir al DI en el AbstractUnitTest.

Prueba Unitaria Abstracta

Primero cree una Prueba Unitaria base llamada AbstractUnitTest.php en su directorio tests/Unit:

<?php

declare(strict_types=1);

namespace Tests\Unit;

use Phalcon\Di;
use Phalcon\Di\FactoryDefault;
use Phalcon\Incubator\Test\PHPUnit\UnitTestCase;
use PHPUnit\Framework\IncompleteTestError;

abstract class AbstractUnitTest extends UnitTestCase
{
    private bool $loaded = false;

    protected function setUp(): void
    {
        parent::setUp();

        $di = new FactoryDefault();

        Di::reset();
        Di::setDefault($di);

        $this->loaded = true;
    }

    public function __destruct()
    {
        if (!$this->loaded) {
            throw new IncompleteTestError(
                "Please run parent::setUp()."
            );
        }
    }
}

Tu Primera Prueba

Cree la prueba siguiente y guárdela en su directorio tests/Unit.

<?php

declare(strict_types=1);

namespace Tests\Unit;

class UnitTest extends AbstractUnitTest
{
    public function testTestCase(): void
    {
        $this->assertEquals(
            "roman",
            "roman",
            "This will pass"
        );

        $this->assertEquals(
            "hope",
            "ava",
            "This will fail"
        );
    }
}

Si necesita sobrecargar el método setUp, es importante llamar al padre o Phalcon no se inicializará correctamente.

    protected function setUp(): void
    {
        parent::setUp();

        //...
    }

Running Unit Tests

When you execute vendor/bin/phpunit in your command-line, you will get the following output:

$ phpunit
PHPUnit 9.5.23 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.1.8 with Xdebug 3.1.5
Configuration: /var/www//phpunit.xml

Time: 3 ms, Memory: 3.25Mb

There was 1 failure:

1) Test\Unit\UnitTest::testTestCase
This will fail
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'hope'
+'ava'

/var/www/tests/Unit/UnitTest.php:25

FAILURES!
Tests: 1, Assertions: 2, Failures: 1.

Recursos