"assert False" 和 "self.assertFalse" 之间有什么优势或区别?
"assert False" 和 "self.assertFalse" 之间有什么优势或区别?
我正在编写测试,并听说有人建议使用self.assertFalse
而不是assert False
。为什么要这样做?有什么好处吗?
在测试代码中,有时会使用assert False
来表示测试出现错误,但是这种方式在出现异常时并没有提供有用的日志信息。而self.assertFalse()
则会抛出一个测试失败的异常,并提供了测试失败的信息,例如错误消息和测试名称。
assert False
表示出现了一个错误,即测试无法运行。而self.assertFalse()
表示出现了一个失败,即测试代码虽然运行了,但是产生了错误的结果。
错误是代码中的严重问题,需要进行修复。而失败只是需要进行修正的失败。
某些情况下,assert False
语句需要被删除,因为它没有提供有用的信息。
然而,有人指出这种说法是错误的。测试运行器应该(并且确实)捕获AssertionError
并将其正确地报告为测试失败。
在assert False
语句中,可以添加一些有用的信息,例如assert False, "INFO"
。
在运行上述代码时,我们会得到相同的日志信息和相同的失败结果。这是因为unittest.TestCase
定义了failureException = AssertionError
。当你使用assert False
时,会引发一个AssertionError
异常。当你使用self.assertFalse(True)
时,也会引发一个failureExeception
异常。由于这两个异常是相同的,所以没有明显的区别。
然而,assert
和self.assertFalse
在惯例上是不同的。assert
用于声明在代码的某一点上应该满足某个条件。它在开发过程中被用作一个支撑,但不应该在生产代码中使用。如果你运行python -O my_unittest.py
,所有的断言语句都会被忽略。这会破坏你对assert
的预期使用,可能导致单元测试通过,即使存在失败。
尽管(不带-O标志)结果相同,但assert
不应该在单元测试代码中使用。在编写单元测试时,请使用self.assertTrue
或self.assertFalse
。而不是使用self.assertFalse(True)
,你可以(并且可能应该)使用self.fail()
。