La base de datos es parte de nuestra aplicación por lo que también debe formar parte de las pruebas. Ya que sino las pruebas estarán incompletas y dejaran un agujero en la calidad de nuestro software.

Las pruebas a una base de datos deben hacerse de manera aislada. ¿Que pasaría si una prueba corrompe la base de datos? Nuestro entorno de desarrollo se vería afectado y las siguientes ejecuciones de otras pruebas podrían fallar. Por lo que habría que solucionar el problema restaurando la base de datos. Seguro que nadie quiere molestarse en perder tiempo volviendo a un estado fiable de la base de datos.

Un par de cosas a tener en mente a la hora de realizar las pruebas, que sean cortas y concisas; y que la base de datos no tenga gran cantidad de datos (salvo que sea necesario) para poder ejecutar las pruebas rápidamente.

Para lograr iniciar las pruebas siempre en el mismo estado y por ende que los cambios no se reflejen en la base de datos, tenemos que usar Doctrine Fixtures. Los fixtures permiten definir los datos que necesitamos para una ejecución correcta de las pruebas. Estos deben ir definidos en la ruta AcmeBundle/DataFixtures/ORM, y su definición es bastante sencilla.

fixture.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class LoadMediaData extends AbstractFixture implements OrderedFixtureInterface
{

public function load(ObjectManager $manager)
{

$certification = new Certification();
$certification->setCode('PG-13');
$manager->persist($certification);

$person = new Person();
$person->setName('Test person');
$manager->persist($person);

$movie = new Movie();
$movie->setOriginalName('Test movie');
$manager->persist($movie);

$cast = new MovieHasPerson();
$cast->setPerson($person);
$cast->setMovie($movie);
$cast->setCharacterName('Test name');
$manager->persist($cast);

$manager->flush();


$this->addReference('movie-test', $movie);
}

public function getOrder()
{

return 1;
}
}

Como podemos ver se crean cuatro objetos certification, person, movie y cast. Cada uno de ellos definidos en sus correspondientes entidades, creándolos y manipulándolos como en cualquier otra parte de nuestra aplicación. Se añade una referencia al objeto movie para poder acceder a el desde otro fixture. Y finalmente se indica el orden de carga (en getOrder) del fixture, para evitar violar las restricciones de la base de datos.

Ya con los fixtures creados podemos cargarlos en el entorno de pruebas, para ello hay que cambiar sobrescribir en config_test los parámetros de conexión a la base de datos.

config_test.yml
1
doctrine:
    dbal:
        driver:   pdo_mysql
        host:     localhost
        port:     
        dbname:   db_test
        user:     user
        password: pass
        charset:  UTF8

Y por ultimo hice un pequeño shell script con las ordenes para borrar el esquema actual, crear uno nuevo y cargar los datos.

1
2
3
4
cd /path/to/your/project
php app/console doctrine:schema:drop --env test --force
php app/console doctrine:schema:create --env test
php app/console doctrine:fixtures:load --env test

Con eso ya tenemos listo nuestro entorno de pruebas.