【问题标题】:Using exec() for automated testing of functions使用 exec() 进行函数的自动化测试
【发布时间】:2017-01-04 12:55:44
【问题描述】:

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

所以我的问题是:我的方法是否可行,或者我缺少其他简单的方法?

【问题讨论】:

  • 您是否考虑过使用pytest 而不是编写自己的测试框架?

标签: python testing exec eval


【解决方案1】:

对于您描述的具体情况,我建议使用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)

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2012-01-06
    • 1970-01-01
    相关资源
    最近更新 更多