SpecFlow-Integrationstest mit Datenbankmustern

8

Ich versuche, SpecFlow für die Integration / Abnahmetests einzurichten. Unser Produkt hat eine Backup-Datenbank (keine große) in Sqlite.

Dies erweist sich jedoch tatsächlich als ein etwas klebriger Punkt; Wie modelliere ich die Datenbank für die Tests?

Ich würde gerne wissen, welche Muster andere da draußen verwenden, um Integrations- / Akzeptanztests mit unterstützenden Datenbanken durchzuführen.

Ich kann mir folgende Ansätze vorstellen:

  1. Kompilieren Sie eine Datenbank mit den Tests in die Assembly, und kopieren Sie sie dann für jeden Test. Scheint langsam.
  2. Ich könnte die Datenbank im Speicher erstellen und sie mit vordefinierten Daten füllen.
  3. Ich könnte die Datenbank im Speicher erstellen und irgendwie Givens die Datenbank füllen. Es scheint, als würde es die Tests fürchterlich aufblähen, aber es könnte ihnen mehr Kontrolle geben und die Tests weniger anfällig machen.
  4. Ich könnte jede Datenbankinteraktion abstrahieren und Mocks verwenden. Ich bin nicht in diese Idee verliebt, da ich damit auch die Datenbankinteraktionen testen möchte.
  5. Kompilieren Sie die Datenbank in die Tests und verlassen Sie sich auf Clean-up-Code, um sie in den Basiszustand zurückzubringen (dieser scheint mir zweitrangig). Ich möchte es nicht mit Transaktionen machen, da es mehrere Interaktionen mit einigen Tests geben wird (also schreibe ein Element und versuche es mit verschiedenen Privilegien wieder zu lesen).
jpwkeeper 11.06.2013, 14:50
quelle

1 Antwort

4

Bevor Sie das How zum Testen in Betracht ziehen, denke ich, dass es für Sie wertvoll sein könnte, Was Sie testen möchten.

Beginnend mit , welche Daten , finde ich, dass es wirklich ein einzelnes Element oder eine kleine Zahl, und stellen Sie die richtigen Testdaten zu nehmen hilft eine Reihe von Ereignissen um sie herum zu geben, um zu Führen Sie Ihre Tests mit. Zum Beispiel:

  • Wenn Sie an einem Gesundheitssystem arbeiteten, könnten Sie eine Person "Bob" definieren und dann seine Lebensereignisse erstellen. Bob wurde heute vor 37 Jahren geboren, fiel als Kind von seinem Fahrrad und brach sich den Arm, heiratete und hat zwei Kinder.
  • Wenn Sie an einem Finanzhandelssystem arbeiten, können Sie sich einen Tag zwischen dem Öffnen und dem Schließen für ein paar Aktien ansehen, z. "MSFT" und "APPL". An diesem Tag könntest du einen Anfang niedrig und klettern sehen, der andere hoch und fallend. Eine Nachricht kommt heraus, die ihr Vermögen umkehrt.

Jetzt haben Sie das, was Sie tatsächlich auswerten können, welche Ihrer Szenarien tatsächlich für Ihre Daten arbeiten, z. "MSFT" und "APPL" könnten im Laufe des Tages tausende von Preisänderungen aufweisen, so dass die Erstellung der Givens und Mocks sehr zeitaufwendig wäre. Diese Daten eignen sich dazu, vorab erfasst zu werden. Auf der anderen Seite funktionieren die "Bob" -Daten besonders gut, wenn generierte Daten verwendet werden, da sich die Daten immer ändern können, so dass sie heute Geburtstag haben.

Eine Sache, die Ihre Frage nicht zu berücksichtigen scheint, ist die Aktualisierung Ihrer Daten. Zum Beispiel möchten Sie möglicherweise eine Reihe von Tests, die in verschiedenen Phasen des Lebenszyklus Ihrer Entitäten arbeiten, z. Einige Tests befassen sich mit "Baby Bob", andere mit "10-jährigen Bob" oder "Married Bob" usw. Wenn Ihre DB nur gelesen wird, dann ist das kein Problem, wenn Sie Ihre Tests schreiben können, so dass sie es nicht tun sehen Sie die anderen Daten, aber manchmal möchten Sie eine Geschichte durch Ihre Tests erstellen. Wenn Sie Ihre Tests die Daten ändern sich, dann werden Sie Probleme haben, sicherzustellen, dass entweder Ihre Tests laufen, um (siehe MSTest OrderedTest oder MbUnit DependsOn), oder dass Sie Ihre Tests trennen können, so dass sie jedes Geschäft mit einer isolierten Dateneinheit (das ist in Ordnung, wenn Ihr Unternehmen in einer einzigen Zeile beschrieben werden kann, aber wird noch schwieriger, wenn Sie lesen müssen viele Tabellen, um es zu bekommen).

Sie sollten auch prüfen, welcher Code Sie testen möchten. Sie können den Ansatz in Ihren verschiedenen Testsets variieren. Ich arbeite derzeit an einer mehrschichtigen Anwendung mit Ansichten, Modellansichten, Clientmodellen, mehreren Kommunikationssystemen und Servermodellen. Ich habe auch verschiedene Tests für diese. Ich habe einige Tests, die auf einer einzigen Ebene funktionieren und andere Ebenen ausspotten, um meine Tests klein zu halten. Andere Tests starten einen lokalen Server und einen lokalen Client und verbinden die beiden direkt miteinander. Schließlich habe ich einige Tests, die einen vollständigen Serverprozess starten, über EMS kommunizieren und einige einfache clientseitige Operationen ausführen, die alles außer den UI-Ansichten verwenden.

Um nun Ihre Frage zu beantworten,

  1. Shadow kopieren Sie Ihre Datenbank - Ja, ich habe dies einmal mit SQLServer Developer gemacht und hatte eine xxx.mdb, die vor dem Ausführen der Tests kopiert wurde. Einige moderne Test-Frameworks werden jedoch Tests parallel ausführen, z. NCrunch , das bricht einfach.
  2. Erstellen Sie die Datenbank und füllen Sie sie vorher aus - Dies ist noch nicht geschehen, aber meine Bedenken würden sich ergeben, wenn ein Test die Datenbank in einen unerwarteten Zustand versetzt. Andere Tests werden fehlschlagen, wenn sie nichts falsch gemacht haben.
  3. die Datenbank Erstellen und Verwenden von Givens - Ich habe dies über [SetupFixture] mit NUnit getan auf einem Linq-to-SQL DB.You haben noch Bedenken über parallele Testläufe und Sie haben die Balance Granularität Ihrer Givens (siehe Stackoverflow-Wann BDD Szenarien zu spezifisch werden ), und Sie haben Probleme bei der Datenaktualisierung und der Datenisolierung, aber dies kann sehr gut funktionieren, damit Sie Ihre Datenberichte bearbeiten und die Daten während der Tests erweitern können. Auf der anderen Seite, wenn ein Test fehlschlägt und die Daten in einem schlechten Zustand belassen, können Sie mit vielen Fehlern enden, aber zumindest müssen Sie nur den Fehler zuerst betrachten. Diese Art von Tests wird auch sehr gut spielen wird nicht für Entwickler auf ihrer Workstation, da sie nicht nur einen einzigen Test ausgeführt werden können, insbesondere mit Werkzeugen wie NCrunch, die nur Tests ausführen können, dessen Code geändert hat.
  4. Verspotten Sie die Datenbank So wähle ich jetzt Dinge aus. Der Trick besteht darin, dass Sie, wenn Sie persönlich einem ziemlich strengen TDD-Prozess folgen, bei dem Sie nur die Methode testen, an der Sie gerade arbeiten, am Ende einige Stufen haben, die die Datenbankinteraktion testen, z. [Test]DALLayerTests.ShouldReadARowAndCreatePOCO() , aber die meisten anderen, die gespottete Daten verwendet haben, um zu testen, was tatsächlich passiert, z. %Code%.
  5. Benutze Bereinigungscode - Habe es nie versucht, es klingt doof: -)
AlSki 12.06.2013 12:34
quelle