Sollte ich Tests für Klasse A schreiben, wenn sie von Klasse B abgedeckt sind

8

Ich würde gerne etwas über die Testmethodik erfahren.

Nehmen wir an, wir haben Klasse A und B. Klasse B verwendet Funktionalität der Klasse A. Die B-Klasse ist vollständig getestet und somit wird auch eine Testabdeckung indirekt für Klasse A angewendet.

Soll ich vollständige Tests direkt für Klasse A schreiben? Oder sollte ich nur die nicht getestete A-Klassen-Funktionalität testen?

Ich frage, weil vielleicht in Zukunft die Möglichkeit besteht, dass die B-Klasse entfernt oder modifiziert wird, so dass sie möglicherweise nicht die gleiche Funktionalität aus der A-Klasse verwendet, so dass einige Methoden möglicherweise nicht getestet werden. Was würdest du tun?

    
tobi 31.01.2014, 14:36
quelle

7 Antworten

8

KLASSEN! = EINHEITEN

Wenn Sie eine gute TDD üben, werden Sie leicht verstehen, was dahinter steckt.

IMO, Sie sollten das Verhalten von B testen, ohne darauf zu achten, dass A bereits getestet wurde.

Tatsächlich gibt es drei Fälle:

A und B GEHÖREN DER GLEICHEN EBENE:

  • Wenn A durch den Refactor-Zyklus (Extraktklasse) von B erstellt wird (passiert oft beim Üben einer guten TDD), dann sollte A TOTALLY nicht getestet werden! Keine Notwendigkeit, es überhaupt zu testen!
    In der Tat sollte die Code-Struktur (in diesem Fall die Trennung der Klassen / SRP) unabhängig vom Unit Konzept sein; B und A gehören in diesem Fall zur selben Einheit.

  • Wenn A BEVOR B vorhanden ist, sollte B nicht auf dieser Tatsache basieren und das gesamte Verhalten von B sollte getestet werden.

A und B gehören nicht zu derselben Ebene (distinct Grenzen zum Beispiel):

  • Wenn B eine GUI-Klasse ist und A eine Business-Klasse, dann sollte A beim Testen von B verdoppelt / verspottet werden, und auch A sollte einen vollständigen Test dafür haben. < br> In der Tat sollte Domain-Architektur nicht mit behavior/feature Ahnung gemischt werden.

Um zu verstehen, warum, lesen Sie diesen Artikel von Onkel Bob, der sich mit diesem Konzept befasst:

Ссылка

Auszug davon:

  

Es ist ein häufiges Missverständnis, dass das Design der Tests widerspiegeln muss   das Design des Produktionscodes. TDD erfordert nicht, wie der Autor   schlägt vor, "dass jede Einheit in Ihrem System mit einem gepaart ist   gut entworfenen [...] Unit-Test. "Das ist einer der Gründe dafür   viele von uns haben aufgehört, sie "Einheits" -Tests zu nennen.

Hinweis: TDD kümmert sich nicht um "Zukunft", im Gegenteil, es hilft Ihnen, so viel Code zu schreiben, wie Sie brauchen, nicht mehr. Daher sollten Sie sich keine Sorgen machen:

  

in Zukunft wird es möglich sein, dass die B-Klasse sein wird   entfernt oder geändert

Wenn Sie gute Tests geschrieben haben (ich bevorzuge das Wort "specs"), würde eine solche Entfernung sofort erkannt werden.

    
Mik378 31.01.2014, 14:42
quelle
8

Ja, Sie sollten A vollständig testen.

  1. B könnte sich irgendwann ändern, nur weil A jetzt verwendet wird, heißt das nicht immer.

  2. B verwendet möglicherweise nicht die gesamte Funktionalität von A , was bedeutet, dass Sie nicht Ihren gesamten Code testen.

Justin Niessner 31.01.2014 14:38
quelle
5

Schreiben Sie auf jeden Fall die vollständigen Tests für die Klasse A. Sie haben Ihre eigene Frage hier beantwortet:

(...)maybe in the future there will be possibility that the B class will be removed or modified in the way that it might not use the same functionality from A class so it might leave some methods untested.

    
A Boschman 31.01.2014 14:39
quelle
5

Der allgemeine Gedanke hinter Unittesting ist, dass jede Einheit aus einer Unit of Work besteht. Dies kann so klein wie eine Methode oder so groß wie mehrere Methoden zusammenarbeiten.

Sie haben bereits das Szenario behandelt, in dem B von A abhängig ist, aber von Ihrer Geschichte können wir annehmen, dass A auch separat verwendet wird. Daher sollte A auch getestet werden, da es sich um eine separate Arbeitseinheit handelt.

    
Jeroen Vannevel 31.01.2014 14:39
quelle
4

B sollte nur A über eine Schnittstelle IA

verwenden

Testen Sie B über seine öffentliche Schnittstelle und A über seine öffentliche Schnittstelle.

Beide sollten getestet werden.

    
Chriseyre2000 31.01.2014 14:39
quelle
3

Ich denke, deine Antwort ist genau da:
in the future there will be possibility that the B class will be removed or modified
Ich denke, das ist ein starker Fall für eine Testsuite für A.

    
Janis F 31.01.2014 14:39
quelle
3

Sie sollten zuerst testen A, dann B. Wenn Sie bei B einen Testfehler erhalten, haben Sie nicht genug Diagnose, um zu wissen, ob sie aus dem Code von B stammt oder in A's.

Bei Unit-Tests geht es nicht nur um "bestanden / nicht bestanden", sondern um Diagnose des Problems .

    
Marko Topolnik 31.01.2014 14:40
quelle

Tags und Links