如何对大量数据测试相同的断言
我正在使用Python的unittest模块来进行一些测试,但这个过程非常重复。
我有很多数据想要反复测试,检查它们是否正确。然而,我必须为每一组数据都定义一个测试。
举个例子,我想做类似这样的事情。我知道我可以用生成器来实现(在之前的讨论中看到过)。但是有没有其他的选择,甚至可以使用不同的测试模块呢?
任何建议都非常欢迎。
import unittest
class TestData(unittest.TestCase):
def testNumbers(self):
numbers = [0,11,222,33,44,555,6,77,8,9999]
for i in numbers:
self.assertEqual(i, 33)
7 个回答
10
从Python 3.4开始,你可以使用 unittest.TestCase.subTest(msg=None, **params)
这个上下文管理器(可以查看文档)。这样你只需要添加一条语句,就能实现你想要的功能。
下面是你提供的例子,已经修改为使用 subTest()
的版本。
import unittest
class TestData(unittest.TestCase):
def testNumbers(self):
numbers = [0, 11, 222, 33, 44, 555, 6, 77, 8, 9999]
for i in numbers:
with self.subTest(i=i): # added statement
self.assertEqual(i, 33)
11
比尔·格里布尔建议的解决方案的示例代码可能看起来像这样:
import unittest
class DataTestCase(unittest.TestCase):
def __init__(self, number):
unittest.TestCase.__init__(self, methodName='testOneNumber')
self.number = number
def testOneNumber(self):
self.assertEqual(self.number, 33)
def shortDescription(self):
# We need to distinguish between instances of this test case.
return 'DataTestCase for number %d' % self.number
def get_test_data_suite():
numbers = [0,11,222,33,44,555,6,77,8,9999]
return unittest.TestSuite([DataTestCase(n) for n in numbers])
if __name__ == '__main__':
testRunner = unittest.TextTestRunner()
testRunner.run(get_test_data_suite())
2
在另一个帖子中,我偶然发现了Nose Tests,这个工具更适合数据驱动的测试。
class Test_data():
def testNumbers():
numbers = [0,11,222,33,44,555,6,77,8,9999]
for i in numbers:
yield checkNumber, num
def checkNumber(num):
assert num == 33
上面的代码和我第一篇帖子里的代码做的事情完全一样。你不需要导入任何东西,只需要写一个Python类。
你可以通过输入以下命令来执行测试:
nosetests 文件名