17

我想遍历一个项目列表,并对每个项目运行一个断言。一个例子可能是检查列表中的每个数字是否都是奇数。

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 年的一篇博文(作为答案发布),参数化测试没有内置机制。我很乐意接受任何更清洁的解决方案。

4

3 回答 3

14

根据 Eli Bendersky 的博客发表的“ Python 单元测试:参数化测试用例”:

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

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

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

于 2013-06-23T12:02:20.313 回答
10

同样可以使用类属性来实现。

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()
于 2014-03-19T20:40:40.977 回答
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

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

于 2020-12-03T19:48:43.453 回答