【发布时间】:2015-11-03 05:28:56
【问题描述】:
在 Python 测试中,为什么要使用断言方法:
self.assertEqual(response.status_code, 200)
self.assertIn('key', my_dict)
self.assertIsNotNone(thing)
与直接断言相反:
assert response.status_code == 200
assert 'key' in my_dict
assert thing is not None
根据docs:
使用这些方法代替 assert 语句,以便测试运行器可以累积所有测试结果并生成报告
尽管这似乎是假的,但测试运行者可以累积结果并生成报告。在 related post 中,unutbu 表明 unittest 将引发 AssertionError,就像 assert 语句一样,那是 7 年前的事了,所以它也不是一个闪亮的新功能。
使用 pytest 等现代测试运行程序,断言辅助方法生成的失败消息不再具有可读性(可以说 unittest 的 camelCase 样式是 less 可读的)。 那么,为什么不在您的测试中使用 assert 语句? 有哪些明显的缺点?为什么 CPython 等重要项目还没有从 unittest 中移除?
【问题讨论】:
-
我在
unittest之外工作,所以我使用print()而不是assert。我认为这完全取决于您项目的复杂性和规模。 -
这似乎主要是见仁见智。如果您认为
assert更好,那么没有什么可以阻止(除了您的同事不同意)您使用它。但是应该知道,您可能会覆盖TestCase类中的方法并自定义行为 -assert语句没有这种灵活性。此外,TestCase.failureException可能会被更改,这会使您认为它与assert语句引发的异常相同的观点无效(如果您想将assert视为错误而不是失败,则可以使用此方法)。 -
简单的
assert更具可读性。因此,如果您的测试失败,请始终使用pytest。 -
@o11c 是的,我同意。但问题更多的是,为什么所有这些
self.assertStuff方法都存在,为什么许多受人尊敬的库仍然积极使用它们。
标签: python unit-testing pytest assert nose