Wenn ich eine komplexe, auf Einheit getestete Funktion habe:
def do_everything():
# turn twizzles
# push buttons
# move mountain
Und ich zerlege es in einige kleinere Einheiten:
def do_everything():
turn_twizzles()
push_buttons()
move_mountain()
def turn_twizzles():
# turn twizzles
def push_buttons():
# push buttons
def move_mountain():
# move mountain
Verschwende ich meine Zeit damit, zusätzliche Komponententests für diese kleineren Einheiten zu schreiben?
unit-testing
refactoring
Adam Terrey
quelle
quelle
private
Schlüsselwort in einer Programmiersprache ist nur eine von vielen Möglichkeiten, den Zugriff auf einen Code einzuschränken.Es hängt davon ab, ob. Genauer gesagt kommt es darauf an
Insbesondere wenn diese "kleineren Funktionen" nicht so trivial sind wie in Ihrem Beispiel, sondern eine mehr oder weniger komplexe Liste von Eingabeparametern enthalten, kann es sehr schwierig werden, genügend Komponententests für Ihre ursprüngliche Funktion zu erstellen, um sicherzustellen, dass die kleineren Funktionen getestet werden mit allen "interessanten" Eingabekombinationen. Das wäre ein klares Zeichen, um auch für die kleineren Funktionen spezifische Unit-Tests zu schreiben.
Es gibt also kein klares "Ja" oder "Nein" zu dieser Frage, es ist ein Kompromiss, den Sie pro Fall entscheiden müssen.
quelle
Wenn
turn_twizzles
,,push_buttons
undmove_mountain
öffentlich sind und von anderem Code aufgerufen werden, ist es meiner Meinung nach wichtig, Ihre Tests zu überarbeiten, um diese Funktionen einzeln zu testen.Leider nach dem Refactoring haben Sie ein Problem: In dem Unit - Test
do_everything
müssen Sie in der Lage sein , zu verhöhnenturn_twizzles
,push_buttons
undmove_mountain
. Das Schreiben von Tests,do_everything
ohne die Abhängigkeiten zu verspotten, ist ein Integrationstest - abhängig von Ihrem Testplan nicht unbedingt eine schlechte Sache, aber es bringt keinen großen Nutzen, da Sie die drei kleineren Funktionen bereits einzeln testen. Dies ist möglicherweise der richtige Zeitpunkt für Sie, um diese Komponente neu zu gestalten und mit anderen Objekten zusammenzuarbeiten, um die gesamte Arbeit von zu erledigendo_everything
.Wenn
turn_twizzles
,push_buttons
undmove_mountain
nicht extern aufgerufen werden, sollten sie als privat markiert werden, und ich würde nicht empfehlen, sie getrennt von zu testendo_everything
. Dies liegt daran, dass aus einer von außen nach innen gerichteten Perspektivedo_everything
die kleinste Einheit wäre (weil die anderen nicht zugänglich sind). Lesen Sie auch diese Antwort zum Aufteilen von Methoden mit privaten Methoden.quelle
do_everything
muss man sich verspottenturn_twizzles
könnenpush_buttons
, undmove_mountain
... " herabgestuft, was von einer unsinnigen Definition von "Unit-Test" abhängt.Nein. Die zusätzlichen Unit-Tests sind genauer. Wenn dies
move_mountain
fehlschlägt, schlägt ein einzelner Test fehl, der genau angibt, was schief gelaufen ist.Diese Präzision verkürzt die Debugging-Zeit, was wertvoll ist. Da der Test fokussierter ist, sollte er schneller ausgeführt werden als das Testen derselben Funktionalität über die volle Funktion, wodurch ein schnelleres Feedback bereitgestellt wird, was wertvoll ist.
quelle