Как Symfony загружает тестовую среду для сквозных тестов?

0

Я работаю над другим проектом PHP, который использует сквозные тесты и.env файлы. Однако перед запуском тестов мне нужно изменить.env файл, чтобы указать на тестовую базу данных (вместо базы разработки). Когда я работаю над проектами Symfony, я не думаю, что мне это нужно, он просто автоматически загружает тестовую среду.

Из предыдущего опыта работы со старыми версиями я знаю, что раньше для каждой среды использовался свой фронт-контроллер, напримерapp.php ,app_dev.php и т.д., но, черт возьми, сейчас это не так.

Как Symfony узнает, что нужно загрузить тестовую среду для сквозных тестов?

Теги:
phpunit
CodeFix

2 ответа

1
Лучший ответ

Гибкий рецептphpunit-bridge включает в себя phpunit.xmlфайл, который устанавливаетAPP_ENV переменная дляtest . Это заставляет symfony загрузить соответствующий.env.test файл.

Во время тестов фронт-контроллер обычно не используется, так как мост создает экземплярRequest объект и передает его непосредственно ядру приложения. Но в сквозных тестах с использованиемPantherTestCase , фреймворк загружает проект на встроенный веб-сервер PHP, который по-прежнему контролируется переменными среды.

Это лучше объясняется в книге, чем в главе о тестировании самой документации:

The $client variable simulates a browser. Instead of making HTTP calls to the server though, it calls the Symfony application directly. This strategy has several benefits: it is much faster than having round-trips between the client and the server, but it also allows the tests to introspect the state of the services after each HTTP request.

И в анонсе Пантеры :

However, WebTestCase doesn’t use a real web browser. It simulates one with pure PHP components. It doesn’t even use the HTTP protocol: it creates instances of HttpFoundation’s Request objects, pass them to the Symfony kernel, and allows to assert on the HttpFoundation Response instance returned by the app.
[...]
Under the hood Panther has:

  • started your project with the built-in PHP webserver on localhost:9000
  • started the version of Chromedriver shipped with the library to automate your local Chrome
  • executed the browsing scenario defined in the test with Chrome in headless mode
Поделиться
Источник
  • 0
    Так вы говорите, что когда я запускаю любой WebTestCase он запускает новый процесс PHP с сервером для прослушивания запросов? У вас есть информация о том, где это происходит?
  • 0
    @mickadoo Нет, WebTestCase не использует внутренний веб-сервер, он инсталлирует Request и напрямую передает его ядру приложения, фактических HTTP-запросов нет. Но PantherTestCase использует веб-сервер, и APP_ENV прежнему применяется.
  • 0
    Спасибо за ответ, теперь немного яснее. Я не понимал, как это работает для PantherTestCase поскольку я представлял, что это будет что-то вроде отправки запросов на локальный сервер, но кажется, что Symfony раскручивает свой собственный сервер, поэтому сможет установить для этого переменные env
  • 0
    @mickadoo Я включил несколько ссылок и цитат, которые касаются этих вопросов.
1

Какая среда для использования обычно устанавливается вphpunit.xml.dist .

Это больше относится к PhpUnit, чем к Symfony.

У вас должна быть запись вроде:

<php>
    <server name="APP_ENV" value="test" force="true" />
<!-- ... -->
</php>

Используяforce=true , он переопределит значение любого существующегоAPP_ENV переменная окружения.

WebTestCase будет "моделировать" запросы, как описано здесь . Если вы используете что-то вроде Panther, тесты запустят внутренний веб-сервер и сделают «настоящие» HTTP-запросы, как описано здесь .

В любом случаеAPP_ENV Приложение использует тот, который определен в конфигурации PhpUnit.

Поделиться
Источник
  • 0
    Я видел, что вы можете довольно легко установить переменные env в тестах. Но для сквозных тестов это отдельный процесс (если я правильно понимаю), и поэтому он будет обрабатываться как любой другой запрос. Возможно, мое впечатление о WebTestCase неверно, я представлял, что он отправит что-то вроде запроса на завиток, но, возможно, этого вообще не происходит
  • 0
    Переменные среды, установленные PhpUnit , логически влияют на принимающую сторону запроса. Не имеет значения, что он делает настоящий запрос или внутренний запрос (этот вид теста может выполнить и то, и другое ). Но отвечая на ваш вопрос: как "Symfony" знает, какую среду загружать? Используя переменную среды APP_ENV, установленную PhpUnit.
  • 0
    Извините, если я немного не успеваю понять это, но если я представляю, что тест e2e похож на отправку запроса curl, тогда он не может просто решить установить переменные среды на сервере. Сервер будет просто обслуживать запрос как обычно (насколько я понимаю). Я понимаю, что PHPUnit может загружать переменные среды для процесса PHPUnit, но я представил, что процесс обработки запроса отличается от этого.
  • 0
    Если вы используете тестирование Symfony (как вы упомянули в своем вопросе), запросы моделируются, а не «настоящие» тесты e2e. И это нормально, поскольку с точки зрения клиента ответ неотличим от реальных ответов. Если вам нужны «настоящие» тесты e2e, тестирующие все промежуточные уровни инфраструктуры, тогда вам необходимо настроить их с соответствующими переменными среды (настроить реальный веб-сервер, настроить реальный сервер PHP, настроить настоящая БД и тесты настройки для запуска чего-то вроде Panther, чтобы делать реальные запросы и анализировать ответы).
  • 0
    Но даже при использовании PantherTestCase (который выполняет «настоящие» HTTP-запросы) в конечном итоге запускается внутренний веб-сервер и используется настройка APP_ENV в конфигурации PhpUnit.
  • 0
    Хорошо, я предполагаю, что ответ заключается в том, что использование WebTestCase не то же самое, что запуск HTTP-запросов на ваш локальный сервер разработки (но каким-то образом зная, что нужно загрузить тестовый env). Из того, что вы говорите, WebTestCase либо обработает запрос внутренне, либо создаст новый сервер, используя тестовые переменные env. Звучит правильно? Изменить : я взглянул на Panther, и он подтвердился, в файле readme упоминается: «В тестовом режиме Panther автоматически запускает ваше приложение с использованием встроенного веб-сервера PHP».
  • 1
    WebTestCase не запускает внутренний веб-сервер. Имитирует запросы. Чтобы запускать настоящие HTTP-запросы, вам понадобится что-то еще, например Panther. Я добавил это к ответу и упомянул в своем предыдущем комментарии.

Другие вопросы

CodeFix
Цитата дня

"Завидую тестировщикам: все хотят с ними дружить."

Эндрю Таненбаум