Ist die Testmethode zum Testen einer Funktion durch Testen einer Funktion, die sie als Unit-Test bezeichnet, noch?

11

Wenn wir eine Funktion B testen, indem wir eine Funktion C testen, die diese Funktion B aufruft, dh ein Testprogramm schreibt, um die Funktion C zu testen, die diese Funktion B aufruft, heißt die Testmethode dann noch Unit-Test oder etwas anderes?

Wann wird bevorzugt, indirekt eine Funktion zu testen, die die Zielfunktion aufruft, und wann wird bevorzugt, eine Funktion direkt zu testen?

Tim
quelle

Antworten:

9

Eine beliebte Definition des Unit-Tests ist die des ISTQB:

Ein Komponententest ist der kleinste testbare Teil einer Anwendung wie Funktionen, Klassen, Prozeduren und Schnittstellen. Unit Testing ist eine Methode, mit der einzelne Einheiten des Quellcodes getestet werden, um festzustellen, ob sie für die Verwendung geeignet sind.

Nach dieser Definition:

  • Wenn Sie ein Testprogramm für B schreiben, handelt es sich um einen Komponententest (von B).
  • Wenn Sie ein Testprogramm für C schreiben, handelt es sich um einen Komponententest (von C).

Jetzt kann es einen Unterschied zwischen Absicht und Testumfang geben. Wenn Sie ein Testprogramm für B mit C schreiben, handelt es sich immer noch um einen Komponententest für C, da Sie lediglich die Eingabe für C bereitstellen und anhand der Ausgabe prüfen können, ob B korrekt war. Es ist nur so, dass Sie daraus schließen, dass B funktioniert, weil C funktioniert.

Es gibt auch eine Definition des Integrationstests :

Es wurden Tests durchgeführt, um Fehler in den Schnittstellen und in den Wechselwirkungen zwischen integrierten Komponenten oder Systemen aufzudecken.

Die übliche Definition von Softwarekomponenten impliziert, dass diese unabhängig sind und selbst bereitgestellt werden können. Hier scheinen B und C keine unabhängigen Komponenten zu sein, daher haben wir keinen Integrationstest.

Christophe
quelle
5

Dies hängt sehr davon ab, was Sie als Einheit betrachten. Wenn Ces so einfach ist, dass es nicht sinnvoll ist, es separat zu testen, dann ist Ihr Test ein Komponententest.

Viel wichtiger ist es, dass Ihre Suite von Komponententests für eine bestimmte Einheit eine nahezu 100% ige Leitungsabdeckung aufweist und alle praktisch erwarteten Codepfade getestet werden.

9000
quelle
1

Ja, wir nennen es immer noch einen Unit-Test, wenn die Funktionen andere Funktionen aufrufen.

Unit-Tests sollten das öffentliche Verhalten einer Klasse und nicht die privaten Implementierungen testen. Wie von diesem Google-Test auf dem Toilettenartikel vorgeschlagen .

Wenn Sie die Regeln von Clean Code befolgen, sollten Ihre Funktionen nicht länger als 4 Codezeilen sein. Dies macht es unmöglich, eine andere private Funktion mit Ihren Unit-Tests nicht zu testen.

Warum sollten Sie die meisten privaten Funktionen nicht separat testen? Da das Refactoring Sie zwingen würde, alle Ihre Implementierungstests ständig zu aktualisieren. Dies wird frustrierend, wenn Sie viele davon haben, während sich das öffentliche Verhalten während des Refactorings nicht ändern sollte und der Test daher nicht aktualisiert werden muss. Sie sollten in der Lage sein, Privaten mit ihren öffentlichen Eltern zu testen. Manchmal lohnt es sich vielleicht, komplexe Privaten zu testen, aber fragen Sie sich, ob sie selbst eine separate Klasse sein sollten?

Integrationstest :

Wenn die Funktion Teil einer anderen Klasse ist, ist sie anders. Dann würden wir es Komponententest oder Integrationstest nennen. Sie integrieren mehrere Klassen und führen einen Test gegen sie durch. Funktion B würde von Funktion C abhängen. Um Funktion B testen zu können, könnten Sie die Funktion, die Sie testen, mithilfe der Abhängigkeitsinjektion isolieren. Jetzt wäre es wieder ein Komponententest.

Niels van Reijmersdal
quelle