Python unittest成功断言None为False

时间:2016-01-27 13:20:01

标签: python unit-testing python-unittest

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!

3 个答案:

答案 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

如果您确实要确保某个值为TrueFalse,请使用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 ,那些是

  • 空字符串
  • 整数零
  • boolean False
  • 空列表
  • 空元组

所以是的,如果要显式检查self.assertEquals(False, None)布尔值,则应将其实现为False。这不是一个好主意,在python中你可以做到

if my_value:
    print 'truthy value'
else:
    print 'falsey value'

您可以使用boundary-value analysis设计测试用例来检查您的角落案例。