assertFalse
为什么None
成功?
import unittest
class TestNoneIsFalse(unittest.TestCase):
def test_none_is_false(self):
self.assertFalse(None)
结果:
> python -m unittest temp
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
似乎这种行为会引发错误,而函数并不总是返回值。例如:
def is_lower_than_5(x):
if x < 5:
return True
elif x > 5:
return False
....
def test_5_is_not_lower_than_5(self):
self.assertFalse(is_lower_than_5(5))
即使它失败,上述测试也会通过。它缺少应该捕获的代码中的错误。
我们应该如何断言值在字面上False
而不仅仅是布尔上下文中的false? e.g。
self.assertEquals(False, None) # assert fails. good!
答案 0 :(得分:8)
None
是假的,0
,""
,[]
,......
assertFalse
不会按身份检查给定值是否为False
。此行为与if
语句一致:
if not None:
print('falsy value!')
同样,assertTrue
不会检查值是否为True
,因此1
,"abc"
,[1, 2, 3]
等值会通过测试。有关详细信息,请参阅Truth Value Testing。
此行为也是explicitly documented:
assertTrue(expr, msg=None) assertFalse(expr, msg=None)测试 expr 是否为真(或假)。
请注意,这相当于
bool(expr) is True
,而不是expr is True
如果您确实要确保某个值为True
或False
,请使用assertIs
。
答案 1 :(得分:1)
您的案例实际上已在文档中指出:
请注意,这相当于bool(expr)为True而不是expr True(对后者使用assertIs(expr,True))。
来源:https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertFalse
答案 2 :(得分:0)
函数的Python默认返回值为None
。
Python也实现了Duck typing,所以有些值被威胁为 falsey ,那些是
所以是的,如果要显式检查self.assertEquals(False, None)
布尔值,则应将其实现为False
。这不是一个好主意,在python中你可以做到
if my_value:
print 'truthy value'
else:
print 'falsey value'
您可以使用boundary-value analysis设计测试用例来检查您的角落案例。