使用exec()自动测试函数

时间:2017-01-04 12:55:44

标签: python testing exec eval

我想为我的一些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被认为是可能的不良做法。

所以我的问题是:我的方法是否正常,或者有一种简单的其他方式可以解决这个问题,我不知道了吗?

1 个答案:

答案 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)