Я использую среду Codeception для выполнения приемочных тестов в приложении Laravel 5. Я хотел использовать отдельную базу данных для тестирования, чтобы предотвратить изменение реальной базы данных во время тестирования. Я настроил файлы .yml на основе документации Codeception. Но на настоящую базу данных все равно влияют. Это мои конфигурационные файлы:
/codeception.yml
actor: Tester
paths:
tests: tests
log: tests/_output
data: tests/_data
support: tests/_support
envs: tests/_envs
settings:
bootstrap: _bootstrap.php
colors: true
memory_limit: 1024M
extensions:
enabled:
- Codeception\Extension\RunFailed
modules:
config:
Db:
dsn: 'mysql:host=localhost;dbname=realDB'
user: 'root'
password: 'secret'
dump: 'tests/_data/dump.sql'
/tests/acceptance.suite.yml
class_name: AcceptanceTester
modules:
enabled:
- WebDriver:
url: 'http://localhost:8000/'
browser: firefox
- Laravel5:
part: ORM
cleanup: false # can't wrap into transaction
Db:
populate: true
cleanup: true
- \Helper\Acceptance
RealDB — это реальная база данных, и она изменяется после выполнения приемочного теста. Я пробовал разные варианты очистки в accept.suite.yml: 1) cleanup: false в модуле Laravel и cleanup: true в модуле Db 2) cleanup: true в модуле Laravel и cleanup: true в модуле Db. В документации Codeception говорится, что для приемочного теста нам необходимо «отключить очистку и использовать модуль Db для очистки базы данных между тестами». Но realDB все равно меняется.
Я пробовал разные тестовые среды для PHP, такие как PHPUnit в Laravel, драйвер PHP Selenium, веб-драйвер Facebook и во всех случаях действительная база данных влияла на выполнение приемочных тестов. Как правильно настроить Codeception, чтобы предотвратить изменения базы данных?
Любая помощь будет оценена.
[Update1]
Поскольку @TheFallen предложила использовать другую базу данных для тестирования, я изменяю файлы конфигурации следующим образом:
/codeception.yml
actor: Tester
paths:
tests: tests
log: tests/_output
data: tests/_data
support: tests/_support
envs: tests/_envs
settings:
bootstrap: _bootstrap.php
colors: true
memory_limit: 1024M
extensions:
enabled:
- Codeception\Extension\RunFailed
modules:
config:
Db:
dsn: 'mysql:host=localhost;dbname=testDB'
user: 'root'
password: 'secret'
dump: 'tests/_data/dump.sql'
/tests/acceptance.suite.yml
class_name: AcceptanceTester
modules:
enabled:
- WebDriver:
url: 'http://localhost:8000/'
browser: firefox
- Laravel5:
part: ORM
environment_file: .env.testing
cleanup: true
Db:
populate: true
cleanup: true
- \Helper\Acceptance
/.env.testing
APPLICATION_URL=http://localhost:8000
APP_DEBUG=true
APP_ENV = testing
MYSQL_MAIN_HOST=localhost
MYSQL_MAIN_DATABASE=realDB
MYSQL_MAIN_USER=root
MYSQL_MAIN_PASSWORD=secret
CACHE_DRIVER=array
DB_CONNECTION=test_mysql
TEST_MYSQL_MAIN_DATABASE=testDB
/config/database.php
return [
'fetch' => PDO::FETCH_CLASS,
'default' => env('DB_CONNECTION', 'mysql'),
'connections' => [
'test_mysql' => [
'driver' => 'mysql',
'host' => env('MYSQL_MAIN_HOST', 'localhost'),
'database' => env('TEST_MYSQL_MAIN_DATABASE', 'testDB'),
'username' => env('MYSQL_MAIN_USER', 'root'),
'password' => env('MYSQL_MAIN_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
...
.Env.testing находится в корне приложения Laravel.
Но реальная база данных (realDB) по-прежнему страдает, и в тестовую базу данных (testDB) импортируется только файл дампа. Похоже, приложение не использует .env.testing. Как я могу это исправить?
Обратите внимание, что в моем приемочном тесте отправляется запрос AJAX для вызова функции, изменяющей данные в базе данных. Я хочу откатить транзакции базы данных, сделанные AJAX-запросами.
[UPDATE2]
В соответствии с Документация по кодам, Приемочные тесты будут выполняться в среде разработки с использованием реального веб-сервера, поэтому настройки из .env.testing не могут быть им переданы. 🙁
После всего, что я сделал для решения этой проблемы, я заключаю, что невозможно предотвратить изменение реальной базы данных после выполнения приемочных тестов, запускающих запросы AJAX для выполнения транзакций базы данных, если я не изменю базу данных по умолчанию на тестирование базы данных в файле .env!
Если у кого-то есть лучшее решение, пожалуйста, поделитесь им!
Поскольку ваше приложение Laravel может работать в нескольких доменах, создайте один, предназначенный для ваших приемочных тестов, и настройте сервер для установки переменной среды. APP_ENV=acceptance
(или как вы это называете) для этого конкретного домена. когда APP_ENV
Laravel автоматически загрузит нужный вам файл окружения, в этом случае .env.acceptance
,
Я также видел людей, использующих файлы cookie (установленные в начале приемочных тестов) для настройки Laravel для переключения баз данных на основе этих файлов cookie. Это выглядит немного грязно и потенциально небезопасно, плюс вы добавляете код в ядро своего приложения, так что …
Если вы установите очистка: правда в настройках вашего модуля Laravel5 все запросы к базе данных будут выполняться в транзакции, которая будет отменена в конце теста. Так что это один из способов предотвратить изменения в вашей реальной БД.
Также убедитесь, что у вас есть последний дамп базы данных в Тесты / _data / dump.sql. У тебя настройки для модуля Db должны быть очистка: правда очищать базу данных после каждого теста, сохраняя ваши настоящие данные нетронутыми, и не уверен, почему вам нужно повторно подключаться к базе данных после каждого теста с переподключение: правда но вам, вероятно, это не нужно.