【发布时间】:2019-11-12 02:50:18
【问题描述】:
我正在寻找一种方法来为那些输入及其结果发生变化的情况参数化单元测试,但编写另一个测试感觉太乏味了。
假设str.isalnum 函数正在测试中。可以为每个字符写一个案例。
class TestIsalnum(unittest.TestCase):
def test_a(self):
self.assertTrue('a'.isalnum())
def test_dot(self):
self.assertFalse('.'.isalnum())
def test_comma(self):
self.assertFalse(','.isalnum())
应该有更简单的方法。瞧:下面这个命名良好的函数设计为在使用 unittest.main() 时不会被自动执行的测试识别。
class TestIsalnum(unittest.TestCase):
def tessst_with_params(self, char: str, value: bool):
self.assertEqual(char.isalnum(), value)
def test_not_alphanumerics(self):
chars = '.,_;*!'
for char in chars:
self.tessst_with_params(char, False)
一切顺利,测试通过。但它被认为是 one 测试。直观地说,每个调用都应该是它自己的测试用例。此外,如果一个 case 失败,则不会执行后面的 case,并且 traceback 包含的信息非常少。
是否有编写此类测试的既定方法?如果没有,应该如何实施这些类型的测试?
将功能放在一行上会更简洁一些,但我不确定风格和优雅。
def test_dot(self): self.tessst_with_params('.', False)
def test_comma(self): self.tessst_with_params(',', False)
【问题讨论】:
-
您可以尝试使用
Hypothesis,这是一个与unittest集成并允许您指定参数的单元测试库。 -
@MichaelBianconi 谢谢!看起来不错,重复问题中提供的
unittest.TestCase.subTest解决方案似乎也很有用。
标签: python unit-testing python-unittest