使用参数实例化Python unittest.TestCase

时间:2013-06-23 11:50:54

标签: python-2.7 arguments test-suite 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")

测试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()

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

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

3 个答案:

答案 0 :(得分:11)

根据“Python unit testing: parametrized test cases”,发表在Eli Bendersky的博客中:

  

Python的标准unittest库很棒,我一直都在使用它。   然而,缺少的一件事是一种简单的运行方式   参数化测试用例。换句话说,你不能轻易通过   从外部进入unittest.TestCase的参数。

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

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

答案 1 :(得分: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()

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

如果要避免将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()

答案 2 :(得分:0)

我会这样:

TestCase文件,其中包含测试逻辑本身:

import my_config
from unittest import TestCase

class TestOdd(unittest.TestCase):
    def runTest(self):
        """Assert that the item is odd"""
        self.assertTrue(int(my_config.options['number']) %2==1, "Number should be odd")

然后在TestSuite文件中:

import argparse
import my_config
import TestCase

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-num', '--number', type=int, default=0)
    my_config.options = parser.parse_args()
    
    suite_case = unittest.TestLoader().loadTestsFromTestCase(TestCase)
    test_suite = unittest.TestSuite([suite_case])

    unittest.TextTestRunner(verbosity=1, failfast=True, buffer=False).run(test_suite)

my_config.py帮助文件:

options = {}

然后从命令行我们可以执行:

python3 -m unittest TestSuite.py --number=1
python3 -m unittest TestSuite.py --number=2
.
.
python3 -m unittest TestSuite.py --number=1000

或者可以通过在Shell脚本中使用 for 循环来完成从命令行执行的调用。