Ist es vernünftig, diese Unit-Tests zu erzwingen, sollten sie niemals mit einer Live-Datenbank / Webservice sprechen?

8

Mein Team findet in den Komponententests, die wir schreiben, immer mehr Wert. Wir testen die Datenzugriffsschichten unserer Anwendungen im Allgemeinen nicht Unit-Test, da sie keine "Logik" enthalten. Meiner Erfahrung nach sind wir auf erhebliche Leistungsprobleme und nicht reproduzierbare Fehler gestoßen, weil Entwickler Unit-Tests geschrieben haben, die mit Live-Datenbanken (oder Webservices) kommunizieren, und dadurch immer mehr Entwickler Mocks erstellen, die Daten an diese liefern Komponententests.

Bei diesem Ansatz wurde die Geschwindigkeit der Tests erhöht und das Testen isoliert, anstatt die Verbindung / Abfrage gleichzeitig zu testen. Ich frage mich, ob das vernünftig klingt, um als Kodierungsstandard durchzusetzen. Was sind die Vor- / Nachteile in Bezug auf Unit-Testing Live-Datenbanken / Webservices, die ich vermisse?

    
The Matt 04.03.2010, 18:55
quelle

7 Antworten

4

Die Datenbank- und Webservice-Teile Ihrer Anwendung sollten ebenfalls getestet werden, aber per Definition handelt es sich nicht um Komponententests, sondern um Integrationstests. Diese Tests würden von Ihren Komponententests getrennt sein und seltener ausgeführt werden, bieten jedoch eine sehr wertvolle Früherkennung von Defekten.

    
Matthew Vines 04.03.2010, 18:58
quelle
2

Im Allgemeinen sehe ich einen Komponententest als etwas an, das eine einzelne Klasse oder ein einzelnes Modul isoliert testet . Als solche versuche ich zu vermeiden, dass Komponententests über Live-Systeme oder externe Ressourcen bekannt sind - ich tendiere dazu, solche Abhängigkeiten in Komponententests zu vermeiden - oder verspotte sie.

Integrationstests sind eine andere Geschichte. Ein Integrationstest sollte Sie verspotten Ressourcen und benötigen daher möglicherweise eine Live-Datenbank oder einen Dienst, um sie zu unterstützen. Was Sie beschreiben, hört sich an, als wäre es ein Integrationstest statt ein Komponententest.

In einigen Fällen ist es wünschenswert, die Dienste zu simulieren, die für einen Integrationstest erforderlich sind. Aber wenn möglich, versuche ich dies zu vermeiden, weil ich der Simulation nicht traue, das Verhalten der realen Sache widerzuspiegeln. Für mich sollte ein Integrationstest tatsächlich die Integration von Komponenten in ein System testen.

    
LBushkin 04.03.2010 18:58
quelle
1

Komponententests sollten nicht mit Live-Daten durchgeführt werden, Punkt.

Auch wenn Sie mit Integrationstests beginnen möchten, sollten Sie dies nicht mit Live-Daten starten.

Ein beginnender Integrationstest sollte immer entweder mit Dev-Daten oder Mockup-Daten durchgeführt werden. Ein bevorzugtes Verfahren wäre ein Dev-System, das aus Live-Daten veröffentlicht hat, oder Sie verwenden sql-Skripte, um einen vollständigen Satz von Daten zu generieren, mit denen Sie testen können.

    
Jason M 04.03.2010 19:18
quelle
0

IMO Sie vermissen wahrscheinlich, dass wenn Sie Datenbanken / WS für den Test verwenden, dies kein Komponententest ist, sondern ein Integrationstest.

    
Diego Dias 04.03.2010 18:58
quelle
0

Jeder Build-Validierungstest sollte so vollständig wie möglich sein. Wenn Sie einen Funktionsaufruf haben, der externe Ressourcen weiterleitet, müssen Sie sicherstellen, dass sich das gesamte System ordnungsgemäß verhält.

Das Problem mit spezifischen Komponententests für Funktionen, die eine Verbindung zu einer Datenbank herstellen, kann problematisch sein, da diese Funktionen Nebenwirkungen haben können, z. B. Daten einfügen. Diese Nebenwirkungen können dazu führen, dass sich die Rückgabewerte ändern.

    
rook 04.03.2010 18:59
quelle
0

Nach meiner Erfahrung sollten Tests auf mehreren Ebenen durchgeführt werden:

  • Unit-Tests, die die Korrektheit von Klassen / Modulen ohne externe Daten prüfen
  • Systemtests, die größere Teile der Anwendung prüfen, Daten von bestimmten Datenbanken / Dateien laden und die Ergebnisse verifizieren (z. B. durch Vergleichen von Ausgabedateien). Achten Sie darauf, diese Datenbanken / Dateien nicht zu ändern, und stellen Sie sicher, dass pro Testgruppe eine Datenbank / Dateigruppe vorhanden ist
  • manuelle Tests, die die Benutzeroberfläche überprüfen

Jeder dieser Tests hat seine Nützlichkeit.

    
Patrick 04.03.2010 18:59
quelle
0

Es tut mir leid, aber viele Entwickler vermissen die Tatsache, dass Sie auch die Datenbank testen müssen. Ich kann der Verspottung der Verbindung zwischen Klasse "A" und der Datenbank zustimmen, aber irgendwann werden Sie eine Klasse erstellen, die einige Datenzugriffstechnologien (z. B. ADO.NET) verwendet, und Sie müssen das testen es funktioniert tatsächlich.

Wenn Sie nun diese Tests klein und fokussiert halten, können Sie leichter Nebenwirkungen verhindern und die richtigen Anfangsbedingungen für die Datenbank sicherstellen. Aber Tatsache ist, dass Sie solchen Code testen müssen, oder Ihre ordnungsgemäß getestete Geschäftslogik wird mit schlechten Daten enden, mit denen Sie arbeiten können.

    
John Saunders 04.03.2010 19:16
quelle