这几天为什么不在测试中使用python的assert语句?

时间:2015-11-03 05:28:57

标签: python unit-testing pytest nose

在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从单元测试中移开呢?

3 个答案:

答案 0 :(得分:5)

使用assert关键字或专用方法之间的主要区别在于输出报告。请注意,assert后面的语句始终为TrueFalse,且不能包含任何额外信息。

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:

http://pytest.org/latest/

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没有这样的指标。