Configurar banco de dados de teste para testes de aceitação no Codeception (Laravel)
Estou usando o framework Codeception para executar testes de aceitação no aplicativo Laravel 5. Eu queria usar um banco de dados separado para teste para impedir que o banco de dados real fosse alterado nos testes. Eu configurei os arquivos .yml com base na documentação do Codeception. Mas o banco de dados real é afetado de qualquer maneira. Estes são meus arquivos de configuração:
/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
O realDB é o banco de dados real e é alterado após a execução do teste de aceitação. Tentei casos diferentes para limpeza no accept.suite.yml: 1) limpeza: false no módulo Laravel e limpeza: true no módulo Db 2) limpeza: true no módulo Laravel e limpeza: true no módulo Db. A documentação de codecepção diz que, para o teste de aceitação, precisamos "desativar a limpeza e usar o módulo Db para limpar os testes entre os bancos de dados". Mas o realDB muda de qualquer maneira.
Eu tentei diferentes estruturas de teste para PHP, como PHPUnit no Laravel, driver PHP Selenium, driver da Web do Facebook e, em todos os casos, o banco de dados real é afetado ao executar testes de aceitação. Como posso configurar corretamente o Codeception para evitar alterações no banco de dados?
Qualquer ajuda seria apreciada.
[UPDATE1]
Como o @TheFallen sugeriu que eu use bancos de dados diferentes para teste, altero os arquivos de configuração assim:
/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,
],
...
O .env.testing está localizado na raiz do aplicativo Laravel. Mas o banco de dados real (realDB) ainda é afetado e apenas o arquivo de despejo é importado no banco de dados de teste (testDB). Parece que o aplicativo não usa .env.testing. Como posso consertar isso?
Observe que uma solicitação AJAX é enviada para chamar uma função que altera os dados no banco de dados no meu teste de aceitação. Desejo reverter as transações do banco de dados feitas por solicitações AJAX.
[UPDATE2]
De acordo comDocumentação de codecepção, Os testes de aceitação serão executados no ambiente de desenvolvimento usando um servidor da Web real, para que as configurações de .env.testing não possam ser transmitidas a eles. :(
Depois de tudo o que fiz para resolver esse problema, concluo que é impossível impedir que o banco de dados real seja alterado após a execução de testes de aceitação, acionando solicitações AJAX para executar transações do banco de dados, a menos que eu altere o banco de dados padrão para testar um no arquivo .env!
Se alguém tiver uma solução melhor, compartilhe-a!