web-dev-qa-db-ja.com

iterableが空でない場合、Python unittest assertで確認する方法はありますか?

サービスにクエリを送信した後、辞書/リストを取得し、空でないことを確認したいと思います。私はPython 2.7を使用しています。

unittest.TestCaseクラスインスタンスのassertEmptyメソッドが表示されないことに驚いています。

次のような既存の代替手段:

self.assertTrue(bool(d))

そして

self.assertNotEqual(d,{})

そして

self.assertGreater(len(d),0)

正しく見えません。

この種のメソッドはPython unittestフレームワークにありませんか?はいの場合、iterableが空でないと断言する最もPython的な方法は何でしょうか?

49

空のリスト/辞書はFalseと評価されるため、self.assertTrue(d)は仕事を完了します。

76
gplayer

探しているものによって異なります。

オブジェクトが反復可能であり、空でないことを確認する場合:

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

テスト対象のオブジェクトがNoneであっても問題ない場合:

self.assertTrue(my_maybe_iterable)
8
Josh J

@gplayerで既に述べたように、assertTrue()で空でないことをチェックすることができます(もちろん、空の場合はassertFalse()でその逆も可能です)。

しかし、@ Alex Tereshenkovが以前コメントで指摘したように、これらのすべてのassertTrue()およびassertFalse()メソッド呼び出しはコードを乱雑にし、空をチェックしたかったために誤解を招く恐れがあります。

したがって、コードを簡潔にするために、独自のassertEmpty()およびassertNotEmpty()メソッドを定義できます。

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

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

多分:

self.assertRaises(StopIteration, next(iterable_object))
0
Eugene Soldatov

これのすべての功績はwinklerrrにあります。私は彼のアイデアを拡張しているだけです。

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

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

警告、ミックスインは左に行く必要があります:

class MyThoroughTests( AssertNotEmptyMixin, TestCase ):
    def test_my_code( self ):
        ...
        self.assertNotEmpty( something )
0
Rick Graves