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 behaupte ich, dass ein Funktionsaufruf keinen Fehler mit unittest zurückgibt?
  • Wie überschreibt man ein Zeitstempelfeld für Unit-Testzwecke?
  • Tkinter's event_generate Befehl ignoriert
  • Pythonschock und Bibliotheken, die nicht installiert sind
  • Python spöttische Drittanbieter-Module
  • Wie kann ich verhindern, dass Unit-Tests beim Aufruf von webbrowser.open () beenden?
  • Wiederholungscode in unbescheidenem Testfall
  • Überspringen aller Unit-Tests, aber eine in Python mit Dekorateure und Metaklassen
  • Python ist die beste Programmiersprache der Welt.