Configurar la base de datos de prueba para las pruebas de aceptación en Codeception (Laravel)
Estoy usando el marco de Codeception para realizar pruebas de aceptación en la aplicación Laravel 5. Quería usar una base de datos separada para las pruebas para evitar que la base de datos real cambie a través de las pruebas. Confundí los archivos .yml basados en la documentación de Codeception. Pero la base de datos real se ve afectada de todos modos. Estos son mis archivos de configuración:
/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
El realDB es la base de datos real y cambia después de realizar la prueba de aceptación. Intenté diferentes casos de limpieza en accept.suite.yml: 1) limpieza: falso en el módulo Laravel y limpieza: verdadero en el módulo Db 2) limpieza: verdadero en el módulo Laravel y limpieza: verdadero en el módulo Db. La documentación de codecepción dice que para la prueba de aceptación, necesitamos "deshabilitar la limpieza y usar el módulo Db para limpiar la base de datos entre las pruebas". Pero el realDB cambia de todos modos.
He probado diferentes marcos de prueba para PHP, como PHPUnit en Laravel, el controlador PHP Selenium, el controlador web de Facebook y, en todos los casos, la base de datos real se ve afectada al realizar pruebas de aceptación. ¿Cómo puedo configurar correctamente Codeception para evitar cambios en la base de datos?
Cualquier ayuda sería apreciada.
[ACTUALIZACIÓN1]
Como @TheFallen sugirió que usara una base de datos diferente para las pruebas, cambio los archivos de configuración de esta manera:
/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,
],
...
El .env.testing se encuentra en la raíz de la aplicación Laravel. Pero la base de datos real (realDB) todavía se ve afectada y solo el archivo de volcado se importa en la base de datos de prueba (testDB). Parece que la aplicación no usa .env.testing. ¿Cómo puedo arreglar esto?
Tenga en cuenta que, se envía una solicitud AJAX para llamar a una función que cambia datos en la base de datos en mi prueba de aceptación. Quiero revertir las transacciones de la base de datos realizadas por solicitudes AJAX.
[ACTUALIZACIÓN2]
De acuerdo aDocumentación de codecepción, Las pruebas de aceptación se ejecutarán en un entorno de desarrollo utilizando un servidor web real, por lo que no se les puede pasar la configuración de .env.testing. :(
Después de todo lo que he hecho para resolver este problema, concluyo que es imposible evitar que la base de datos real cambie después de realizar pruebas de aceptación que desencadenan solicitudes de AJAX para realizar transacciones de la base de datos a menos que cambie la base de datos predeterminada para probar una en el archivo .env.
Si alguien tiene una mejor solución, ¡compártala!