2010-10-20 2 views
3

Я тестирую, что функция правильно добавляет данные в db, но я хочу, чтобы тестовые данные были удалены после завершения теста. Если тест завершился неудачно, он прекратит работу и не сможет удалить тестовые строки.Как заставить PHPUnit что-то сделать, если утверждение не выполнено

Это единственный тест, который попадает в db, поэтому я действительно не хочу ничего делать в методе tearDown().

Я тестирую метод типа $ obj-> save(), который сохраняет данные, проанализированные из плоского файла.

+0

Вместо изгиба PHPUnit, может быть, ваш тест будет работать над CREATE TEMPORARY TABLE? (Предполагая, что вы не разрабатываете базу данных.) – mario

+0

Тогда мне пришлось бы сгибать фактический PHP-код, я тестирую метод типа $ obj-> save(). В итоге я вызвал save(), запросив db и сохранил результаты в переменной, удалив тестовые данные, а затем, наконец, сделав утверждения. Я чувствую, что phpunit имеет что-то, что позволяет вам запускать немного кода при сбое теста, хотя я просто не могу найти его в документах для жизни меня. –

ответ

2

Вы должны использовать отдельные базы данных для разработки/производства и тестирования. Они идентичны по структуре, но каждый раз, когда вы выполняете тестирование, вы бросаете тестовый db и восстанавливаете его с некоторых источников данных. Дело в том, что таким образом вы можете быть абсолютно уверены, что ваш db содержит один и тот же набор данных каждый раз, когда вы запускаете свои тесты. Поэтому удаление тестовых данных не имеет большого значения.

+0

Я согласен с тем, как это должно быть сделано, я не могу представить, как убедить мой офис, чтобы начать делать это. –

2

Вы используете предложенный подход для тестирования базы данных через Database Testcase Extension?

В принципе, если тест терпит неудачу (читай, если это не ошибка, что делает PHPUnit выход), не должно быть никаких проблем, так как база данных высевают на запуске TestCase:

по умолчанию реализация в PHPUnit автоматически обрезает все указанные таблицы и затем вставляет данные из вашего набора данных в порядке, указанном набором данных.

поэтому не нужно делать это вручную. Даже если есть ошибка, PHPUnit очистит таблицу при следующем запуске.

2

Если ваша база данных поддерживает транзакции, вы можете запустить start_transaction в начале теста. Если тест завершился неудачно (заставив программу выйти), будет выполнен неявный откат и отменит ваши изменения. Если тест преуспеет, выполните явный откат.

Еще один вариант - обернуть утверждения в предложении try-catch - это предотвратит остановку теста (а также другие автоматические функции, такие как захват скриншотов), и вы можете делать все, что вам нужно с этой точки.

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