Wie kann ein Stück Python-Code sagen, ob es unter Unittest läuft?

9

Ich habe ein großes Projekt, das mit dem Python-Unit-Test-Modul getestet wurde.

Ich habe eine kleine Methode, die große Aspekte des Systemverhaltens steuert. Ich brauche diese Methode, um ein festes Ergebnis zurückzugeben, wenn ich unter den UTs laufe, um konsistente Testläufe zu geben, aber es wäre teuer für mich, dies für jeden einzelnen UT zu simulieren.

Gibt es eine Möglichkeit, dass ich diese einzelne Methode, Unittest, bewusst machen kann, so dass sie ihr Verhalten ändern kann, wenn sie unter dem Unittest läuft?

    
tomdee 29.07.2014, 22:18
quelle

4 Antworten

2

Ich weiß nicht viel über das Modul unittest , aber wenn Sie die Datei direkt für den Komponententest ausführen, können Sie den Testcode mit folgendem if einschließen:

%Vor%

Jeder Code, der in dieser if-Anweisung enthalten ist, wird nur ausgeführt, wenn Ihr bestimmtes Modul direkt aufgerufen und nicht in etwas anderes importiert wird. Laut den Dokumenten sollten Sie so zuerst unittest.main() aufrufen.

Ссылка

Dies setzt voraus, dass Sie nicht über die Befehlszeile ausgeführt werden.

BEARBEITEN: Sie könnten den Funktionsstapel betrachten, um zu versuchen, die Funktion unittest.main() zu finden.

%Vor%

Ссылка

Es ist eine Art Hacky-Lösung, aber das Modul inspect hat viele nützliche Funktionen für die Introspektion.

    
TheSoundDefense 29.07.2014 22:23
quelle
1

Sie können eine Funktion zur Laufzeit nur für die Tests ändern. Zum Beispiel:

module.py

%Vor%

test.py

%Vor%

Wenn nun Code in module func() aufruft, wird er tatsächlich an deine replacement_func() zurückgerufen.

    
Greg Hewgill 29.07.2014 22:22
quelle
1

Meine Lösung besteht darin, vor dem Ausführen von TEST_FLAG=true eine unittest -Umgebungsvariable festzulegen. Zum Beispiel:

%Vor%

Dann muss nur geprüft werden, ob die Variable gesetzt ist. Zum Beispiel:

%Vor%     
Franco 06.01.2017 19:36
quelle
0

Ich bin sicher, dass es andere, bessere Methoden gibt, aber Sie könnten immer ein globales Flag von Ihrem Haupttest und nicht unter dem Unit-Test setzen und dann in Ihrer Methode darauf zugreifen.

Der andere Weg wäre natürlich, die Methode als Teil des Unit-Test-Setups zu überschreiben - wenn Ihre Methode brian heißt und Sie eine test_brian haben, dann einfach während Ihrer Pre-Test-Einstellung brian = test_brian erledigt den Job, Sie müssen möglicherweise Modulnamen in die vorhergehende Anweisung einfügen .

    
Steve Barnes 29.07.2014 22:22
quelle

Tags und Links