Le 12/07/2010 dans symfony

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.