Frage

Wenn Sie mit Integrationstests tun, entweder nur Ihre Datenzugriffsschicht oder die Mehrheit der Anwendungsstapel. Was ist der beste Weg aus mehreren Tests verhindern miteinander kollidierende, wenn sie auf der gleichen Datenbank ausgeführt werden?

War es hilfreich?

Lösung

Transaktionen.

Was die Ruby on Rails Unit-Test-Framework tut, ist dies:

Load all fixture data.

For each test:

  BEGIN TRANSACTION

    # Yield control to user code

  ROLLBACK TRANSACTION

End for each

Das bedeutet, dass

  1. Alle Änderungen Ihr Test auf die Datenbank hat keine Auswirkungen auf andere Threads macht, während es im Gang ist
  2. Die Daten der nächste Test wird nicht durch vorherige Tests verschmutzt
  3. Hier geht es um zig-mal schneller als die Daten manuell für jeden Test neu zu laden.

ich für eine denke, das ist ziemlich cool

Andere Tipps

Für einfache Datenbankanwendungen I SQLite von unschätzbarem Wert verwenden. Es ermöglicht Ihnen, für jeden Test eine einzigartige und eigenständige Datenbank haben.

Allerdings funktioniert es nur, wenn Sie einfache generische SQL-Funktionalität sind oder können die kleinen Unterschiede zwischen SQLite und Produktionsdatenbank-System hinter einer Klasse leicht verstecken, aber ich habe immer gefunden, dass relativ einfach in den SQL-Anwendungen zu sein ich entwickelt habe.

Nur um Freies Gnus Antwort auf füge ich auch verwendet habe, HSQLDB einen ähnlichen Tests zu tun, wo jeder Test bekommt eine saubere Instanz der DB.

Ich wollte beide sind kostenlos Gnu akzeptieren und Orion Edwards Antworten, aber es würde mich nicht lassen. Der Grund, warum ich wollte, dies zu tun, ist, dass ich zu dem Schluss gekommen war, dass das waren die beiden wichtigsten Möglichkeiten, es zu tun, aber was ist, hängt vom Einzelfall ab (meist die Größe der Datenbank) zu wählen.

laufen auch die Tests zu unterschiedlichen Zeiten, so dass sie die Leistung und ihre Gültigkeit nicht miteinander auswirken.

Obwohl es nicht so klug wie die Rails Unit-Test-Framework in einer der anderen Antworten hier, die Schaffung unterschiedliche Daten pro Test oder eine Gruppe von Tests ist eine andere Art und Weise tun. Die Höhe der Langweiligkeit mit dieser Lösung hängt von der Anzahl der Testfälle Sie haben und wie abhängig sie aufeinander sind. Die Langweiligkeit wird wahr halten, wenn Sie eine Datenbank pro Test oder eine Gruppe von abhängigen Tests haben.

Wenn die Testsuite ausgeführt wird, laden Sie die Daten zu Beginn, die Testsuite ausführen, entladen / vergleichen Sie die Ergebnisse dafür, dass das tatsächliche Ergebnis das erwartete Ergebnis erfüllt. Falls nicht, um den Zyklus erneut tun. Last, führen Suite, entladen / vergleichen.

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