Frage

In dem Teile eines Projekts schriftlich Unit-Tests ist fast oder ganz unmöglich? Der Datenzugriff? ftp?

Wenn es eine Antwort auf diese Frage dann% 100 Berichterstattung ein Mythos ist, ist es nicht?

War es hilfreich?

Lösung

hier I (über Haacked etwas Michael Feathers sagt, dass eine Antwort sein kann:

Er sagt:

  

Ein Test ist kein Unit-Test, wenn:

     
    
        
  • Er spricht mit der Datenbank
  •     
  • Sie kommuniziert über das Netzwerk
  •     
  • Sie berührt das Dateisystem
  •     
  • Es kann nicht zur gleichen Zeit wie einer Ihrer anderen Unit-Tests
  • laufen     
  • Sie haben spezielle Dinge zu Ihrer Umgebung zu tun (wie das Bearbeiten von Konfigurationsdateien), um sie auszuführen.
  •     
  

Auch in demselben Artikel fügt er hinzu:

  

Im Allgemeinen Unit-Tests sollen klein sein, sie zu testen, ein Verfahren oder die Interaktion von ein paar Methoden. Wenn Sie die Datenbank, Sockets oder Dateisystemzugriff in die Komponententests ziehen, sind sie nicht wirklich über diese Methoden vorhanden; sie sind über die Integration des Codes mit der anderen Software.

Andere Tipps

Die 100% ige Abdeckung ist ein Mythos, der es ist, bedeutet nicht, dass 80% Deckung nutzlos ist. Das Ziel ist natürlich, 100% ist, und zwischen Unit-Tests und dann Tests Integration, können Sie es angehen.
Was in Unit-Tests nicht möglich ist, ist die Vorhersage, die alle total seltsam Dinge Ihre Kunden auf das Produkt tun wird. Sobald Sie diese irrsinnig Verdrehungen des Codes beginnen zu entdecken, stellen Sie sicher zurück in die Testsuite für sie Tests zu rollen.

Erreichen von 100% Codeabdeckung ist fast immer verschwenderisch. Es gibt viele Ressourcen zu diesem Thema.

Nichts ist unmöglich zu Unit-Test, aber es gibt immer abnehmenden Ertrag. Es kann nicht wert zu Unit-Test Dinge sein, die Unit-Test schmerzhaft sind.

Das Ziel ist nicht 100% Code Coverage noch ist es 80% Code Coverage. Ein Unit-Test ist einfach zu schreiben, bedeutet nicht, dass Sie es schreiben sollte, und ein Unit-Tests schwer macht zu sein, schreiben nicht, dass Sie sich die Mühe vermeiden sollten.

Das Ziel jeder Test ist Benutzer sichtbar Probleme in den meisten afforable Weise zu erfassen.

Ist die Gesamtkosten der Erstellung, Wartung und Diagnose durch den Test gekennzeichneten Probleme (einschließlich False Positives) lohnt sich die Probleme, die spezifische Testfänge?

Wenn das Problem der Test fängt ist ‚teuer‘, dann können Sie sich leisten Mühe in herauszufinden, wie es zu testen, und diesen Test zu halten. Wenn das Problem fängt der Test trivial ist dann schriftlich (und Pflege!) Den Test (auch in Gegenwart von Code-Änderungen) besser trivial sein.

Das Kernziel eines Unit-Test ist Devs von Implementierungsfehlern zu schützen. Das allein sollte, dass zu viel Aufwand zeigen eine Verschwendung. Ab einem gewissen Punkt gibt es bessere Strategien für die korrekte Umsetzung bekommen. Auch nach einem bestimmten Punkt der Benutzer sichtbar Probleme sind auf richtig die falsche Sache der Umsetzung, die nur durch Benutzerebene oder Integrationstests erfasst werden.

Was würden Sie nicht testen? Alles, was nicht möglicherweise brechen könnte.

Wenn es darum geht Deckung codieren Sie für 100% des Codes zielen wollen Sie eigentlich schreiben - das ist nicht von Drittanbietern Bibliothekscode oder Betriebssystem-Codes testen müssen, da dieser Code wird geliefert wurden Sie getestet. Es sei denn, es ist nicht. In diesem Fall sollten Sie es testen. Oder wenn es bekannte Fehler in dem Fall, dass Sie möglicherweise auf das Vorhandensein der Fehler testen wollen, so dass Sie eine Benachrichtigung über bekommen, wenn sie fixiert sind.

Unit-Tests einer GUI ist auch schwierig, wenn auch nicht unmöglich, schätze ich.

Der Datenzugriff ist möglich, weil Sie eine Testdatenbank einrichten.

Im Allgemeinen wird die 'untestable' Sachen sind FTP, E-Mail und so weiter. Allerdings sind sie in der Regel Framework-Klassen, die Sie sich verlassen können und müssen daher nicht testen, ob Sie sie hinter einer Abstraktion verbergen.

Auch 100% Codeabdeckung ist nicht genug auf seinem eigenen.

@GarryShutler

ich eigentlich Unittest E-Mail durch einen gefälschten SMTP-Server (Weiser) verwendet wird. Stellt sicher, dass Sie den Anwendungscode korrekt ist:

http: // maas-frensch.com/peter/2007/08/29/unittesting-e-mail-sending-using-spring/

So etwas könnte wahrscheinlich für andere Server durchgeführt werden. Andernfalls sollten Sie in der Lage sein, um die API zu verspotten ...

BTW: 100% Abdeckung ist nur der Anfang ... bedeutet nur, dass der gesamte Code tatsächlich Bohne ausgeführt einmal .... nichts über Grenzfälle usw.

Die meisten Tests, die sehr groß und teuer müssen (in den Kosten der Ressource oder computationtime) Setups sind Integrationstests. Unit-Tests sollen (theoretisch) nur testen, kleine Einheiten des Codes. Einzelne Funktionen.

Zum Beispiel, wenn Sie E-Mail-Funktionalität testen, macht es Sinn, ein Mock-Mailer zu erstellen. Der Zweck dieses Mock ist, um sicherzustellen, Ihr Code ruft korrekt das Mailer. Um zu sehen, ob Ihre Anwendung tatsächlich sendet Mail ist ein Integrationstest.

Es ist sehr nützlich, um eine Unterscheidung zwischen Komponententests und Integrationstests zu machen. Einheit-Tests sollten sehr schnell laufen. Es sollte leicht möglich sein, alle Ihre Komponententests ausführen, bevor Sie in Ihrem Code überprüfen.

Allerdings, wenn Ihre Testsuite von vielen Integrationstests besteht (die Einrichtung und Datenbanken abzureißen und dergleichen), Ihr Testlauf kann eine halbe Stunde leicht überschreiten. In diesem Fall ist es sehr wahrscheinlich, dass ein Entwickler wird alle Komponententests nicht ausgeführt werden, bevor sie in überprüft.

So Ihre Frage zu beantworten:. Sie Netto-Unit-Test Dinge, die besser als Integrationstest durchgeführt werden (und auch Getter / Setter nicht getestet - es ist eine Verschwendung von Zeit ;-))

In Unit-Tests, sollten Sie nicht alles testen, die nicht auf Ihr Gerät gehört; Einheiten in ihrem Kontext zu testen ist eine andere Sache. Das ist die einfache Antwort.

Die Grundregel ich verwende, ist, dass Sie sollten Unit-Test alles, was die Grenzen des Geräts (in der Regel Klasse, oder was auch immer Ihr Gerät auch sein mag) berührt, und den Rest verspotten. Es besteht keine Notwendigkeit, die Ergebnisse zu testen, dass einige Datenbankabfrage zurückgibt, um es zu testen genügt, dass Ihr Gerät die richtige Abfrage ausspuckt.

Das bedeutet nicht, dass Sie sollten nicht Dinge weglassen, die nur schwer zu testen ist; auch Fragen Ausnahmebehandlung und Gleichzeitigkeit getestet werden können recht gut mit den richtigen Werkzeugen.

„Was nicht zu testen, wenn es um Unit Testing kommt?“ * Bohnen mit nur Getter und Setter. Begründung:. In der Regel ist eine Verschwendung von Zeit, die besser Prüfung etwas anderes ausgegeben werden könnte

Alles, was nicht vollständig deterministisch ist, ist ein No-No für Unit-Tests. Sie möchten Ihre Unit-Tests immer mit den gleichen Anfangsbedingungen bestanden oder nicht bestanden - wenn Seltsamkeit wie Einfädeln, oder statistische Datengenerierung oder Zeit / Datumsangaben oder externe Dienste diese beeinflussen können, dann sollten Sie es nicht in die Komponententests werden abdeckt . Zeit / Termine sind ein besonders fieser Fall. Sie können in der Regel Code Architekten ein Datum müssen arbeitet mit injiziert werden (durch Code und Tests), anstatt auf dem aktuellen Datum und Uhrzeit auf Funktionalität angewiesen zu sein.

Wie gesagt aber, Unit-Tests sollen nicht die einzige Teststufe in der Anwendung sein. 100% Einheit Testabdeckung zu erreichen, ist oft eine Verschwendung von Zeit und trifft schnell abnehmende.

Viel besser ist es, eine Reihe von höherer Ebene Funktionstests zu haben, und auch Tests Integration, um sicherzustellen, dass das System funktioniert richtig „wenn es alles zusammengeschlossen“ - das ist die Unit-Tests durch Definition nicht Test.

Alles, was einen sehr großen und komplizierten Aufbau benötigt. Natürlich können Sie FTP (Client) testen, aber dann einen FTP-Server einrichten Sie benötigen. Für Unit-Test benötigen Sie einen reproduzierbaren Testaufbau. Wenn Sie es nicht schaffen kann, man kann es nicht testen.

Sie können sie testen, aber sie werden nicht Unit-Tests sein. Unit-Test ist etwas, das die Grenzen nicht überschreiten, wie über den Draht kreuzt, Datenbank schlagen, Laufen / mit einem Dritten Interaktion Berühren einer ungetesteten / Legacy-Code-Basis usw.

Alles, was darüber hinaus ist die Integrationstests.

Die offensichtliche Antwort auf die Frage im Titel ist, sollten Sie die Interna Ihrer API nicht Unit-Test, können Sie nicht auf jemand anderes Verhalten verlassen sollte, sollten Sie nicht alles testen, die Sie nicht verantwortlich sind.

Der Rest sollte nur genug sein, um Sie in der Lage zu machen Sie Ihren Code in sie zu schreiben, nicht mehr, nicht weniger.

Sure 100% Deckung ist ein gutes Ziel , wenn an einem großen Projekt arbeiten, aber für die meisten Projekte zur Festsetzung eines oder zwei Fehler vor dem Einsatz nicht unbedingt die Zeit wert ist erschöpfende Unit-Tests zu erstellen.

Testen Der umfassend Dinge wie Formulare Vorlage, Datenbankzugriff, FTP-Zugang, etc. auf eine sehr detaillierten Ebene wird oft nur eine Verschwendung von Zeit; es sei denn, die Software eine sehr hohe Zuverlässigkeit (99,999% Zeug) Unit-Tests Overkill und Waschbecken eine Echtzeit sein kann, zu viel muss geschrieben werden.

ich mit quamrana Antwort nicht einverstanden sind nicht in Bezug auf Drittanbieter-Code zu testen. Dies ist eine ideale Verwendung eines Unit-Tests. Was passiert, wenn Fehler (n) in einer neuen Version einer Bibliothek eingeführt? Idealerweise, wenn eine neue Version von Drittanbieter-Bibliothek freigegeben wird, führen Sie die Unit-Tests, die das erwartete Verhalten dieser Bibliothek darstellen, um sicherzustellen, dass es immer noch wie erwartet funktioniert.

Konfiguration ist ein weiteres Element, das sehr schwer zu testen und in Unit-Tests. Integrationstests und andere Tests sollten gegen Konfiguration erfolgen. Dies reduziert die Redundanz von Tests und gibt eine Menge Zeit in Anspruch. Komponententest-Konfiguration Der Versuch ist oft frivol.

FTP, SMTP, I / O im Allgemeinen geprüft werden soll, über eine Schnittstelle. Die Schnittstelle sollte durch einen Adapter (für den echten Code) und ein Mock für den Unit-Test durchgeführt werden.

Keine Einheit Test sollte die reale externe Ressource (FTP-Server usw.) ausübt

Wenn der Code den Zustand für eine Unit-Test erforderlich einzurichten wird deutlich komplexer als der Code getestet werden Ich neige dazu, die Linie zu zeichnen, und finden einen anderen Weg, um die Funktionalität zu testen. An diesem Punkt muss man fragen, wie Sie wissen, der Unit-Test richtig!

FTP, E-Mail und so weiter können Sie mit einer Server-Emulation testen. Es ist schwierig, aber möglich.

Nicht testbar sind einige Fehlerbehandlung. In jedem Code gibt es die Fehlerbehandlung, die nie auftreten kann. Zum Beispiel in Java muss es viel Ausnahme sein fängt, weil sie Teil einer Schnittstelle ist. Aber die verwendete Instanz wird es nie werfen. Oder der Standardfall eines Schalters, wenn für alle möglichen Fälle ein Fall Block vorhanden sind.

Natürlich einige der nicht benötigte Fehlerbehandlung entfernt werden können. Aber gibt es einen Codierungsfehler in der Zukunft, dann ist dies schlecht.

Der Hauptgrund zu Unit-Test-Code in erster Linie ist das Design des Codes zu überprüfen. Es ist möglich, 100% Codeabdeckung zu gewinnen, aber nicht ohne Mock-Objekte oder irgendeine Form von Isolation oder Dependency Injection verwendet wird.

Denken Sie daran, Unit-Tests nicht für die Benutzer sind, sind sie für Entwickler und bauen Systeme verwenden ein System vor der Freigabe zu bestätigen. Zu diesem Zweck sollten die Unit-Tests sehr schnell laufen und so wenig Konfiguration und die Abhängigkeit Reibung wie möglich haben. Versuchen Sie, so viel wie möglich in Erinnerung, und vermeiden Sie aus den Tests unter Verwendung von Netzwerkverbindungen.

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