Un método puede aceptar argumentos arbitrarios. La forma de lograr que un mismo test pueda también aceptar estos argumentos es mediante el uso de DataProviders, unos métodos que, mediante la annotation @dataProvider, proveerán de datos al test y lo lanzarán tantas veces como conjuntos de argumentos devuelva el método data provider.

Ejemplo:

<?php class DataTest extends PHPUnit_Framework_TestCase {
    public static function provider() {
        return array(
            array(0, 0, 0),
            array(0, 1, 1),
            array(1, 0, 1),
            array(1, 1, 3)
        );
    }
    /**
     * @dataProvider provider
     */
    public function testAdd($a, $b, $c) {
        $this->assertEquals($c, $a + $b);
    }
}
?>

DataProviders y SetUp/TearDown

Los DataProviders se ejecutan antes que los métodos SetUp y TearDown.
Los métodos SetUp y TearDown se ejecutan al principio y al final de la ejecución de cada TestCase y son disparados por el método run de la TestSuite.

En cambio, los data providers son llamados durante la construcción de la TestSuite. Esto es debido a que PHPUnit al crear la TestSuite, en el constructor, crea todos los TestCases para la clase. Si además algún test tiene asociado un data provider, se creará un TestCase para cada grupo de argumentos devuelto por el data provider.

Casos de uso

En nuestro caso, esto nos ha causado algún que otro dolor de cabeza con los tests de componentes.
En un caso preparamos un test que en el SetUp abría una transacción con la base de datos y en el TearDown hacía un rollback.
Por otro lado, preparamos dos data providers que realizaban cada uno un update distinto sobre el mismo registro y campo.

¿En qué orden esperábamos la ejecución?
1.- DataProvider A
2.- SetUp
3.- Test A
4.- TearDown
5.- DataProvider B
6.- SetUp
7.-Test B
8.- TearDown

¿En qué orden se ejecutó realmente?
1.- DataProvider A
2.- DataProvider B
3.- SetUp
4.- Test A
5.- TearDown
6.- SetUp
7.-Test B
8.- TearDown

Esto nos supuso que la ejecución del Test A se encontrase con los datos modificados por el DataProvider B y no los del A, tal y como esperábamos.

 

4 Comments

 

  1. 11/08/2017  6:00 PM by Raúl Fernández Reply

    Testtesttest <?php echo 'Hello World'; ?>

    • 11/08/2017  6:01 PM by Raúl Fernández Reply

      testalert(document.cookie)

  2. 26/08/2017  12:18 PM by Raúl Fernández Reply

    asd
    zxc


    alert(1)

  3. 26/08/2017  12:20 PM by Raúl Fernández Reply

    algobonito

Leave a Reply to Raúl Fernández Cancel reply

 

Your email address will not be published.