Mar*_*ark 12 python unit-testing python-unittest
我使用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)
Run Code Online (Sandbox Code Playgroud)
Dzi*_*inX 10
Bill Gribble建议的解决方案示例代码如下所示:
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())
Run Code Online (Sandbox Code Playgroud)
您可能需要考虑使用unittest.TestSuite类,它将允许您动态构造一组将单独运行的unittest.TestCase实例.您的unittest.TestCase子类应该只定义一个测试方法,该类接受一个构造参数,该值传入该值以针对该特定实例进行测试.
从 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)
Run Code Online (Sandbox Code Playgroud)
在另一篇文章中,我偶然发现 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
Run Code Online (Sandbox Code Playgroud)
上面的代码与我的第一篇文章的作用完全相同。不需要导入,只需编写一个 python 类即可。
您可以通过键入以下内容来执行测试:
nosetests filename
归档时间: |
|
查看次数: |
4413 次 |
最近记录: |