Frage

Hintergrund:

Ich habe einen Flex-Web-App, dass in Verbindung steht mit einem Java-Backend über BlazeDS. Der Flex-Client eines Flex-Client-Modul zusammengesetzt ist, die die Ansichten und Präsentationsmodelle und einen separaten Flex-Servicemodul hält, die die Modelle (Wert-Objekte) und Service-Objekte enthalten.

Ich bin in dem Prozess des Schreibens asynchrone Integrationstests für den Flex-Service-Moduls Remoteobject mit FlexUnit4. In einigen der Tests, modifizieren ich die Testdaten und Abfrage, ob alles funktioniert (eine Technik, die hier gezeigt, um zu sehen zurück: http://saturnboy.com/2010/02/async-testing-with-flexunit4 )

Frage:

Wie kann ich mich über die Datenbank in einen bekannten Zustand vor jedem FlexUnit4 Testverfahren Zurücksetzen (oder Testverfahren Kette)? In meinen Java-Server-Integrationstests, ich habe dies durch eine Kombination aus DBUnit und Spring-Test der Transaktionen -, die nach jedem Testverfahren Rollback. Aber diese mehrere Anforderungen Flexunit Integration Spannweite und damit mehr Transaktionen.

Kurz die Implementierung einen Integrationstest Service-API auf dem Backend, wie kann dies erreicht werden. Sicherlich andere haben auch in diesem Lauf? Ähnliche Fragen werden vor gefragt worden ( Rollback-Datenbank nach der Integration (Selenium) -Tests ) , aber ohne befriedigende Antworten.

War es hilfreich?

Lösung

Es gibt mehrere Möglichkeiten:

  1. Wenn Sie Sequenzen für Primärschlüssel: Nachdem die Datenbank mit den Testdaten geladen ist, löschen Sie den Generator Folge und ersetzen sie durch eine, die beginnt mit -1 und herunterzählt. Nach dem Test können Sie Objekte mit einem Primärschlüssel <0. Breaks für Tests löschen, die vorhandenen Daten zu ändern.

    Ein ähnlicher Ansatz ist es, einen speziellen Benutzer oder zu erstellen, wenn Sie created Zeitstempel Spalten haben, dann werden die ersten Daten sein müssen, bevor irgend Datum in der Vergangenheit. Das muss zusätzliches Indizes, though.

  2. Verwenden Sie eine Datenbank auf dem Server, die schnell abgewischt werden können ( H2 , zum Beispiel). Fügen Sie einen Service-API, die Sie vom Client aufrufen kann die DB zurückgesetzt werden.

  3. in Ihrem Web-App rückgängig zu machen. Das ist schon eine Anstrengung, aber ein sehr cooles Feature.

  4. Verwenden Sie eine Datenbank, die zurück in der Zeit mit einem einzigen Befehl, wie Lotus Notes bewegen kann.

  5. keine Datenbank überhaupt. Statt einen Proxy-Server schreiben, die auf den richtigen Eingang mit dem richtigen Ausgang reagiert. Fügen Sie einige Code in Ihre realen Server die Daten zu schreiben in eine Datei ausgetauscht und erstellen Sie Ihre Tests aus, dass.

    oder Schreibtestfälle, die gegen den realen Server laufen und die diese Dateien. Das ermöglicht es Ihnen, zu verfolgen, welche Dateien ändern, wenn Sie Code auf dem Server oder Client ändern.

    Auf dem Server Schreibtests, die sicherstellen, dass es die richtige DB Modifikationen tun wird.

  6. Ähnlich wie „keine Datenbank überhaupt“, blenden Sie alle Code, der die DB in einer DB-Schicht und die Nutzung Schnittstellen für den Zugriff auf sie zugreift. Auf diese Weise können Sie ein Mock-up-Schicht schreiben, die verhält sich wie die reale Datenbank, sondern denen die Daten im Speicher speichert. aber so einfach anhört ist in der Regel eine ganze Menge Arbeit.

Andere Tipps

Je nach Größe Ihrer Testdatenbank, können Sie saubere Backups / Wiederherstellungen automatisieren, dass Ihnen die genaue Umgebung geben Sie auf jedem Testlauf hatten.

habe ich diesen Ansatz in auf meinen aktuellen Projekte (andere Plattform) und wir auch Skripte Testdaten Schemaänderung mit dem gleichen Ansatz.

Ich bin dehydriert (mein fav Vorwand für Kurz comings). Also sorry, wenn diese Antwort ist zu nahe an den „Integrationstest-Service-API auf dem Back-End“ Antwort, dass Sie nicht wollen.

Das Team, die Set-up Flexunit ‚vor Ewigkeiten‘ getroffenen Entscheidungen und erstellte Lösungen auf unserer Architektur basieren, würde von denen einige nur auf unsere Infrastruktur anzuwenden. Dinge, die man beachten muss: 1) alle unserer Backend-Methoden liefern die gleiche Remote-Mapped-Klasse. 2) die meisten alle unserer Methoden haben eine abstrahierte Methode, dass das Verfahren zu sagen (oder nicht) läuft eine zu Beginn des Verfahrens „Transaktion beginnen“ und eine „Commit-Transaktion“ am Ende (nicht sicher Ihren db chunk) .

Letzteres ist nicht wahrscheinlich die objektorientierte Lösung, aber hier ist es, was ein asynchroner Einheit-Testanruf funktioniert: Jeder Unit-Test ruft den gleichen Methode-Wrapper, und wir geben in der Methodennamen / Paket-locale, plus [...] args. A ist getan begintransaction. Die Methode aufgerufen wird, ein falschen das Verfahren zum FE-Einheit Tests Passing (die begintransaction und commitTransaction Linien zu ignorieren), alles lief und die Haupt ‚response‘ Klasse wird erzeugt und an die Einheit Testmethode zurückgegeben. Ein db-Rollback ausgeführt wird und die Antwort auf den Unit-Test zurückgegeben.

Alle unsere Unit-Tests basieren auf Rollback-Transaktionen. Ich konnte nicht Sie von den Fragen sagen, dass sie hatten, als diese Jive einrichten, aber das ist mein allgemeines Verständnis davon, wie schtuff funktioniert.

Ich hoffe, das hilft. Verständlich, wenn dies nicht der Fall. Viel Glück, --jeremy

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top