在Python测试中,为什么要使用assert方法:
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
与断言语句相同,这是7年前的事情,所以它也不是一个闪亮的新功能。
对于像pytest这样的现代测试运行器,断言助手方法生成的失败消息不再具有可读性(可以说,单元测试的camelCase样式 less 可读)。 那么,为什么不在测试中使用assert语句呢?有哪些缺点以及为什么没有重要的项目如CPython从单元测试中移开呢?
答案 0 :(得分:5)
使用assert
关键字或专用方法之间的主要区别在于输出报告。请注意,assert
后面的语句始终为True
或False
,且不能包含任何额外信息。
assert 3 == 4
只会在报告中显示AssertionError
。
然而,
self.assertTrue(3 == 4)
提供一些额外信息:AssertionError: False is not true
。不是很有帮助,但请考虑:
self.assertEqual(3, 4)
它会更好,因为它告诉你AssertionError: 3 != 4
。你阅读报告,你知道它是什么样的断言(相等测试)和涉及的价值。
假设你有一些函数,并想要断言它返回的值。 你可以用两种方式做到这一点:
# assert statement
assert your_function_to_test() == expected_result
# unittest style
self.assertEqual(your_function_to_test(), expected_result)
如果出现错误,第一个没有给出断言错误以外的信息,第二个告诉你断言的类型(相等测试)和涉及的值(返回和预期的值)。
对于小型项目,我从不打扰单元测试风格,因为输入时间较长,但在大型项目中,您可能想了解更多有关错误的信息。
答案 1 :(得分:1)
您找到的文档链接是正确的答案。如果您不喜欢这种写作测试方式,我强烈建议您使用pytest:
pytest做了很多工作,允许你以你想要的方式使用assert语句。它还有许多其他非常好的功能,例如它们的灯具。
答案 2 :(得分:1)
我认为在当前的pytest版本中,您可以在大多数情况下使用assert
,因为上下文是由测试框架(pytest 2.9.2)重建的:
def test_requests(self):
...
> self.assertEqual(cm.exception.response.status_code, 200)
E AssertionError: 404 != 200
看起来类似于
def test_requests(self):
...
> assert cm.exception.response.status_code == 200
E AssertionError: assert 404 == 200
E -404
E +200
从理论上讲,使用self.assertXxx()
方法将使pytest能够计算没有失败的断言数量,但是AFAIK没有这样的指标。