Ich renne mit PHPUnit / DBUnit in echte Geschwindigkeitsprobleme. Alles, was PHPUnit_Extensions_Database_TestCase
verlängert, dauert ewig. Mit 189 Tests dauert die Suite etwa 8-9 Minuten. Ich habe gehofft, dass es höchstens 30 Sekunden dauern würde ;-)
Es sieht so aus, als würde die Wiederherstellung der Datenbank in ihren Anfangszustand der Prozess sein, der sich die Zeit nimmt. Daher haben wir unsere Datensätze so klein wie möglich gemacht und die Anzahl der Tabellen begrenzt, die wir für jeden Testfall benötigen. Ich verwende Geräte und teile so viel wie möglich.
Gibt es irgendwelche Einstellungen oder Modifikationen, die ich verwenden kann, um die Ausführung zu beschleunigen? Wenn man sich anschaut, was der MySQL-Server während der Tests macht, scheint viel abgeschnitten / eingefügt zu werden, aber sicherlich wäre es schneller, die Testdatensätze in temporäre Tabellen zu packen und sie dann einfach für jeden Test auszuwählen.
>Der Treiber, den ich verwende, ist PDO / MySQL mit einem XML-Test-Dataset.
Beim Googeln habe ich es geschafft, die Zeit von 10 Minuten auf eine Minute zu reduzieren. Es stellt sich heraus, dass das Ändern einiger InnoDB-Konfigurationseinstellungen in my.ini / my.cnf helfen kann.
Einstellung innodb_flush_log_at_trx_commit = 2
scheint die Aufgabe zu erledigen. Nachdem Sie es geändert haben, starten Sie Ihren MySQL-Server neu.
Mehr zu dev.mysql.com: innodb_flush_log_at_trx_commit
Die Einstellung steuert, wie ACID die Spülung der Protokolle erfüllt. Der Standardwert ist 1, was eine vollständige ACID-Konformität bedeutet, dh
Der Protokollpuffer wird bei jedem Transaktions-Commit in die Protokolldatei geschrieben, und die Operation "Flush to Disk" wird für die Protokolldatei ausgeführt.
Bei einem Wert von 2 passiert Folgendes:
Der Protokollpuffer wird bei jedem Festschreiben in die Datei geschrieben, aber die Flush to Disk-Operation wird nicht ausgeführt.
Der Hauptunterschied besteht darin, dass ein Betriebssystemabsturz oder ein Stromausfall das Löschen des Protokolls verhindern kann, da das Protokoll nicht bei jedem Commit ausgeschrieben wird. Für die Produktion bleiben Sie bei einem Wert von 1. Für die lokale Entwicklung mit einer Testdatenbank sollte der Wert 2 sicher sein.
Wenn Sie mit Daten arbeiten, die in die Live-Datenbank übertragen werden, würde ich vorschlagen, den Wert 1 beizubehalten.
Die Fixture-Erstellung in DbUnit ist extrem langsam. Es dauert 1,5 Sekunden jedes Mal mit core2duo e8400 4 GB Kingston 1333. Sie können den Engpass mit xdebug finden und reparieren (wenn Sie können), oder Sie können einen der folgenden Schritte ausführen:
1.)
Sie können nur Testdateien ausführen, die Sie derzeit mit einem benutzerdefinierten Bootstrap-XML entwickeln:
%Vor%Der Ausschlussteil ist hier wichtig. Sie können auch Testgruppen verwenden.
2.)
%Vor% Sie können den Testfall überschreiben. In diesem Beispiel verwenden Sie nur eine PDO-Verbindung für jeden Testfall (Sie können es mit Abhängigkeitsinjektion in Ihren Code injizieren). Durch Überschreiben des Einrichtungsvorgangs können Sie das Fixture nur einmal pro Testfall oder nur einmal für jeden Test setzen (abhängig von self::
oder $cls = get_class($this); $cls::
). (PHPUnit hat ein schlechtes Design, es erzeugt bei jedem Testanruf eine neue Instanz, also müssen Sie mit den Klassennamen hacken, um Variablen pro Instanz oder pro Klasse zu speichern.) In diesem Szenario müssen Sie die Tests so schreiben, dass sie mit% co_de voneinander abhängen % Annotation. Zum Beispiel können Sie die gleiche Zeile löschen, die Sie im vorherigen Test erstellt haben.
Mit diesem Testcode @depend
anstelle von 1.5 secs
:
3.)
Eine andere Lösung, um die Fixture nur einmal pro Projekt zu erstellen, und danach jeden Test in Transaktionen und Rollback nach jedem Test zu verwenden. (Dies funktioniert nicht, wenn Sie einen verzögerten pgsql-Code haben, der Commit benötigt, um die Einschränkungen zu überprüfen.)
Tags und Links unit-testing php phpunit pdo dbunit