我想为我的一些python函数创建一个测试框架(虽然这种方法可能适用于任何其他语言)
我的想法是创建一个我将拥有的文件:
我的文件如下:
# Test 1: Description of the test # foo test1
Function: foo
Input: param1, param2, param3
Output: out1, out2
# Test 2: Description of the test # foo test2
Function: foo
Input: param1, param2, param3
Output: out1, out2
# Test 3: Description of the test # bar test1
Function: bar
Input: param1, param2, param3, param4
Output: out1, out2, out3
然后我可以读取此文件并开始执行测试。
我最初的想法是先用字符串构建命令:
command = function + '(' + ''.join(inputs) + ')'
然后使用exec()
执行每个命令
exec(command)
但是我猜这是不是一个好主意,或者有更好的想法。
我之所以这样说,因为exec和eval被认为是可能的不良做法。
所以我的问题是:我的方法是否正常,或者有一种简单的其他方式可以解决这个问题,我不知道了吗?
答案 0 :(得分:0)
对于您描述的具体案例,我建议您使用getattr
。假设您要测试的函数位于名为functions
的模块中。您的测试功能如下:
def test(func_name, args, out):
func = getattr(functions, func_name)
# `args` is a tuple for example.
assert func(*args) == out, "Test routine failed"
您可以从配置文件中提取函数名称,参数和输出。
一般来说,测试时我建议使用unittest。乍一看似乎很复杂,但它有一个非常好的文档,对于大型项目,它绝对值得付出努力。您可以将测试过程包装在unittest.TestCase
中,如下所示:
FunctionTestCase(unittest.TestCase):
def __init__(self, func_name, args, out):
self.func = getattr(functions, func_name)
self.args = args
self.out = out
def test_func(self):
self.assertEqual(self.func(*self.args), self.out)