Ist es schlechte Praxis-Tests in einer Datenbank statt auf gefälschte Repositories zu laufen?

StackOverflow https://stackoverflow.com/questions/607620

Frage

Ich weiß, was die Vorteile sind und ich verwende gefälschte Daten, wenn ich mit komplexeren Systemen arbeitete.

Was passiert, wenn ich etwas zu entwickeln einfach und ich kann meine Umgebung in einer echten Datenbank und die Daten, auf die zugegriffen ist so klein, leicht eingerichtet, dass die Zugriffszeit kein Faktor ist, und ich bin nur ein paar Tests laufen.

Ist es immer noch wichtig, gefälschte Daten zu erstellen oder kann ich die zusätzliche Codierung vergessen und das Recht auf die reale Sache überspringen?

Als ich sagte, echte Datenbank, die ich nicht über eine Produktionsdatenbank bedeuten, ich meine eine Testdatenbank, sondern ein echtes Live-DBMS und das gleiche Schema wie die reale Datenbank.

War es hilfreich?

Lösung

Die Gründe gefälschte Daten zu verwenden, anstatt eines echten DB sind:

  1. Geschwindigkeit. Wenn Ihre Tests langsam gehst du nicht, sie laufen zu lassen. die DB Mocking können Ihre Tests laufen viel schneller als sie es sonst machen könnte.
  2. Kontrolle. Ihre Tests müssen die alleinige Quelle der Testdaten sein. Wenn Sie gefälschte Daten verwenden, wählen Sie Ihre Tests, welche fälscht werden Sie verwenden. So gibt es keine Chance, dass Ihre Tests sind verwöhnt, weil jemand die DB in einem unbekannten Zustand.
  3. Um die Unabhängigkeit. Wir wollen, dass unsere Tests überhaupt in beliebiger Reihenfolge runnable sein. Die Eingabe eines Test sollte auf den Ausgang eines anderen nicht ab. Wenn Sie Ihre Tests die Testdaten zu steuern, können die Tests unabhängig voneinander sein.
  4. Umwelt Unabhängigkeit. Ihre Tests sollten in jeder Umgebung runnable sein. Sie sollten sie laufen können, während auf dem Zug oder in einem Flugzeug oder zu Hause oder bei der Arbeit. Sie sollten nicht auf externe Dienste abhängen. Wenn Sie gefälschte Daten verwenden, benötigen Sie keine externe DB.

Wenn Sie nun eine kleine kleine Anwendung erstellen, und durch eine echte DB mit (wie MySQL) können Sie die oben genannten Ziele erreichen, dann mit allen Mitteln die DB verwenden. Ich mache. Aber keinen Fehler machen, wie Ihre Anwendung wächst werden Sie schließlich mit der Notwendigkeit, die DB zu verspotten konfrontiert werden. Das ist in Ordnung, tun Sie es, wenn Sie müssen. YAGNI. So stellen Sie sicher, dass Sie es tun tun, wenn Sie benötigen. Wenn Sie es gehen lassen, werden Sie bezahlen.

Andere Tipps

Es Art hängt, was Sie testen möchten. Oft Sie die eigentliche Logik in Ihrem Code nicht die Daten in der Datenbank testen wollen, so dass nur eine vollständige Datenbank einrichten, um Ihre Tests zu laufen ist eine Verschwendung von Zeit.

Sehen Sie sich auch die Menge der Arbeit, die in der Erhaltung Ihrer Tests und testdatabase geht. Ihren Code mit einer Datenbank zu testen häufig bedeutet, dass Ihre testen Ihre Anwendung als anstelle der verschiedenen Teile isoliert Ganzen. Dies wird oft in einer Menge Arbeit führen sowohl die Datenbank und Tests synchron zu halten.

Und das letzte Problem ist, dass der Test in Isolation ausgeführt werden soll, so sollte jeden Test entweder auf seiner eigenen Version der Datenbank ausgeführt werden oder es in genau demselben Zustand belassen, wie es war, bevor der Test lief. Dies schließt den Zustand nach einem gescheiterten Test.

Having said that, wenn Sie wirklich auf Ihre Datenbank testen Sie können. Es gibt Werkzeuge, die eine Datenbank Hilfe beim Einrichten und Abbauen, wie DBUnit .

Ich habe versucht, Leute gesehen, Unit-Test wie diese zu erstellen, aber fast immer dreht es viel mehr Arbeit heraus, dann ist es wirklich wert. Die meisten es während des Projekts auf halber Strecke verlassen, die meisten ttd vollständig während des Projekts zu verlassen, in der Regel die Erfahrung Transfer zum Unit-Tests zu denken.

So würde ich empfehlen, Tests einfach und isoliert und kapseln Sie den Code halten gut genug wird es möglich, Code in Isolation zu testen.

Ich denke, es hängt davon ab, ob Ihre Anfragen, die in dem Repository festgelegt sind (die bessere Option, IMO), oder ob das Repository macht zusammensetzbare Abfragen; zum Beispiel - wenn Sie eine Repository-Methode haben:

IQueryable<Customer> GetCustomers() {...}

Dann könnte Ihre UI anfordern:

var foo = GetCustomers().Where(x=>SomeUnmappedFunction(x));

bool SomeUnmappedFunction(Customer customer) {
   return customer.RegionId == 12345 && customer.Name.StartsWith("foo");
}

Dies wird für eine objektbasierte gefälschte Repo passieren, aber für ist db-Implementierungen scheitern. Natürlich können Sie diese zunichte machen durch das Repository alle Anfragen intern (keine externe Zusammensetzung) Griff aufweist; zum Beispiel:

Customer[] GetCustomers(int? regionId, string nameStartsWith, ...) {...}

Da dies nicht zusammengesetzt werden kann, können Sie die DB überprüfen und die unabhängig UI. Mit zusammensetzbare Abfragen werden Sie durch Integrationstests zu verwenden, gezwungen, wenn Sie es möchten, nützlich sein.

Es hängt vielmehr ab, ob die DB automatisch eingestellt wird durch den Test auf, auch, ob die Datenbank von anderen Entwicklern isoliert ist.

Im Moment kann es kein Problem sein (zum Beispiel nur einen Entwickler). Allerdings (für die manuelle Datenbankeinrichtung) Einrichten der Datenbank ist ein zusätzliches Hindernis Tests für das Laufen, und das ist eine sehr schlechte Sache.

Wenn Sie nur eine einfache einmalige Anwendung zu schreiben, die Sie unbedingt wissen, wird nicht wachsen, ich denke, eine Menge von „Best Practices“ gehen Sie einfach rechts aus dem Fenster.

Sie müssen nicht Notwendigkeit verwenden DI / IOC oder Unit-Tests haben oder Ihre DB-Zugriff verspotten, wenn alles, was Sie schreiben ist ein einfaches „Kontakt“ Formular. Doch wo die Grenze zwischen einem „einfach“ App und einem „Komplex“ zu zeichnen, ist schwierig.

Mit anderen Worten, verwenden Sie am besten Urteil, da es keine ist hieb- und stich gesetzt Antwort auf diese.

Es ist in Ordnung, dass für das Szenario zu tun, solange Sie sehen sie nicht als „Einheit“ -Tests. Das wäre Integrationstests sein. Sie wollen auch prüfen, ob Sie manuell über die Benutzeroberfläche testen wird wieder und wieder, wie Sie gerade stattdessen Ihre Rauch automatisierte Tests könnten. In Anbetracht, dass Sie vielleicht sogar überhaupt nicht tun, um die Integrationstests betrachten und arbeiten nur bei der funktionalen / ui Tests Ebene (wie sie bereits die Integration wird abdeckt).

Wie andere wie erwähnt, ist es schwierig, die Linie zu komplexen / nicht komplex zu ziehen, und Sie würden jetzt in der Regel, wenn es zu spät ist :(. Wenn Sie bereits zu tun, sie werden benutzt, ich bin sicher, dass Sie gewonnen‘ t viel Aufwand bekommen Wenn das nicht der Fall wäre, könnte man daraus lernen.)

Soweit Real DB nicht in die Quere kommen, und Sie können schneller auf diese Weise gehen, würde ich für sie pragmatisch und gehen.

In Unit-Test, der "Test" ist wichtiger als die "Einheit".

Unter der Annahme, dass Sie dies, ist die wichtigste Sache automatisieren wollen, ist, dass Sie Ihren Ausgangszustand programmatisch erzeugen können. Es klingt wie das der Fall ist, und noch besser sind Sie reale Daten getestet werden.

Es gibt jedoch ein paar Nachteile:

Ihre Datenbank möglicherweise nicht für bestimmte Bedingungen in Ihrem Code. Wenn Sie gefälschte Daten haben, führen Sie dieses Verhalten passieren.

Und wie Sie weisen darauf hin, Sie haben eine einfache Anwendung; wenn es weniger einfach wird, sollten Sie Tests haben, die Sie als Unit-Tests und Systemtests kategorisieren können. Die Unit-Tests ein einfaches Stück Funktionalität zielen sollten, die viel einfacher sein werden, mit gefälschten Daten zu tun.

Ein Vorteil von gefälschten Repositories ist, dass Ihre Regression / Unit-Tests konsistent ist, da Sie die gleichen Ergebnisse für die gleichen Abfragen erwarten können. Dies macht es einfacher, bestimmte Unit-Tests zu bauen.

Es gibt mehrere Nachteile, wenn Ihr Code (wenn nicht schreib Abfrage nur) Daten modifiziert: - Wenn Sie einen Fehler im Code haben (was wahrscheinlich ist, warum Sie testen), könnten Sie die Produktionsdatenbank zu brechen am Ende. Auch wenn Sie nicht es brechen haben. - wenn die Produktionsdatenbank Änderungen im Laufe der Zeit und vor allem während des Code ausgeführt wird, können Sie den Überblick über die Testmaterialien verlieren können, die Sie hinzugefügt und haben später eine harte Zeit, die aus der Datenbank zu reinigen. - Produktionsanfragen von anderen Systemen auf die Datenbank zugreifen kann Ihre Testdaten als echte Daten und diese beschädigen können Ergebnisse von wichtigen Geschäftsprozessen irgendwo auf dem Weg zu behandeln. Zum Beispiel, auch wenn Sie markiert Ihre Daten mit einem bestimmten Flag oder Präfix, können Sie versichern, dass jeder Zugriff auf die Datenbank zu diesem Schema haften?

Außerdem sind einige Datenbanken durch die Datenschutzgesetze geregelt, so auf Ihrem Vertrag abhängig und wer besitzt die Haupt DB, können Sie oder können nicht legal für den Zugriff auf reale Daten erlaubt werden.

Wenn Sie auf einer Produktionsdatenbank ausgeführt werden müssen, würde ich empfehlen, auf einer Kopie ausgeführt wird, die Sie leicht während der Spitzenzeiten zu schaffen.

Es ist eine wirklich einfache Anwendung, und Sie können es nicht sehen, wachsen, ich sehe kein Problem Ihre Tests auf einem echten DB läuft. Wenn jedoch denken Sie diese Anwendung wachsen wird, ist es wichtig, dass Sie in Ihren Tests für das Konto.

Halten Sie alles so einfach wie möglich, und wenn Sie später flexiblere Tests erfordern, es so machen. Planen Sie im Voraus aber, weil Sie nicht über eine große Anwendung in 3 Jahren haben wollen, die auf alten und Hacky (für eine große Anwendung) setzt Tests.

Die Nachteile Tests gegen Ihre Datenbank zu laufen ist der Mangel an Geschwindigkeit und die Komplexität für Ihre Datenbank Zustand der Einrichtung, bevor Tests ausgeführt wird.

Wenn Sie die Kontrolle über das haben, gibt es kein Problem, die Tests direkt gegen die Datenbank in Laufen; es ist eigentlich ein guter Ansatz, weil es Ihr Endprodukt besser simuliert als gegen gefälschte Daten ausgeführt wird. Der Schlüssel ist einen pragmatischen Ansatz haben und bewährte Verfahren als Richtlinien und nicht die Regeln sehen.

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