“assert False”和“self.assertFalse”的优缺点或区别是什么

44 投票
3 回答
44368 浏览
提问于 2025-04-15 23:27

我在写测试的时候,听到有人说要用 self.assertFalse,而不是 assert False。这是为什么呢?这样做有什么好处吗?

3 个回答

12

到目前为止,大家的回答中有一点没有提到,那就是有几个测试框架(比如 py.testnose),它们利用了Python的反射特性,让你可以这样写单元测试:

# test_this_and_that.py
def test_frobber():
    assert frobber('x') == 'y'
# EOF

这样就不需要上面提到的那些unittest的繁琐代码了。所以在某些情况下,这其实只是框架或风格的问题。

46

如果你运行

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()

你会得到相同的日志信息和相同的失败结果:

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)

这两者之所以处理方式相同,是因为 unittest.TestCase 定义了

failureException = AssertionError

当你写 assert False 时,会抛出一个 AssertionError 错误。

而当你写 self.assertFalse(True) 时,会抛出一个 failureExeception 错误。

因为这两种错误是一样的,所以看起来没有明显的区别。

不过,assertself.assertFalse 在使用上是有区别的。

assert 是用来声明在代码的某个点上应该满足某个条件。它在开发过程中可以作为一种辅助工具,但不应该在生产代码中使用。如果你运行 python -O my_unittest.py,所有的 assert 语句都会被忽略。这会影响你使用 assert 的初衷,可能导致你的单元测试在出现错误时仍然通过。

尽管(在没有 -O 标志的情况下)结果是一样的,但 assert 不应该在单元测试代码中使用。在编写单元测试时,应该使用 self.assertTrueself.assertFalse

37

assert False 会抛出一个异常,但没有什么有用的日志信息。这表示测试出现了错误。

self.assertFalse() 会抛出一个测试失败的异常,并附带一些测试失败的信息,比如消息和测试名称。

错误和失败是有区别的——错误是指测试根本无法运行,而失败是指测试代码运行了,但得到了错误的结果。

错误是代码中比较严重的问题。

失败只是需要修复的普通失败。

撰写回答