0

在 python 3.4 中,我希望能够为测试目的制作一个非常简单的调度表。这个想法是有一个字典,键是要测试的函数名称的字符串,数据项是测试函数的名称。

例如:

myTestList = (
    "myDrawFromTo",
    "myDrawLineDir"
)

myTestDict = {
    "myDrawFromTo": test_myDrawFromTo,
    "myDrawLineDir": test_myDrawLineDir
}

for myTest in myTestList:
    result = myTestDict[myTest]()

这个想法是我在某个地方有一个函数名称列表。在此示例中,我手动创建了一个字典,将这些名称映射到测试函数的名称。测试函数名称是函数名称的简单扩展。我想从函数名称列表中计算整个字典(这里是myTestList)。

或者,如果我可以在没有字典的情况下做同样的事情,那也很好。我尝试从 myTestList 中的条目构建一个新字符串,然后使用local()它来设置调用,但没有任何运气。字典的想法来自Python 3.x 文档

4

2 回答 2

2

问题有两个部分。

简单的部分只是为'text_'每个字符串添加前缀:

tests = {test: 'test_'+test for test in myTestDict}

更难的部分实际上是按名称查找函数。这种事情通常是一个坏主意,但是您已经遇到了通常有意义的一种情况(生成测试)。您可以通过在模块的全局字典中查找它们来做到这一点,如下所示:

tests = {test: globals()['test_'+test] for test in myTestList}

如果测试存在于模块的全局范围之外的某个地方,则相同的想法会有所不同。例如,将它们设为类的所有方法可能是个好主意,在这种情况下,您可以这样做:

tester = TestClass()
tests = {test: getattr(tester, 'test_'+test) for test in myTestList}

(虽然代码更有可能在里面TestClass,所以它会使用self而不是tester。)


如果您实际上不需要 dict,当然,您可以将理解更改为显式for声明:

for test in myTestList:
    globals()['test_'+test]()

还有一件事:在重新发明轮子之前,您是否查看过内置于 stdlibPyPI中的测试框架?

于 2014-09-12T01:21:23.727 回答
0

Abarnert 的回答似乎很有用,但要回答您最初的问题,即如何为函数名称列表调用所有测试函数:

def test_f():
    print("testing f...")

def test_g():
    print("testing g...")

myTestList = ['f', 'g']

for funcname in myTestList:
    eval('test_' + funcname + '()')
于 2014-09-12T01:32:48.847 回答