“assert False”和“self.assertFalse”的优缺点或区别是什么
我在写测试的时候,听到有人说要用 self.assertFalse
,而不是 assert False
。这是为什么呢?这样做有什么好处吗?
3 个回答
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
错误。
因为这两种错误是一样的,所以看起来没有明显的区别。
不过,assert
和 self.assertFalse
在使用上是有区别的。
assert
是用来声明在代码的某个点上应该满足某个条件。它在开发过程中可以作为一种辅助工具,但不应该在生产代码中使用。如果你运行 python -O my_unittest.py
,所有的 assert 语句都会被忽略。这会影响你使用 assert
的初衷,可能导致你的单元测试在出现错误时仍然通过。
尽管(在没有 -O 标志的情况下)结果是一样的,但 assert
不应该在单元测试代码中使用。在编写单元测试时,应该使用 self.assertTrue
或 self.assertFalse
。
37
assert False
会抛出一个异常,但没有什么有用的日志信息。这表示测试出现了错误。
self.assertFalse()
会抛出一个测试失败的异常,并附带一些测试失败的信息,比如消息和测试名称。
错误和失败是有区别的——错误是指测试根本无法运行,而失败是指测试代码运行了,但得到了错误的结果。
错误是代码中比较严重的问题。
失败只是需要修复的普通失败。