Python的单元测试和动态创建测试用例

dbr*_*dbr 22 python unit-testing dynamic

可能重复:
如何在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)
Run Code Online (Sandbox Code Playgroud)

..which正确地创建所有方法(它们显示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}
]
Run Code Online (Sandbox Code Playgroud)

目前我只是遍历所有数据,调用self.assertEquals每个测试.问题是,如果一个失败,我没有看到其余的失败,因为它们也被分组到一个测试中,当断言失败时中止.

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

Adr*_*iuk 23

在以下解决方案中,该类Tests包含辅助方法,check并且没有静态定义的测试用例.然后,为了动态添加测试用例,我setattr用来定义类中的函数.在下面的示例中,我分别test_<i>_<j>使用i和j生成[1,3]和[2,5] 生成测试用例,这些测试用例使用check具有不同i和j值的辅助方法.

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))
Run Code Online (Sandbox Code Playgroud)


Dav*_*ick 12

为此你应该在鼻子中使用测试发生器.你需要做的就是产生一个元组,第一个是函数,其余的是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
Run Code Online (Sandbox Code Playgroud)