Testen auf Nebenwirkungen in Python

Ich möchte überprüfen, dass meine Funktion keine Nebenwirkungen hat oder nur Nebenwirkungen, die präzise Variablen beeinflussen. Gibt es eine Funktion zu überprüfen, dass es tatsächlich keine Nebenwirkungen (oder Nebenwirkungen auf nur bestimmte Variablen)?

Wenn nicht, wie kann ich über meine eigene wie folgt schreiben:

Meine Idee wäre so etwas wie die Initialisierung, die Funktion unter Test zu nennen und dann die letzte Methode aufzurufen:

class test_side_effects(parents_scope, exclude_variables=[]): def __init__(): for variable_name, variable_initial in parents_scope.items(): if variable_name not in exclude_variables: setattr(self, "test_"+variable_name, variable_initial) def final(self, final_parents_scope): for variable_name, variable_final in final_parents_scope.items(): if variable_name[:5] is "test_" and variable_name not in exclude_variables: assert getattr(self, "test_"+variable_name) is variable_final, "Unexpected side effect of %s from %s to %s" % (variable_name, variable_initial, variable_final) #here parents_scope should be inputted as dict(globals(),**locals()) 

Ich bin mir nicht sicher, ob das genau das Wörterbuch ist, das ich will …

Schließlich soll ich das tun? Wenn nicht, warum nicht?

One Solution collect form web for “Testen auf Nebenwirkungen in Python”

Ich bin nicht vertraut mit der verschachtelten Funktionstestbibliothek, dass man einen Test mit schreiben könnte, aber es scheint, als ob man eigentlich Klassen hier verwenden sollte (zB TestCase in vielen Frameworks).

Wenn deine Frage dann in Bezug auf das Erhalten der übergeordneten Variablen in deiner TestCase ist, könntest du das __dict__ (es war mir nicht klar, was die "Eltern" -Variablen, auf die du Bezug genommen hast.

UPDATE : @hayden posted ein Wesentliches, um die Verwendung von übergeordneten Variablen zu zeigen:

 def f(): a = 2 b = 1 def g(): #a = 3 b = 2 c = 1 print dict(globals(), **locals()) #prints a=1, but we want a=2 (from f) g() a = 1 f() 

Wenn dies in ein Wörterbuch umgewandelt wird, dann ist das Problem lösbar mit:

 class f(object): # could be unittest TestCase def setUp(self, a=2, b=1): self.a = a self.b = b def g(self): #a = 3 b = 2 c = 1 full_scope = globals().copy() full_scope.update(self.__dict__) full_scope.update(locals()) full_scope.pop('full_scope') print full_scope # print a = 1 my_test = f() my_test.setUp(a=1) my_test.g() 

Sie haben Recht, nach einem Tool zu suchen, das dies bereits implementiert hat. Ich bin hoffnungsvoll, dass jemand anderes eine bereits implementierte Lösung haben wird.

  • Wie man Firefox-Profil mit Selen umschaltet - ohne einen neuen Treiber zu benennen?
  • Wie behaupte ich, dass ein Funktionsaufruf keinen Fehler mit unittest zurückgibt?
  • Spott eine Steckdose in Python
  • Wie gruppiere ich Unit-Tests in Django bei einer höheren Granularität als die App?
  • Django test datei herunterladen - "ValueError: I / O-Operation auf geschlossene Datei"
  • Kann das Python-Coverage-Modul die Zeilen in einem Unit-Test bedingt ignorieren?
  • Verwenden von unittest.mock zum Patch-Eingabe () in Python 3
  • Unbekannter Tkinter File Dialog
  • Wie man Argumente an ein UnitTest ohne globale Variablen sendet
  • Wiederholungscode in unbescheidenem Testfall
  • Bei der Verwendung von unittest.mock.patch, warum ist autospec nicht true standardmäßig?
  • Python ist die beste Programmiersprache der Welt.