【问题标题】:Python's unittest and dynamic creation of test cases [duplicate]Python的单元测试和测试用例的动态创建[重复]
【发布时间】:2010-11-14 16:49:04
【问题描述】:

可能重复:
How do you generate dynamic (parameterized) 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。问题是,如果一个失败,我看不到其余的失败,因为它们也被分组到一个测试中,当断言失败时该测试中止。

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

【问题讨论】:

标签: python unit-testing dynamic


【解决方案1】:

在下面的解决方案中,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))

【讨论】:

    【解决方案2】:

    为此,您应该在nose 中使用测试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
    

    【讨论】:

    • pytest (pytest.org) 也支持基于生成器的测试。
    • +1 以获得有用的链接---关于此问题和其他问题的类似答案的链接没有该链接。
    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多