2013-06-03 5 views
8

Wir haben etwa 180 Unit Tests implementieren webtestcase Klasse und Tests laufen über Controller.PDO-Verbindung ist nicht geschlossen, wenn phpunit läuft mit Symfony 2.X

Wenn wir jedoch die Komponententests ausführen, öffnen sie zu viele Verbindungen zu db. Aufgrund von zu vielen aktiven TCP-Verbindungstest sind nach 120. Test fehlgeschlagen. Alle Verbindungen sind aktiv, während Tests ausgeführt werden.

In der TearDown-Funktion rufen wir die Close-Funktion des Entity Managers auf, aber es gibt nichts, das hat keinen Einfluss. Es gibt einige Klassen, die den Verweis auf das Verbindungsobjekt beibehalten, denke ich.

Da in PHP-Handbuch erwähnt über pdo Verbindung geschlossen, wenn das Objekt auf Null zugewiesen ist. Wir machen das auch, aber keine Änderungen. P.S: Unsere Komponententests sind Funktionstests. Works über Controller und integriert mit db, gibt es keine Mock-Objekte

Wo ist unser Fehler? Wie können wir das Problem beheben?

Diese meine Verbindungsparameter in config_test.yml

imports: 
    - { resource: config_dev.yml } 

framework: 
    test: ~ 
    session: 
     storage_id: session.storage.mock_file 

web_profiler: 
    toolbar: false 
    intercept_redirects: false 

doctrine: 
    dbal: 
     driver: pdo_mysql 
     port: 3306 
     host: localhost 
     dbname: mydb 
     user: myuser 
     password: mypass 
     charset: UTF8 
+0

Können wir sehen, wie Sie Ihre Verbindung innerhalb der Datei config.yml und/oder parameters.yml definieren? – j0k

+0

@ j0k Ich habe zu Frage – GirginSoft

+0

hinzugefügt Ich hatte ähnliches Problem vor einiger Zeit. Das Problem ist aufgrund einer nicht abgeschlossenen Transaktion aufgetreten. Verwenden Sie explizit Transaktion (ich meine Begin-Commit/Rollback)? Wenn ja, stellen Sie sicher, dass Sie es immer beenden. – Cyprian

Antwort

6

Haben Sie Ihr phpunit.xml.dist Datei überprüfen?

Ich denke, Sie sollten sich das ansehen; http://www.slideshare.net/fabpot/unit-and-functional-testing-with-symfony2

Seien Sie sicher, dass Ihre Parameter gleich sind unter

<phpunit 
    backupGlobals    = "false" 
    backupStaticAttributes  = "false" 
    colors      = "true" 
    convertErrorsToExceptions = "true" 
    convertNoticesToExceptions = "true" 
    convertWarningsToExceptions = "true" 
    processIsolation   = "true" 
    stopOnFailure    = "false" 
    syntaxCheck     = "false" 
    bootstrap     = "bootstrap.php.cache" > 
+0

Vielen Dank. Ich habe die Lösung gefunden. Anscheinend verursachte der Parameter processIsolation das Problem. Es war ein falscher, wegen dieser ganzen Tests arbeiten an einem Prozess und ich denke, dass es Parameter beibehalten hat. Aber nachdem ich es in wahr geändert habe, wurden die Verbindungen nach jedem Test geschlossen. @bulutcagatay – GirginSoft

+1

Interessant, dass dies ein weiteres Problem bringt: "Uncaught PDOException: Sie können PDO-Instanzen nicht serialisieren oder unsialisieren". –

3

Aktivieren der Prozessisolation wird den Nebeneffekt, so dass die Testsuite unsinnig viel langsamer auszuführen haben.

Ein besserer Ansatz ist es, nur explizit zu sagen Lehre seine Verbindungen zu schließen, entweder auf Test tearDown, tearDownAfterClass oder jede Methode als solche kommentiert, wie zum Beispiel:

trait CloseConnectionAfterTestTrait { 
    /** @after */ 
    public function avoidExhaustingDbConnections() 
    { 
     if(!empty($this->em)){ 
      $this->em->getConnection()->close(); 
     } 
    } 
} 

In diesem Beispiel ist es an der Verbraucher zu speichern, was Entity Manager Instanz er hat als $this->em. Aber wenn Sie Doctrine verwenden, können Sie den Code möglicherweise besser verallgemeinern, indem Sie über static::$kernel->something auf den Doctrine-Service zugreifen.

+0

Ich habe den Code hinzugefügt, um die Verbindung nach jedem Test zu schließen - aber immer noch keinen Effekt ... – naneri

Verwandte Themen