在python 3.4中,我希望能够为测试目的做一个非常简单的调度表。我们的想法是拥有一个字典,其中键是要测试的函数名称的字符串,数据项是测试函数的名称。例如:
myTestList = (
"myDrawFromTo",
"myDrawLineDir"
)
myTestDict = {
"myDrawFromTo": test_myDrawFromTo,
"myDrawLineDir": test_myDrawLineDir
}
for myTest in myTestList:
result = myTestDict[myTest]()
我的想法是我在某个地方有一个函数名列表。在此示例中,我手动创建一个字典,将这些名称映射到测试函数的名称。测试函数名称是函数名称的简单扩展。我想从函数名列表中计算整个字典(这里是“myTestList”)。
或者,如果我可以在没有字典的情况下做同样的事情,那也没关系。我尝试从myTestList中的条目构建一个新字符串,然后使用local()来设置调用,但没有任何运气。字典的想法来自docs.python.org/3 /
答案 0 :(得分:2)
问题分为两部分。
简单的部分就是在'text_'
前加上每个字符串:
tests = {test: 'test_'+test for test in myTestDict}
更难的部分实际上是按名称查找功能。这种事情通常是一个坏主意,但你已经碰到其中一个案例(生成测试),而这通常是有意义的。您可以在your module's global dictionary中查找它们,如下所示:
tests = {test: globals()['test_'+test] for test in myTestList}
如果测试生活在模块的全局范围之外的其他地方,则存在相同想法的变体。例如,将它们设置为类的所有方法可能是个好主意,在这种情况下,您可以这样做:
tester = TestClass()
tests = {test: getattr(tester, 'test_'+test) for test in myTestList}
(尽管代码更有可能位于TestClass
内,因此它将使用self
而不是tester
。)
当然,如果你真的不需要字典,你可以将理解改为明确的for
陈述:
for test in myTestList:
globals()['test_'+test]()
还有一件事:在重新发明轮子之前,您是否看过测试框架built into the stdlib或available on PyPI?
答案 1 :(得分:1)
Abarnert的回答似乎很有用,但回答了如何调用所有测试函数以获取函数名列表的原始问题:
def test_f():
print("testing f...")
def test_g():
print("testing g...")
myTestList = ['f', 'g']
for funcname in myTestList:
eval('test_' + funcname + '()')