使用参数实例化Python unittest.TestCase

Ada*_*tan 13 arguments test-suite python-2.7 python-unittest

我想迭代一个项目列表,并对每个项目运行一个断言.一个例子可能是检查列表中的每个数字是否为奇数.

TestCase:

class TestOdd(unittest.TestCase):
    def runTest(self):
        """Assert that the item is odd"""
        self.assertTrue( NUMBER %2==1, "Number should be odd")
Run Code Online (Sandbox Code Playgroud)

测试suite:

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(TestOdd())
    # I would like to have:
    # suite.addTest(TestOdd(1))
    # suite.addTest(TestOdd(2))
    # suite.addTest(TestOdd(3))
    # ...
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

如何TestOdd使用参数实例化对象 - 例如,要测试的数字?

更新:根据2011年的博客文章(发布为答案),没有内置的参数化测试机制.我很乐意接受任何更清洁的解决方案.

Ada*_*tan 11

根据" Python单元测试:参数化测试用例 ",发表在Eli Bendersky的博客中:

Python的标准unittest库很棒,我一直都在使用它.然而,缺少的一件事是运行参数化测试用例的简单方法.换句话说,你不能轻易地从外部将参数传递给unittest.TestCase.

Eli的解决方案继承unittest.TestCaseParametrizedTestCase.我不确定版权问题,所以我不会在这里复制粘贴代码.

如果有更好的解决方案,我将很乐意接受它.


Mar*_*ala 6

使用类属性可以实现相同.

class TestOdd1(unittest.TestCase):
    NUMBER=1
    def runTest(self):
        """Assert that the item is odd"""
        self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd")

class TestOdd2(TestOdd1):
    NUMBER=2

if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

单元测试会自动发现它们,因此无需创建套件.

如果要避免将TestCase用于基类,可以使用多重继承:

from unittest import TestCase, main

class TestOdd:
    def runTest(self):
        """Assert that the item is odd"""
        self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd")

class TestOdd1(TestOdd, TestCase):
    NUMBER=1
class TestOdd2(TestOdd, TestCase):
    NUMBER=2

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)