Ein Problem, auf das ich bei meinen Integrationstests stoßen werde, ist, dass mehrere Tests auf dieselbe Datenbank zugreifen. Obwohl dies jetzt kein Problem ist, weiß ich, dass wir hier mehrere Anwendungen haben, die auf dieselbe Datenbank zugreifen, und ich versuche nur, einen Weg zu finden, um dieses Problem zu verhindern, bevor es auftritt.
Eine Idee, die ich oft gesehen habe, ist die Verwendung von Transaktionen. Beim Start starten Sie eine Transaktion und beim Herunterfahren setzen Sie die Transaktion zurück. Dies bedeutet, dass mehrere Tests auf dieselben Datenbanktabellen zugreifen und sich nicht gegenseitig beeinflussen, was großartig ist. Das Problem, das ich habe, ist, dass in meinem Fall 85-95% der Tabellen, mit denen ich in MySQL arbeite, MyISAM sind, die keine Transaktionen unterstützen.
Gibt es Möglichkeiten, um Speicher-Engines zu umgehen, die keine Transaktionen unterstützen, aber dennoch mehreren Tests den Zugriff auf dieselben Tabellen ermöglichen, ohne dass sie sich gegenseitig beeinflussen? Soweit ich gehört habe, verwendet das Ruby on Rails-Testframework Transaktionen auf diese Weise. Wie umgehen sie dieses Problem (oder tun sie es)?
quelle
Antworten:
In meinem Unternehmen gab es diese Debatte: Persistenz ist ein großes Problem beim Testen.
Es gibt einige Hacks, die Sie auf halbem Weg bringen. Wir haben beschlossen, unsere Zeit mit ihnen nicht zu verlieren:
does
und dem Test aufrechtzuerhaltenundoes
. Sobald die Übereinstimmung nicht perfekt ist, die Symptome nicht klar sind, kann ein Test einige hundert Zeilen später fehlschlagen. oder ein Test, der fehlschlagen sollte, könnte fehlerhaft bestehen.Also sind wir zu einer Richtlinie übergegangen, von der wir wussten, dass sie gültig ist:
quelle
Auch wenn Sie keine "Transaktionen" im T-SQL-Sinne haben, sollten Sie sich dennoch bemühen, Ihre Transaktionen (im allgemeinen Sinne des Wortes) atomar zu gestalten. Die Tests sollten nicht aufeinander angewiesen sein und reversibel sein. Wenn Sie keinen offiziellen Rollback- oder Transaktionsumfang haben, möchten Sie möglicherweise Ihren eigenen erstellen. Sie können beispielsweise Ihre Komponententests eine Bereinigung durchführen lassen, bei der alle im Test erstellten Datensätze gelöscht werden.
quelle
Lassen Sie einfach jeden Benutzer oder jeden Lauf die verwendete Datenbank überschreiben. Das machen wir bei der Arbeit. Dann haben Sie nie Probleme mit 2 gleichzeitigen Tests, die sich gegenseitig stören.
Wir lassen bei jedem Testlauf die Datenbank mit Migrationen aufbauen, die Datenbank mit Fixtures füllen und sie am Ende wieder abreißen.
Wenn das DBMS Transaktionen unterstützt, verwenden wir dies als Optimierung für die Ersteinrichtung und den Abbau. Sie sind optional, obwohl Ihr Test ohne sie etwas länger dauern kann. Wie immer YYMV.
Keine Aufregung, kein Muss.
quelle