有什么方法可以检查Python unittest assert是否可迭代不为空?


72

向服务提交查询后,我得到了字典/列表,并希望确保它不为空。我使用的是Python 2.7。

我很惊讶我没有assertEmptyunittest.TestCase类实例找到任何方法。

现有的替代方案,例如:

self.assertTrue(bool(d))

self.assertNotEqual(d,{})

self.assertGreater(len(d),0)

只是看起来不正确。

Python unittest框架中缺少这种方法吗?如果是,那么断言Iterable不为空的最Python方式是什么?



好的链接!我知道如何测试iterable是否为空。一直在寻找专门的unittest断言方法...感到惊讶的是,没有assertEmpty / assertNotEmpty方法-恕我直言,它将大大提高可读性,而不是在代码中
始终使用assertTrue和assertFalse

2
同意,只是认为这assertTrue可能有点清洁。我认为我个人的偏爱(也许是最有意义的选择)将是len!=0。我同意assertEmpty / assertNotEmpty方法在unittest框架中占有一席之地。
CollinD

4
请注意,“可迭代”比“列表或字典”大得多,并且没有办法在没有实际迭代的情况下判断通常是否为空。
DSM

Answers:


101

空列表/字典的评估结果为False,因此self.assertTrue(d)可以完成工作。


2
对。因此,在unittest中没有断言方法可以检查空度吗?在代码中到处都有assertTrue和
assertFalse令人讨厌

没有断言方法来检查的空虚-单元测试
gplayer

4
这行得通,但没有达到最小惊喜的原则,通常清晰度在单元测试中胜过简洁。
Hessle的马丁,

9

完全取决于您要查找的内容。

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

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

如果可以,则被测对象为None

self.assertTrue(my_maybe_iterable)


1

正如@gplayer已经提到的:可以使用来检查非空性assertTrue()assertFalse()当然也可以检查是否为空)。

但是,就像@Alex Tereshenkov先前在注释中指出的那样,所有这些assertTrue()assertFalse()方法调用都使代码混乱,并且由于我们想检查空度而有点误导。

因此,为了使代码更简洁,我们可以定义自己的assertEmpty()assertNotEmpty()方法:

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

def assertNotEmpty(self, obj):
    self.assertTrue(obj)

当例如标量或物体意外通过时,这难道不容易引起误解吗?
Merk

@Merk是的,您是正确的。但是,如果仅出于私人原因使用这些帮助程序功能,那应该没问题,因为您知道这些功能会做什么。如果要将该代码与其他开发人员放在一个小项目中,则可能需要添加一些文档字符串来说明其安全用法,或者只是对函数进行适当的重命名(例如assert_list_empty(self, a_list))。或者,如果您打算将这些功能添加到第三方测试库中,只需添加一些代码以确保您处理所有可能的输入(通过添加if ... elif ... else ...和实例检查)即可
winklerrr

0

所有这一切都归功于winklerrr,我只是在扩展他的想法:在需要assertEmpty或assertNotEmpty时提供可导入的mixins:

class AssertEmptyMixin( object ):
    def assertEmpty(self, obj):
        self.assertFalse(obj)

class AssertNotEmptyMixin( object ):
    def assertNotEmpty(self, obj):
        self.assertTrue(obj)

注意,mixins应该在左侧:

class MyThoroughTests( AssertNotEmptyMixin, TestCase ):
    def test_my_code( self ):
        ...
        self.assertNotEmpty( something )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.