2015-08-12 15 views
6

Ich habe eine Basisklasse, die alle meine Controller-Tests erweitern. Dies ist so eingerichtet, dass jeder Komponententest seine eigene Fixture zum Laden haben kann.Wie man Play Framework eincheckt, wenn ein Komponententest eine Datenbank ausführt/update/delete

Also überprüft @Before override, welche Vorrichtung für den Test erforderlich ist, lade sie und starte dann den Test.

Das Problem hier ist, dass dies die Vorrichtung jedes Mal neu lädt. Selbst wenn die Methode nur eine Auswahl in der Datenbank vorgenommen hat und nichts geändert hat.

Die interne Speicherdatenbank, die Play Framework verwendet, ist die H2-Datenbank. Ich frage mich, ob es eine Möglichkeit gibt, nach einem Komponententest zu prüfen, ob es eine Änderung in der Datenbank gegeben hat, und wenn nicht, überspringe das erneute Laden genau der gleichen Daten.

Ich versuchte identity_scope, es gibt Null egal was.

+0

ich weiß nicht, ob es eine Möglichkeit, es mit nur JUnit zu erreichen, aber es ist ein Werkzeug, in dem Sie diese Belastungen problemlos verwalten können. Sein dbunit und du kannst es leicht im Spiel verwenden. Soweit ich sagen kann, besteht der Hauptzweck von Junit darin, Tests voneinander zu trennen. Aber ich sage nicht, dass das nicht möglich ist. Vielleicht könntest du es mit @BeforeClass in Kombination mit der Testsuite versuchen. –

+0

Ich schaute nach oben und es sieht so aus, als müsste ich alle meine bestehenden Unit-Tests umgestalten. Danke für den Vorschlag, aber ich kann nicht die Zeit dafür nehmen. – KdgDev

+0

Haben Sie erwogen, von der Speicherdatenbank in die tatsächliche physische Datenbank zu wechseln? –

Antwort

2

H2 hat keine Möglichkeit zu überprüfen, wann die letzten Änderungen vorgenommen wurden. aber Sie könnten nur eine zusätzliche Spalte machen, die mit

letzten Änderung spart Zeit
CREATE TABLE TEST(ID INT, NAME VARCHAR, LAST_MOD TIMESTAMP AS NOW()); 

Auf diese Weise Sie eine Zeit der Teststart retten konnte, und dann die DB-Abfrage, ob es irgendwelche Änderungsdaten nach dem Test Startzeit sind.

Ich sehe keine andere Möglichkeit

+0

Nun, es ist die beste Idee, denke ich, aber ich würde viel Zeit brauchen, um sicherzustellen, dass diese Spalten nur existieren, während Komponententests laufen und automatisch ausgefüllt werden, wenn ein Einfügevorgang stattfindet. Was mich erinnert: Was ist mit einem Löschen? Wie behalte ich den Überblick darüber, dass ein Löschvorgang stattgefunden hat? – KdgDev

+0

Mit der Abfrage, die ich gepostet habe, wird bei jeder Änderung automatisch der Zeitstempel in die tatsächliche Zeit geändert, da AS NOW() jedes Mal ausgeführt wird, wenn der Datensatz geändert wird. Das Erstellen eines zusätzlichen Felds für Tests ist keine gute Idee, aber ich würde sagen, dass eine zusätzliche Spalte für das gesamte Programm keinen großen Unterschied macht. Selbst wenn es nur zu Testzwecken wäre –

+0

Okay. Aber was ist mit dem Löschen einer Zeile in einem Test und dann erwarten, dass es in der nächsten sein wird? Und das funktioniert nur, wenn ich weiß, welchen Tisch ich testen soll. Was ich wirklich brauche, ist eine Möglichkeit festzustellen, ob eine Tabelle in der gesamten DB geändert wurde. – KdgDev