Unit-Testing-Dienstprogrammklassen

10

Wir alle haben einige Dienstprogrammklassen, die nur statische Methoden enthalten, um sie aus verschiedenen Quellen zu verwenden. Nun gibt es zwei Ansätze, um diesen Code zu testen.

Ansatz 1:

Führen Sie separate Komponententests für Dienstprogrammklassen durch. Wo immer sie aufgerufen werden, verspotten Sie ihre Interaktion mit einem Test-Framework, das dies vorsieht, wie z. B. PowerMock. Dies behandelt die Utility-Klasse im Wesentlichen als separate Komponente des Systems, die einzeln getestet und gewartet werden muss.

Ansatz 2:

Schreiben Sie keine Komponententests für Dienstprogrammklassen. Tests, die für Ihre anderen Kernklassen geschrieben wurden, die mit dieser Dienstprogrammklasse interagieren, lassen diese Interaktion jedoch zu, wodurch sichergestellt wird, dass der in dieser Dienstprogrammklasse geschriebene Code ordnungsgemäß für verschiedene Anwendungsfälle getestet wird. Wenn etwas kaputt geht, sollten die Tests für andere Komponenten es fangen können.

Bitte teilen Sie Ihre Gedanken darüber mit, welcher Ansatz vorzuziehen ist oder ob es eine andere Art und Weise gibt, wie Menschen dies tun.

Ulrich
quelle
1
Verwandte Themen: Statische Dienste und Testbarkeit : „Wenn eine Funktion rein ist, können Sie sie einfach einmal direkt testen und dann in anderem Code verwenden, um zu wissen, dass sie funktioniert. Dies gilt normalerweise nur für kleine Dienstprogrammmethoden oder wenn Sie eine strikte funktionale Programmierung durchführen. Wenn der von dieser statischen Methode bereitgestellte Dienst komplexer ist, wird die Verwendung von Abhängigkeitsinjektionstechniken wünschenswert. “ In jedem Fall sind direkte Tests öffentlicher statischer Methoden sinnvoll.
Amon

Antworten:

7

Ich denke, es gibt ein großes Missverständnis über "Utility" -Klassen da draußen. Nur weil Sie eine Klasse 'statisch' machen, wird sie nicht zu einer Utility-Klasse. Wenn Ihre statische Dienstprogrammklasse Abhängigkeiten aufweist (die sich möglicherweise in anderen statischen Dienstprogrammklassen manifestieren), führt dies zu Nebenwirkungen, oder ihr Verhalten kann nicht vollständig gesteuert werden, da ihre Eingaben keine Dienstprogrammklasse sind.

Echte Utility-Klassen müssen nicht verspottet werden, da ihre Ausgabe abhängig von ihren Eingaben immer deterministisch ist.

Beim Komponententest geht es darum, einen kleinen Teil Ihrer Anwendung (eine Einheit) isoliert zu instanziieren, damit Sie (möglicherweise) alle Codepfade innerhalb dieser Einheit testen können. Durch das Verspotten von Abhängigkeiten wird diese Isolation erreicht. Wenn eine Utility-Klasse die Isolation durchbricht, handelt es sich wiederum nicht um eine Utility-Klasse, da eine Utility-Klasse per Definition isoliert werden soll.

In einer Anwendung sollte man also niemals Utility-Klassen verspotten wollen oder müssen. Klassen, von denen Sie glauben, dass sie verspottet werden müssen, müssen in erstklassige instanziierbare Klassen umgewandelt und als Abhängigkeit an die Einheit übergeben werden (siehe Abhängigkeitsinjektion ). Diese Abhängigkeiten können dann leicht verspottet werden, so dass das Gerät isoliert getestet werden kann.

c_maker
quelle
19

Meiner Meinung nach ist es lächerlich, eine Abhängigkeit von einer statischen Dienstprogrammmethode für Dinge wie das Teilen von Zeichenfolgen zu verspotten.

Ja, wenn die Splitter-Methode falsch ist, kann dies zu falschen Fehlern bei Tests für Methoden führen, bei denen es nicht um das Teilen von Zeichenfolgen geht. Aber das ist nicht der Punkt einer Testsuite. Die Testsuite muss zu 100% erfolgreich sein. Wenn dies nicht der Fall ist, beheben Sie das Problem und wiederholen es, bis es zu 100% erfolgreich ist. Wenn die String-Dienstprogrammklasse beschädigt wird, sollte dies sofort zu einem Fehler in einem Test führen, bei dem es um die String-Funktionalität geht. Sie beheben diese Funktionalität und dann verschwinden alle Fehler, sodass Sie sich nicht einmal die fälschlicherweise fehlgeschlagenen Testfälle ansehen müssen.

Mit anderen Worten, JA, schreiben Sie Tests für Dienstprogrammmethoden. NEIN, versuchen Sie nicht, sie von anderen Tests zu entkoppeln. Nehmen Sie einfach an, dass triviale Dienstprogrammfunktionen ordnungsgemäß funktionieren, wie durch ihre eigenen Tests bestätigt wurde. Etwas mehr zu tun ist mehr Anstrengung ohne Gewinn.

Kilian Foth
quelle
Nur um sicherzugehen, bevorzugen Sie Ansatz 2 gegenüber 1, oder?
Ahmad Fadli
1
@AhmadFadli Nein, er sagt, dass Ansatz 3 der beste ist: Schreiben Sie Tests für Dienstprogrammfunktionen und verspotten Sie sie nicht in anderen Tests.
FINDarkside
@AhmadFadli, "Mit anderen Worten, JA, schreibe Tests für Dienstprogrammmethoden. NEIN, versuche nicht, sie von anderen Tests zu entkoppeln", das bedeutet Option Sekunde 2, denke ich. Schreiben Sie nämlich einen Test, der Utility-Klassenmethoden verwendet, aber keine für eine Utility-Methode spezifischen Einstrahlungen für Tests schreibt
Farid,