Python的unittest和动态创建测试用例

24

可能重复:
如何在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。问题是,如果其中一个失败了,我就看不到其余的失败,因为它们也被分组成一个测试,当断言失败时中止。

我认为解决这个问题的方法是为每个测试用例创建一个(动态)函数,也许有更好的方法?


另一个可能的重复问题是 *Python库'unittest':以编程方式生成多个测试*。 - Peter Mortensen
2个回答

25
在下面的解决方案中,类Tests包含辅助方法check,未静态定义任何测试用例。为了动态添加测试用例,我使用setattr在类中定义函数。在以下示例中,我生成测试用例test_<i>_<j>,其中i和j分别跨越[1,3]和[2,5],它们使用带有不同i和j值的辅助方法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))

12

你应该使用 nose 中的测试 生成器。你只需要yield一个元组,第一个是函数而剩下的则是参数。以下是文档中的示例。

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(http://pytest.org/)也支持基于生成器的测试。 - Sridhar Ratnakumar
有用的链接加1——与此问题和其他问题相关的链接都没有那个链接。 - Keith Pinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接