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

2 ответа
Гибкий рецепт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
Какая среда для использования обычно устанавливается в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.
Другие вопросы
- Проблемы с установкой sylius / product-bundle в мой проект Symfony 5.3 с помощью composer1 ответ
Я пытаюсь разработать проект, но у меня возникают проблемы с установкой Sylius с помощью composer. Вот мойcomposer.json{ "type": "project", "license": "proprietary", "minimum-stability": "dev", "prefer-stable": tru...
- Функция клавиатуры работает только один раз для первой буквы ввода2 ответ
У меня есть текстовый ввод, где пользователь вводит желаемое имя страницы<input type='text' id='pageName' name='PageName' class='form-control pageName'> Я пытаюсь использовать функцию keyup для запуска Ajax, чтобы проверить, существует ли страница, однако при вводе чего-то вродеindex Ajax от...
- Выпадающее меню автозаполнения на основе значения другого поля в mysql php1 ответ
У меня было два раскрывающихся меню: одно - со многими кастами, а другое - с сообществом. Если я выберу касту, в раскрывающемся поле сообщества должно быть показано эквивалентное сообщество. Как мне это сделать?
- ajax дважды загружает данные из базы данных с помощью laravel php1 ответ
привет, я пытаюсь загрузить данные из базы данных с помощью ajax. но данные загружаются дважды на страницу html.<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $('button').click(function(){ $.ajax({ ...
- Могу ли я получить конкретное значение JSON по идентификатору?3 ответ
Я хотел бы, чтобы соответствующая дата typeId: 11 выводилась из следующего JSON. Порядок typeId всегда разный, поэтому не всегда получается, например, всегда обращаться ко второму значению. { "page": 1, "totalsCount": 1, "isLastPage": true, "last...
- WordPress: получение заголовка сообщения с идентификатором1 ответ
у меня естьACF relationship field называетсяvan_range_type .van_range_type показывает сообщения изrangecustom post type . В этом типе сообщений у меня есть три сообщения со следующими идентификаторами Диапазон 1 (ID: 116 ) Диапазон 2 (ID: 163 ) Диапазон 3 (ID: 164 ) У меня есть еще один тип сообщени...

"Завидую тестировщикам: все хотят с ними дружить."
WebTestCase
он запускает новый процесс PHP с сервером для прослушивания запросов? У вас есть информация о том, где это происходит? mickadooWebTestCase
не использует внутренний веб-сервер, он инсталлируетRequest
и напрямую передает его ядру приложения, фактических HTTP-запросов нет. НоPantherTestCase
использует веб-сервер, иAPP_ENV
прежнему применяется. msg