如果iterable不为空,有没有办法检查Python unittest断言?

Ale*_*kov 55 python unit-testing assertions python-2.7 python-unittest

在向服务提交查询后,我得到一个字典/列表,我想确保它不是空的.我在Python 2.7上.

我很惊讶我没有看到类实例的任何assertEmpty方法unittest.TestCase.

现有的替代品如:

self.assertTrue(bool(d))
Run Code Online (Sandbox Code Playgroud)

self.assertNotEqual(d,{})
Run Code Online (Sandbox Code Playgroud)

self.assertGreater(len(d),0)
Run Code Online (Sandbox Code Playgroud)

只是看起来不对劲.

Python unittest框架中是否缺少这种方法?如果是,那么断言迭代不为空的最pythonic方法是什么?

gpl*_*yer 84

空列表/ dicts评估为False,因此self.assertTrue(d)完成工作.

  • 这行得通,但没有达到最不令人惊讶的原则,通常清晰度在单元测试中胜过简洁。 (4认同)
  • 对。那么单元测试中没有断言方法可以检查空性吗?在代码周围使用 assertTrue 和 assertFalse 很烦人...... (2认同)

Jos*_*h J 8

完全取决于您的需求.

如果要确保对象是可迭代的并且它不为空:

# TypeError: object of type 'NoneType' has no len()
# if my_iterable is None
self.assertTrue(len(my_iterable))
Run Code Online (Sandbox Code Playgroud)

如果被测对象可以None:

self.assertTrue(my_maybe_iterable)
Run Code Online (Sandbox Code Playgroud)


win*_*rrr 5

Python 中的“假”值

假(有时写成假)值是在布尔上下文中遇到时被认为是假的值。

根据官方文档,以下内置类型评估为假:

  • 常量定义为 false:NoneFalse.
  • 任何数字类型的零:0, 0.0, 0j, Decimal(0),Fraction(0, 1)
  • 空序列和集合:'', (), [], {}, set(),range(0)

因此,可以检查

(官方文档有所有可用断言方法的完整列表。)

干净的代码

所有这些assertTrue()assertFalse()调用都是一种误导,因为我们想要检查是否为空,并且需要知道哪些类型评估false为正确理解测试中发生的事情。

因此,对于干净的代码,也为了更好的可读性,我们可以简单地定义我们自己assertEmpty()assertNotEmpty()方法,像这样:

def assertEmpty(self, obj):
    self.assertFalse(obj)

def assertNotEmpty(self, obj):
    self.assertTrue(obj)
Run Code Online (Sandbox Code Playgroud)