2013-06-30 3 views
2

У меня есть приложение Zend Framework (версия 1.11), которое использует Doctrine 2. У меня есть PHPUnit, настроенный для запуска тестов на моих моделях и формах и еще много чего. Тесты отлично работают, но есть одна проблема: они оставляют тестовые данные в базе данных после их завершения. Вот основной пример одного из моих тестов:PHPUnit: как я могу удалить тестовые данные из моей базы данных после завершения тестов?

class VisaTypeEntityTest extends ModelTestCase 
{ 
    public function testCanSaveAndRetrieveVisaType() 
    { 
     $addVisaType = new \Entities\VisaTypes(); 
     $addVisaType->setEnglishName('Test Visa Type') 
      ->setJapaneseName('試し') 
      ->setKanaName('タメシ') 
      ->setDescription('Description of the test visa type'); 

     $this->em->persist($addVisaType); 
     $this->em->flush(); 

     $getVisaType = $this->em->getRepository('\Entities\VisaTypes') 
      ->findOneByEnglishName('Test Visa Type'); 

     $this->assertEquals('Test Visa Type', $getVisaType->getEnglishName()); 
    } 
} 

Очевидно, что данные должны быть фактически введены в базу данных для того, чтобы убедиться, что все кошерно. Но я не хочу, чтобы все тестовые данные собирали базу данных каждый раз, когда я запускаю тест, и я не хочу идти и вручную удалять его.

Есть ли что-то, что я могу сделать, например, используя метод tearDown(), чтобы избавиться от тестовых данных после завершения теста? И если да, возможно ли «откат» автоматических приращений в полях идентификаторов таблиц до того, что они были заранее? Я знаю, что на самом деле не имеет значения, есть ли пробелы между идентификаторами, но если есть способ заставить Doctrine сбросить значение автоматического увеличения, это было бы здорово.

+0

Какую базу вы используете? Mysql? Если да, то какой механизм хранения? MyISAM или InnoDB? –

+0

База данных MySql, двигатель хранения InnoDb. – blainarmstrong

ответ

5

1. Что касается «очистки»:

Поскольку вы используете InnoDB вы можете использовать транзакции для восстановления БД в том же состоянии, как это было до того, как тест начал:

Так setUp() вы должны добавить $this->em->getConnection()->beginTransaction(); и в tearDown()$this->em->getConnection()->rollback(); Это восстанавливает базу данных в предыдущем состоянии. Также ознакомьтесь с руководством по MySQL на «The InnoDB Transaction Model and Locking», чтобы убедиться, что это не мешает другим данным в вашем приложении (ключевое слово: уровень изоляции).

2. Что касается Отката авто инкремента идентификаторов:

Насколько я знаю, это не (легко) возможно. There is a thread about it on SO, в котором указано, что ваше приложение не должно заботиться о наличии пробелов между идентификаторами автоматического увеличения. Если вы используете тестовую базу данных (это очень рекомендуется), это должно быть еще меньше.

+0

Это имеет большой смысл. Благодаря! – blainarmstrong

+0

Теперь еще один вопрос: как лучше всего использовать тестовую базу данных? Есть ли какая-то функциональность, которая создает «зеркало» текущей базы данных для тестирования, или мне нужно создать ее самостоятельно? – blainarmstrong

+1

Существует несколько вариантов, в зависимости от типа данных и объема данных. Например, вы можете использовать файл схемы db, который создает пустую тестовую базу данных или регулярно создает базу данных dev/test из резервных файлов. –

Смежные вопросы