我想迭代一个项目列表,并对每个项目运行一个断言。一个例子可能是检查列表中的每个数字是否都是奇数。
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年的博客文章(发布为答案),没有用于参数化测试的内置机制。我很乐意接受任何更清洁的解决方案。
答案 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
循环来完成从命令行执行的调用。