Blog de Gonzalo

PRUEBAS UNITARIAS CON PHPUNIT

En este post voy a hablar de las pruebas unitarias con phpunit.
Una prueba unitaria consiste en comprobar el correcto funcionamiento de una funcionalidad desarrollada. Por ejemplo si se ha programado la funcionalidad de añadir usuarios a una plataforma, se harían varias pruebas unitarias para saber si los usuarios se guardan bien en la plataforma.
En php se pueden relizar dichas pruebas unitarias usando la herramienta PhpUnit, framework creado por Sebastian Bergmann.
PHPunit también se usa para pruebas tdd.
PhpUnit utiliza aserciones para verificar que el comportamiento de la funcionalidad que hay que probar. El objetivo de las pruebas unitarias es demostrar que funcionamiento de cada funcionalidad es correcta y encuentran problemas en las fases iniciales del desarrollo de software.
Después de esta pequeña introducción voy a hablar de PhpUnit:

  • Las pruebas se realizan en clases cuyo nombre va seguido de la palabra Test: UserTest, PurchaseTest, etc...
  • Dicha clase hereda de TestCase.
  • Las pruebas son métodos públicos y toman como nombre test: testAddUser,testDeleteProduct, etc...
  • También se pueden usar anotaciones en el método que se quiere probar.
  • Dentro de los métodos de prueba están las aserciones, que se usan para determinar si el resultado coincide con lo esperado.

Ejemplo de una prueba sencilla:

use PHPUnit\Framework\TestCase;
class StackTest extends TestCase
{
    public function testPushAndPop()
    {
        $stack = [];
        $this->assertSame(0, count($stack));

        array_push($stack, 'foo');
        $this->assertSame('foo', $stack[count($stack)-1]);
        $this->assertSame(1, count($stack));

        $this->assertSame('foo', array_pop($stack));
        $this->assertSame(0, count($stack));
    }
}

PhpUnit permite probar un método o métodos que tienen dependencias con otros métodos, ya que la mayoría de funcionalidades dependen de varios métodos y no de uno solo, para indicar la dependencia se usa la anotación @depends.
Ejemplo de prueba con dependencias:

use PHPUnit\Framework\TestCase;

class StackTest extends TestCase
{
    public function testEmpty()
    {
        $stack = [];
        $this->assertEmpty($stack);

        return $stack;
    }

    /**
     * @depends testEmpty
     */
    public function testPush(array $stack)
    {
        array_push($stack, 'foo');
        $this->assertSame('foo', $stack[count($stack)-1]);
        $this->assertNotEmpty($stack);

        return $stack;
    }

    /**
     * @depends testPush
     */
    public function testPop(array $stack)
    {
        $this->assertSame('foo', array_pop($stack));
        $this->assertEmpty($stack);
    }
}

Cuando he visto algún ejemplo de PHPUnit casi todas las pruebas eran poniendo los datos "a capón" en las pruebas. En PHPUnit se pueden definir dataProviders, de forma parecida a las dependencias:

use PHPUnit\Framework\TestCase;

class DataTest extends TestCase
{
    /**
     * @dataProvider additionProvider
     */
    public function testAdd($a, $b, $expected)
    {
        $this->assertSame($expected, $a + $b);
    }

    public function additionProvider()
    {
        return [
            [0, 0, 0],
            [0, 1, 1],
            [1, 0, 1],
            [1, 1, 3]
        ];
    }
}

Donde la anotación @dataProvider indica que método proporciona los datos a la prueba en este caso additionProvider.
Por último decir que para lanzar las pruebas hay que ir a la línea de comandos y ejecutar: phpunit nombreClaseTest.php y se mostrará el resultado de las pruebas.
Os recomiendo leer sobre los pruebas dobles con PHPUnit y las fixtures con PHPUnit.

Compartir en twitter