"assert False"和"self.assertFalse"有什么优点或区别

chr*_*ley 29 python unit-testing assert

我正在写测试,我听到有人说要使用self.assertFalse而不是assert False.为什么这样,有什么好处?

unu*_*tbu 38

如果你跑

import unittest

class Test_Unittest(unittest.TestCase):
    def test_assert(self):
        assert False
    def test_assertFalse(self):
        self.assertFalse(True)

if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

您获得相同的日志信息,同样的失败:

FF
======================================================================
FAIL: test_assert (__main__.Test_Unittest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/unutbu/pybin/test.py", line 6, in test_assert
    assert False
AssertionError

======================================================================
FAIL: test_assertFalse (__main__.Test_Unittest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/unutbu/pybin/test.py", line 8, in test_assertFalse
    self.assertFalse(True)
AssertionError

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=2)
Run Code Online (Sandbox Code Playgroud)

两者处理相同的原因是因为unittest.TestCase定义

failureException = AssertionError
Run Code Online (Sandbox Code Playgroud)

当你说assert FalseAssertionError被引发时.

当你说self.assertFalse(True),a failureExeception被提出.

由于这些例外是相同的,因此没有明显的区别.

assert并且self.assertFalse不要在常规用法然而不同.

assert用于声明某个条件应该保存在代码中的某个点.它在开发过程中用作拐杖,但不能用于生产代码.如果运行python -O my_unittest.py,则忽略所有断言语句.这会破坏你的预期用途assert,即使在出现故障时也可能使你的单元测试通过.

即使(没有-O标志)结果相同,assert也不应在单元测试代码中使用.使用self.assertTrueself.assertFalse在编写单元测试时.


S.L*_*ott 28

assert False抛出一个没有有用的日志信息的异常.测试有错误.

self.assertFalse() 使用测试失败信息(如消息和测试名称)抛出测试失败异常.

错误 - 测试甚至无法运行 - 和失败之间存在差异 - 测试代码工作但产生了错误的答案.

错误是代码的严重问题.

失败只是需要修复的失败.

  • 你好,这显然是错误的。测试运行器应该(并且确实)捕获 `AssertionError` 并将它们正确报告为测试失败。 (2认同)

as.*_*as. 10

到目前为止,答案中有一点没有提到,有几个测试框架(例如py.testnose)使用python的内省魔术来允许你编写单元测试,如下所示:

# test_this_and_that.py
def test_frobber():
    assert frobber('x') == 'y'
# EOF
Run Code Online (Sandbox Code Playgroud)

不需要您在上面看到的任何单元测试样板.所以在某些情况下,它可以归结为一个框架/风格问题.