Python';unittest和测试用例的动态创建
可能重复:Python';unittest和测试用例的动态创建,python,unit-testing,dynamic,Python,Unit Testing,Dynamic,可能重复: 是否有一种方法可以动态创建unittest测试用例?我试过以下方法 class test_filenames(unittest.TestCase): def setUp(self): for category, testcases in files.items(): for testindex, curtest in enumerate(testcases): def thetest():
是否有一种方法可以动态创建
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
执行它们(“在…”中运行了0个测试)
因为我可能问了一个错误的问题——我试图实现的目标:
我有一个包含测试数据、输入文件名列表和预期数据(在上述代码中简化为epiodenumber
)的文件,存储在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
。问题是,如果一个失败了,我看不到其余的失败,因为它们也被分组到一个测试中,当断言失败时,该测试将中止
我认为,解决这个问题的方法是(动态地)为每个测试用例创建一个函数,也许有更好的方法?在下面的解决方案中,类
Tests
包含helper方法check
,并且没有静态定义的测试用例。然后,为了动态添加测试用例,我使用setattr
在类中定义函数。在下面的示例中,我生成了I和j分别跨越[1,3]和[2,5]的测试用例test\uu
,它们使用具有不同I和j值的helper方法check
class Tests(unittest.TestCase):
def check(self, i, j):
self.assertNotEquals(0, i-j)
for i in xrange(1, 4):
for j in xrange(2, 6):
def ch(i, j):
return lambda self: self.check(i, j)
setattr(Tests, "test_%r_%r" % (i, j), ch(i, j))
为此,您应该在中使用test。您只需生成一个元组,第一个是函数,其余是参数。下面是文档中的示例
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
pytest()也支持基于生成器的测试。+1表示有用的链接——关于此问题和其他问题的类似答案上的链接没有该链接。另一个可能的副本是。