我正在尝试创建一个单元测试,以检查每个函数mymodule
是否都有自己的TestCase
实例。
为了减少样板代码和手动工作,我想使用自省/反射将lambda
函数作为类方法动态添加到最初的空类Test_TestCases
中。
以下代码类型有效 - 它确实将 lambdas 添加为类方法并unittest.main()
找到并正确调用它们。
import unittest
from unittest import TestCase
import mymodule
class Test_TestCases(TestCase):
"""Class whose test_* methods will be created during runtime."""
pass
################################################################################
if __name__ == "__main__":
for item in dir(mymodule):
attr = getattr(pws, item)
if callable(attr):
testname = "Test_%s" % item
setattr(Test_TestCases, "test_%s_is_tested" % item,
lambda self: self.assertTrue(testname in globals()) and
issubclass(getattr(globals(), testname), TestCase))
unittest.main()
问题是,即使我的单元测试模块中有未经测试的功能,所有测试都会成功。
经过一番尝试,我发现testname
每次lambda
调用该变量时都具有相同的值。
为了重现性,我可以将问题最小化到这段代码:
lambdas = []
for i in range(5):
lambdas.append(lambda: str(i))
print ", ".join(f() for f in lambdas)
我希望这个输出:
0, 1, 2, 3, 4
但相反,我得到:
4, 4, 4, 4, 4
似乎 lambda 是延迟初始化的。
任何人都可以解释这种行为或给我一个关于如何正确实现目标的提示吗?
提前致谢