可能重复:
How to generate dynamic (parametrized) unit tests in python?
有没有办法动态创建unittest
测试用例?我试过以下......
class test_filenames(unittest.TestCase):
def setUp(self):
for category, testcases in files.items():
for testindex, curtest in enumerate(testcases):
def thetest():
parser = FileParser(curtest['input'])
theep = parser.parse()
self.assertEquals(theep.episodenumber, curtest['episodenumber'])
setattr(self, 'test_%s_%02d' % (category, testindex), thetest)
..正确创建所有方法(它们显示在dir()
并且可以调用),但是unittest的测试检测器,nosetest
也执行它们(“Ran 0 tests in ...”)
因为我可能会问错误的问题 - 我想要实现的目标:
我有一个文件,包含测试数据,输入文件名列表和预期数据(在上面的代码中简化为episodenumber
),存储在Python字典中。关键是类别,值是测试用例列表,例如..
test_cases = {}
test_cases['example_1'] = [
{'input': 'test.01',
'episodenumber': 1},
{'input': 'test.02',
'episodenumber': 2}
]
test_cases['example_2'] = [
{'input': 'another.123',
'episodenumber': 123},
{'input': 'test.e42',
'episodenumber': 32}
]
目前我只是遍历所有数据,在每次测试时调用self.assertEquals
。问题是,如果一个失败,我没有看到其余的失败,因为它们也被分成一个测试,当断言失败时中止。
我认为,解决这个问题的方法是(动态)为每个测试用例创建一个函数,也许有更好的方法?
答案 0 :(得分:23)
在以下解决方案中,类Tests
包含辅助方法check
,并且没有静态定义的测试用例。然后,为了动态添加测试用例,我使用setattr
来定义类中的函数。在下面的示例中,我分别使用i和j生成[{1]}生成测试用例[1,3]和[2,5],它们使用具有不同i和j值的辅助方法test_<i>_<j>
。
check
答案 1 :(得分:12)
为此,你应该在鼻子中使用测试generators。你需要做的就是产生一个元组,第一个是函数,其余的是args。这里的文档就是一个例子。
def test_evens():
for i in range(0, 5):
yield check_even, i, i*3
def check_even(n, nn):
assert n % 2 == 0 or nn % 2 == 0
答案 2 :(得分:2)
我已经发布了一个类似问题的解决方案,应该为您提供如何执行此操作的提示。它基于元类和装饰器。