Exécuter des tests dans une base de donnée éphémère avec symfony / Doctrine
Vous cherchez comment faire pour que vos test unitaire (phpunit où autres…) s’exécutent sur une base de donnée neuve (MySql, SQLite… peu importe) à chaque fois (avec chargement des fixtures) ? Simple. Suivez l’exemple.
Dans votre fichier databases.yml, vous pouvez donner une configuration particulière à l’environnement de test :
test: poney: param: #dsn: "sqlite::memory:" #dsn: mysql:host=127.0.0.1;dbname=poney dsn: sqlite:///%SF_DATA_DIR%/poney.db?mode=0666
Tous l’intérêt de cette petite note technique réside dans le bout de code qui suit, qui va réinitialiser la base de donnée de test à chaque fois que vous lancerez vos tests :
define('SF_APP_NAME', 'backend'); define('SF_ENV', 'test'); define('SF_CONN', 'poney'); if ( SF_APP_NAME != '' ) { require_once(dirname(__FILE__).'/../../../../config/ProjectConfiguration.class.php'); myTestClass::$configuration = ProjectConfiguration::getApplicationConfiguration( SF_APP_NAME , SF_ENV, true); sfContext::createInstance(myTestClass::$configuration); } class myTestClass { public static $configuration = null; public static $databaseManager = null; public static $connection = null; protected static function setup() { if (self::$configuration) { self::$databaseManager = new sfDatabaseManager(self::$configuration); $doctrine = new sfDoctrineBuildTask(self::$configuration->getEventDispatcher(), new sfAnsiColorFormatter()); $doctrine->setConfiguration(self::$configuration); $doctrine->run(array(), array("--db --and-load --no-confirmation --env=test")); if (SF_CONN) self::$connection = self::$databaseManager->getDatabase(SF_CONN); } else { throw new Exception("Unable to load the Database"); } } ... ETC
On lance en fait la task doctrine:build directement via le PHP, avec la très importante option « —env=test » qui évite d’écraser votre base de donnée de travail :-)
A vous de vous inspirer de ce code pour vos propres tests, il y a plein de possibilités (voir les lignes commentées dans le databases.yml) :
- On peux utiliser une base de donnée éphémère en RAM
- Utiliser une base MySQL classique, ou oracle, ou n’importe quoi qui est supporté par Doctrine
- On peux choisir de charger des fixtures spécifique, ou pas…
Bref vous êtes les maitres du monde. Ce code est utilisé ici avec symfony 1.4 et phpunit.