测试在Python中的副作用(Testing for side-effects in python)

2019-09-19 19:08发布

我想检查我的函数没有副作用,或只影响精确变量的副作用。 有没有检查它实际上有没有副作用(或副作用只有某些变量)的功能?

如果没有,我怎么能去写我自己的,如下所示:

我的想法是这样的,初始化,测试调用该函数,然后调用最后一个方法:

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())

我不确定这是否是恰恰字典我想...

最后,我应该这样做呢? 如果不是,为什么不呢?

Answer 1:

我不熟悉的嵌套函数测试库,你可能会写一个测试,但好像你真的应该在这里使用类(即TestCase的很多框架)。

如果你的问题,然后,是与获取父变量在你的测试用例,你可以得到__dict__ (这是我不明白什么是“父”变量你指的。

UPDATE:@hayden发布了要点,以显示使用父变量:

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()

如果这被转换为一个字典,那么问题是可以解决的有:

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()

你说得对,寻找它已经实现了这个工具。 我希望别人将有一个已经实施的解决方案。



文章来源: Testing for side-effects in python