2016-07-16 35 views
2

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

Antwort

1

Wenn Sie setzen Bereinigung: wahre in Ihren Laravel5 Moduleinstellungen alle Datenbankabfragen in der Transaktion ausgeführt werden werden, die gerollt wird Zurück am Ende des Tests, also ist dies eine Möglichkeit, Änderungen in Ihrer realen DB zu verhindern.

Stellen Sie außerdem sicher, dass Sie über den neuesten DB-Dump in Tests/_data/dump.sql verfügen. Sie Einstellungen für das Db-Modul sollten cleanup: true die Datenbank nach jedem Test zu reinigen, halten Sie Ihre realen Daten intakt, und nicht sicher, warum Sie nach jedem Test erneut mit der Datenbank verbinden müssen Reconnect: true aber wahrscheinlich brauche es nicht.

+0

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

+0

Die Dokumentation zur Codeception, auf die ich Bezug genommen habe: http://codeception.com/docs/09-Data – Aref

+0

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

4

Da Ihre Laravel-App unter mehreren Domänen ausgeführt werden kann, erstellen Sie eine dedizierte für Ihre Akzeptanztests und konfigurieren Sie den Server, um die Umgebungsvariable APP_ENV=acceptance (oder wie Sie es nennen) für diese bestimmte Domäne festzulegen. Wenn APP_ENV eingestellt ist, lädt Laravel automatisch die richtige Umgebungsdatei für Sie, in diesem Fall .env.acceptance.

Ich habe auch Leute gesehen, die Cookies verwenden (die zu Beginn der Akzeptanztests eingestellt wurden), um Laravel so zu konfigurieren, dass er Datenbanken basierend auf diesen Cookies umstellt. Es scheint ein wenig schmutzig und möglicherweise unsicher, und Sie fügen schließlich Code zu Ihrer Anwendung Kern so ...