#phpunit
#phpunit
Вопрос:
В настоящее время мы запускаем код для настройки базы данных в setUpBeforeClass. Однако это выполняется перед тестированием каждого тестового класса. Возможно ли запустить код один раз перед запуском любых тестов и, возможно, запустить некоторый код, когда все тесты также будут завершены?
Комментарии:
1. У меня такая же потребность: инициировать мою базу данных перед запуском тестов. Можете ли вы опубликовать ответ с вашим подробным решением?
Ответ №1:
Это именно то, для чего предназначен файл bootstrap. По умолчанию PHPUnit выполнит код в bootstrap.php
в текущем каталоге. Вы можете использовать phpunit.xml
файл конфигурации или --bootstrap
переключатель командной строки, чтобы указать на другой файл.
Этот файл выполняется ровно один раз, прежде чем пытаться найти тесты, которые нужно запустить. Это позволяет вам настроить путь включения, автозагрузчик, константы и т.д. Перед созданием экземпляра или запуском любых тестов.
Комментарии:
1. Это то, что я искал. Кто-то упомянул об этом мне вчера. Я не знаю, почему я не подумал об этом.
Ответ №2:
Я согласен с комментарием Криса о том, что вы хотите избежать такого поведения, но если вам нужно, возможно, вы могли бы сделать что-то вроде этого:
class My_PHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase {
function __construct() {
parent::__construct();
// Insert your one time setup scripts here
}
}
Затем убедитесь, что ваши тесты расширяют My_PHPUnit_Framework_TestCase вместо PHPUnit_Framework_TestCase.
Комментарии:
1. Насколько я понимаю, это было бы эквивалентно setUpBeforeClass
2. На самом деле, все тестовые примеры создаются перед выполнением любых методов тестирования — по одному для каждого метода тестирования на набор данных и по одному дополнительному экземпляру для каждого метода с
@dataProvider
. Если вы переопределяете конструктор, вы должны убедиться, что также принимаете и передаете три параметра.3. @SubOne, это не эквивалентно setUpBeforeClass , это функция statuc
Ответ №3:
Зачем вам это нужно? Модульные тесты должны быть независимыми друг от друга, и, следовательно, все предварительные условия также должны быть восстановлены в одно и то же состояние перед запуском каждого теста.
Если вы чувствуете необходимость иметь метод инициализации, который выполняется один раз для всего набора, ваши тесты, вероятно, настроены неправильно.
Комментарии:
1. Мы хотим запустить базу данных и удалить ее один раз, а не для каждого теста. У нас есть транзакции для изоляции тестов.
2. Хотя я согласен с вами в принципе, для этого есть много законных причин, одним из таких примеров является то, что упомянул @SubOne. Я тестирую Laravel через Travis. CI и мне нужно запустить сценарии создания базы данных, чтобы убедиться, что у нее есть подходящая среда для тестирования.