Я использую схему 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 и очистка: true в модуле Db 2) cleanup: true в модуле Laravel и очистка: true в модуле Db. В документации по кодированию говорится, что для приемочного теста нам необходимо «отключить очистку и использовать модуль Db для очистки баз данных». Но realDB все равно меняется.
Я пробовал различные тестовые рамки для PHP, такие как PHPUnit в Laravel, PHP Selenium driver, веб-драйвер 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]
Согласно документации Codeception , приемочные тесты будут выполняться в среде разработки с использованием реального веб-сервера, поэтому настройки из .env.testing не могут быть переданы им. 🙁
После всего, что я сделал для решения этой проблемы, я пришел к выводу, что невозможно изменить реальную базу данных после выполнения приемочных тестов, запускающих запросы AJAX для выполнения транзакций базы данных, если я не изменю базу данных по умолчанию для тестирования в файле .env!
Если у кого-то есть лучшее решение, пожалуйста, поделитесь им!
Так как ваше приложение Laravel может работать под несколькими доменами, создайте один, предназначенный для ваших приемочных тестов, и настройте сервер, чтобы установить переменную окружения APP_ENV=acceptance
(или как вы это называете) для данного конкретного домена. Когда APP_ENV
установлен, Laravel автоматически загрузит для вас нужный файл окружения, в данном случае .env.acceptance
.
Я также видел, как люди использовали куки-файлы (установленные в начале приемочных тестов), чтобы настроить Laravel на использование баз данных на основе этих файлов cookie. Это кажется немного грязным и потенциально небезопасным, плюс вы в конечном итоге добавляете код в ваше ядро приложения, поэтому …
Если вы установите очистку: true в настройках модуля Laravel5, все запросы к базе данных будут выполняться в транзакции, которая будет откат в конце теста. Таким образом, это один из способов предотвратить изменения в вашей реальной БД.
Также убедитесь, что у вас есть последний дамп DB в тестах / _data / dump.sql . Установки для модуля Db должны быть очищены : true, чтобы очистить базу данных после каждого теста, сохраняя ваши реальные данные в целости и не уверен, почему вам нужно повторно подключиться к базе данных после каждого теста с повторным подключением: true, но вам, вероятно, не нужно Это.