Настройка тестовой базы данных для приемочных тестов в Codeception (Laravel)
Я использую среду 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!
Если у кого-то есть лучшее решение, поделитесь им!