对于这种测试,我最喜欢的工具是参数化测试用例,它看起来像这样:
from nose_parameterized import parameterized
class MyTestCase(unittest.TestCase):
@parameterized.expand([(1,), (2,), (3,)])
def test_read_from_disk(self, file_number):
input = read_from_disk('input%02d' % file_number)
expected = read_from_disk('output%02d' % file_number)
actual = run(input)
self.assertEquals(expected, actual)
您编写测试用例以获取所需的任何参数,将参数化函数包装在@parameterized.expand
装饰器中,并在 expand() 调用中提供输入参数集。然后,测试运行者请为每组参数运行一个单独的测试!
在这种情况下,只有一个参数,因此expand()
调用有一个不幸的额外嵌套级别,但是当您的用例稍微复杂一点并且您使用param
对象为您的测试函数提供 args 和 kwargs 时,这种模式变得特别好:
from nose_parameterized import parameterized, param
class MyTestCase(unittest.TestCase):
@parameterized.expand([
param(english='father', spanish='padre'),
param(english='taco', spanish='taco'),
('earth', 'tierra'), # A regular tuple still works too, but is less readable
...
])
def test_translate_to_spanish(self, english, spanish):
self.assertEqual(translator(english), spanish)
该模式允许您轻松清晰地指定多组输入参数,并且只需编写一次测试逻辑。
I use nose for testing, so my example uses nose-parameterized, but there's also a unittest-compatible version.