Laufende Einheitstests für verschachtelte Funktionen

8

Ich komme aus der Java-Welt, wo Sie Variablen und Funktionen verstecken und dann Unit-Tests gegen sie mithilfe von Reflektion ausführen können. Ich habe verschachtelte Funktionen verwendet, um Implementierungsdetails meiner Klassen zu verbergen, so dass nur die öffentliche API sichtbar ist. Ich versuche Einheitentests gegen diese verschachtelten Funktionen zu schreiben, um sicherzustellen, dass ich sie nicht bei der Entwicklung zerbringe. Ich habe versucht, eine der verschachtelten Funktionen wie folgt aufzurufen:

%Vor%

was zur Fehlermeldung führt:

  

AttributeError: Objekt 'function' hat kein Attribut 'inner'

Gibt es eine Möglichkeit für mich, Komponententests gegen diese verschachtelten Funktionen zu schreiben? Wenn nicht, gibt es eine Möglichkeit, den Namen für Funktionsnamen auszulösen, wie Sie es für Klassenvariablen tun können, indem Sie ihnen __?

voranstellen     
Chris Lieb 28.11.2008, 23:41
quelle

6 Antworten

5

Die Python-Konvention besteht darin, "private" Funktionen und Methoden mit einem führenden Unterstrich zu benennen. Wenn Sie einen führenden Unterstrich sehen, wissen Sie, dass Sie ihn nicht verwenden sollen.

Denken Sie daran, Python ist nicht Java .

    
orip 29.11.2008, 00:04
quelle
11

inneres existiert nicht, bis das Äußere es macht. Sie sollten sich entweder innerlich zu einer Toplevel-Funktion zur Testbarkeit bewegen oder den äußeren Test alle möglichen Ausführungspfade von sich selbst und von innen testen lassen.

Beachten Sie, dass die innere Funktion keine einfache Funktion ist, sondern eine Schließung. Betrachten Sie diesen Fall:

%Vor%

Das ist der Standard Testbarkeit-Kompromiss. Wenn Ihre zyklomatische Komplexität zu hoch ist, werden Ihre Tests zu zahlreich sein.

    
Dustin 28.11.2008 23:44
quelle
2

Keine Möglichkeit, innere Funktion vom äußeren Funktionsobjekt zu erhalten (siehe die anderen Antworten!). Dennoch haben sowohl Komponententests als auch -schließungen (zumindest für mich) erstaunliche Verbesserungen der Entwicklerleistung gebracht. Können wir beides haben? Können wir geschachtelte Funktionen isoliert testen?

Nicht leicht.

Dies könnte jedoch anscheinend mit der Verwendung von Python-Modulen Parser, Ast oder Tokenizer erreicht werden, um den Code selbst zu zerlegen, innere Funktionen zu extrahieren (durch einen Weg durch die Verschachtelung) und Tests zu erlauben, sie mit umschließendem Zustand auszuführen Funktionen (Werte für geschlossene Namen) und Stubs / Mocks für mehr verschachtelte Funktionen (definiert innerhalb des Testziels).

Weiß jemand von so etwas? Googeln konnte nichts finden.

    
Tim James 09.07.2011 16:12
quelle
1

Ich glaube nicht, dass es eine Möglichkeit gibt, vom externen Namensraum auf inner () zuzugreifen.

Meiner Meinung nach bedeutet die Tatsache, dass Sie inner () verschachtelt haben, dass der einzige "Vertrag", der wirklich zählt, der äußere () ist. inner () ist Teil der Implementierung, und Sie sollten die Implementierung nicht testen wollen. Wenn Sie inner () wirklich testen möchten, führen Sie umfangreiche Tests mit external () mit Daten durch, die alle Funktionen von inner () beinhalten.

    
Federico A. Ramponi 29.11.2008 00:25
quelle
1

Ich hatte die gleichen Zweifel und fand einen Weg, um Tests für innere Funktionen zu bekommen.

%Vor%

Grundsätzlich können Sie die innere Funktion als Parameter nach außen senden und nach Ihren Wünschen testen. Wenn Sie outer () aufrufen, wird Ihr Test ausgeführt, und da es sich um eine Schließung handelt, behält es jede zusätzliche Eigenschaft aus der äußeren Funktion (wie Variablen) bei. Mit einer Liste können Sie beliebig viele Funktionen senden. Um den if zu ignorieren, können Sie den Code wie folgt ausführen:

%Vor%     
Victor Barroso 18.06.2016 12:43
quelle
1

Ich habe ein kleines Hilfsmodul geschrieben, das genau das ermöglicht:

Beispiele verschachtelter Funktionen:

%Vor%

Diese können mit dieser Art von Code getestet werden:

%Vor%

Das kleine Hilfsmodul nested sieht so aus:

%Vor%     
Alfe 09.11.2016 17:08
quelle

Tags und Links