Ich verwende das Codeception-Framework, um Akzeptanztests in Laravel 5-Anwendungen durchzuführen. Ich wollte eine separate Datenbank zum Testen verwenden, um zu verhindern, dass sich echte Datenbanken durch Tests verändern. Ich habe die .yml-Dateien basierend auf Codeception-Dokumentation konfiguriert. Aber die reale Datenbank wird trotzdem beeinflusst. Dies ist meine Konfigurationsdateien:Setup-Testdatenbank für Akzeptanztests in Codeception (Laravel)
/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
Die realDB ist die eigentliche Datenbank und es ändert sich nach der Abnahmeprüfung durchführen. Ich habe verschiedene Fälle für die Bereinigung in acceptance.suite.yml ausprobiert: 1) cleanup: false in Laravel-Modul und cleanup: true im Db-Modul 2) cleanup: true im Laravel-Modul und cleanup: true im Db-Modul. Die Codeception-Dokumentation besagt, dass wir für den Abnahmetest "die Bereinigung deaktivieren und das DB-Modul verwenden müssen, um die Datenbank zwischen den Tests zu bereinigen". Aber die RealDB ändert sich sowieso.
Ich habe verschiedene Testframeworks für PHP wie PHPUnit in Laravel, PHP Selenium Treiber, Facebook Webtreiber ausprobiert und in allen Fällen wird die echte Datenbank beeinflusst, wenn ich Akzeptanztests durchführe. Wie kann ich Codeception korrekt konfigurieren, um Datenbankänderungen zu verhindern?
Jede Hilfe wäre willkommen.
[UPDATE1]
Als @TheFallen vorgeschlagen, dass ich andere Datenbank zum Testen verwenden, ich die Konfigurationsdateien wie folgt zu ändern:
/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,
],
...
Die .env.testing ist in der Wurzel von Laravel Anwendung befindet. Die reale Datenbank (realDB) wird jedoch immer noch beeinflusst und nur die Dump-Datei wird in die Testdatenbank (testDB) importiert. Es sieht so aus, als ob die Anwendung .env.testing nicht verwendet. Wie kann ich das beheben?
Bitte beachten Sie, dass eine AJAX-Anfrage gesendet wird, um eine Funktion aufzurufen, die Daten in der Datenbank in meinem Abnahmetest ändert. Ich möchte Datenbank-Transaktionen zurücksetzen, die von AJAX-Anforderungen ausgeführt werden.
[UPDATE2]
Nach Codeception documentation werden Abnahmetests in Entwicklungsumgebung ausgeführt werden unter Verwendung von echtem Web-Server, so dass Einstellungen von .env.testing kann nicht an sie übergeben werden.:(
Nach allem, was ich getan habe, um dieses Problem zu lösen, komme ich zu dem Schluss, dass es unmöglich ist, echte Datenbank von Änderungen nach Durchführung von Abnahmetests AJAX-Anforderungen zur Durchführung von Datenbanktransaktionen zu führen, es sei denn, ich ändere die Standarddatenbank zu testen ! in .env Datei
Wenn jemand eine bessere Lösung hat, bitte teilen
Vielen Dank für Ihren Vorschlag, aber es hat nicht funktioniert und Transaktionen in realDB Rollback nicht. Ich benutze den neuesten Db-Dump meiner RealDB und versuchte verschiedene Fälle: 1) Aufräumen: Falsch in Laravel-Modul und Aufräumen: True in Db-Modul 2) Aufräumen: True in Laravel-Modul und Aufräumen: True in Db-Modul. Die Codeception-Dokumentation besagt, dass wir für den Abnahmetest "die Bereinigung deaktivieren und das DB-Modul verwenden müssen, um die Datenbank zwischen den Tests zu bereinigen". Wenn das bedeutet, die Bereinigung im Db-Modul auf True zu setzen, funktioniert der Vorschlag nicht :(. Haben Sie weitere Vorschläge? – Aref
Die Dokumentation zur Codeception, auf die ich Bezug genommen habe: http://codeception.com/docs/09-Data – Aref
Dies sollte Ich benutze diese genauen Einstellungen für meine Codeception und es betrifft nicht meine reale DB. Da dies nicht für Sie funktioniert, kann ich vorschlagen, eine Test-DB zu verwenden, die ein Duplikat Ihres echten ist benutze es um eine Datei * .env.testing * zu erstellen, wo du deine Test-DB-Zugangsdaten ablegst und dann in dein Laravel5-Modul * environment_file: .env.testing *. – TheFallen