Testing for side-effects in python
我想检查我的函数是否没有副作用,或者只是影响精确变量的副作用。是否有一个函数可以检查它是否确实没有副作用(或者只对某些变量有副作用)?
如果没有,我该怎么写自己的文章呢?
我的想法是这样的,初始化,调用被测函数,然后调用最终方法:
1 2 3 4 5 6 7 8 9 10 11 | 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()) |
我不确定这是否正是我想要的字典…
最后,我应该这样做吗?如果没有,为什么不呢?
我不熟悉您可能在编写测试时使用的嵌套函数测试库,但您似乎真的应该在这里使用类(即许多框架中的测试用例)。
如果你的问题是关于在你的测试用例中得到父变量,你可以得到
更新:@hayden发布了一个要点来显示父变量的使用:
1 2 3 4 5 6 7 8 9 10 11 | 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() |
如果将其转换为字典,则问题可通过以下方式解决:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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() |
您可以寻找已经实现此功能的工具。我希望其他人能有一个已经实现的解决方案。