Настройка тестовой базы данных для приемочных тестов в 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!

Если у кого-то есть лучшее решение, пожалуйста, поделитесь им!

2

Решение

Поскольку ваше приложение Laravel может работать в нескольких доменах, создайте один, предназначенный для ваших приемочных тестов, и настройте сервер для установки переменной среды. APP_ENV=acceptance (или как вы это называете) для этого конкретного домена. когда APP_ENV Laravel автоматически загрузит нужный вам файл окружения, в этом случае .env.acceptance,

Я также видел людей, использующих файлы cookie (установленные в начале приемочных тестов) для настройки Laravel для переключения баз данных на основе этих файлов cookie. Это выглядит немного грязно и потенциально небезопасно, плюс вы добавляете код в ядро ​​своего приложения, так что …

4

Другие решения

Если вы установите очистка: правда в настройках вашего модуля Laravel5 все запросы к базе данных будут выполняться в транзакции, которая будет отменена в конце теста. Так что это один из способов предотвратить изменения в вашей реальной БД.

Также убедитесь, что у вас есть последний дамп базы данных в Тесты / _data / dump.sql. У тебя настройки для модуля Db должны быть очистка: правда очищать базу данных после каждого теста, сохраняя ваши настоящие данные нетронутыми, и не уверен, почему вам нужно повторно подключаться к базе данных после каждого теста с переподключение: правда но вам, вероятно, это не нужно.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector