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:
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:
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,
[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. [Test]DALLayerTests.ShouldReadARowAndCreatePOCO()
, aber die meisten anderen, die gespottete Daten verwendet haben, um zu testen, was tatsächlich passiert, z. %Code%.Tags und Links database integration-testing acceptance-testing specflow