如何使用exec()动态加载函数以测试单元



我想将函数动态加载到单元测试中,以str的形式传递代码,并使用exec()在测试中运行它们。

我当前的代码如下:

import unittest
class ParametrizedTestCase(unittest.TestCase):
def __init__(self, methodName='runTest', param=None):
super(ParametrizedTestCase, self).__init__(methodName)
exec (param)
self.param = param
@staticmethod
def parametrize(testcase_klass, param=None):
testloader = unittest.TestLoader()
testname = testloader.getTestCaseNames(testcase_klass)
suite = unittest.TestSuite()
for name in testname:
suite.addTest(testcase_klass(name, param=param))
return suite
class TestZero(ParametrizedTestCase):
def test_add(self):
print('param:', self.param)
self.assertEqual(add(1,1), 2)
if __name__ == '__main__':
code = "def add(a, b): return a + b"
suite = ParametrizedTestCase.parametrize(TestZero, param=code)
unittest.TextTestRunner(verbosity=2).run(suite)

这是当前的输出:

❯ python test/test0.py
test_add (__main__.TestZero) ... param: def add(a, b): return a + b
ERROR
======================================================================
ERROR: test_add (__main__.TestZero)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test/test0.py", line 21, in test_add
self.assertEqual(add(1,1), 2)
NameError: name 'add' is not defined
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)

有可能做到这一点吗?如果有,如何做到?

execParameterizedTestCase.__init__的本地作用域中定义add,没有附加参数;一旦该功能完成,add就会超出范围。

一种解决方案是将add放在全局范围内,以便它可以访问。

exec(param, globals())

但是,通常情况下,您不知道param的执行将为将来的测试提供什么名称。

最新更新