web-dev-qa-db-ja.com

整数が範囲内であることを表明する

私はいくつかのユニットテストをpythonで書いています。これは整数を受け取ったかどうかをテストしています。しかし、この整数が1または2ずれていることがあり、本当に気にしない場合があります。基本的に、受け取った整数が特定の範囲内にあることを表明するには、次のようにします。

self.assertBetween(998, 1000, my_integer)

これを行うための受け入れられた方法はありますか?または私はこのようなことをしなければなりませんか:

self.assertTrue(998 <= my_integer)
self.assertTrue(my_integer <= 1000)

[〜#〜] edit [〜#〜]これまでの答えは次のとおりです。

self.assertTrue(998 <= my_integer <= 1000)

2つのアサートを使用した私の例よりも優れている点はありますか?

20
Yep_It's_Me

" 連鎖比較 "を使用できます:

self.assertTrue(998 <= my_integer <= 1000)
23
John Zwinck

Pythonには built in function があり、これに使用できます:assertAlmostEqual

self.assertAlmostEqual(myinteger, 999, delta=1)
# is equivalent to
self.assertTrue(998 <= myinteger <= 1000)
# ... but gives better error messages.

オプションのパラメーターdeltaは、テストする値からの許容距離を指定します。

17
Teodor

内部でassertTrueを比較して使用することは良い考えではないと思います。このようにすると、FAILメッセージの情報が失われます。

AssertionError: False is not true

これはまったく役に立たず、基本的には「未加工」のassertに戻り、unittestのメソッドの多くの利点を失っています。

私はどちらかをお勧めします:

独自のカスタムアサートを作成する

より意味のあるメッセージを出力できます。例えば:

import unittest

class BetweenAssertMixin(object):
    def assertBetween(self, x, lo, hi):
        if not (lo <= x <= hi):
            raise AssertionError('%r not between %r and %r' % (x, lo, hi))

class Test1(unittest.TestCase, BetweenAssertMixin):
    def test_between(self):
        self.assertBetween(999, 998, 1000)

    def test_too_low(self):
        self.assertBetween(997, 998, 1000)

    def test_too_high(self):
        self.assertBetween(1001, 998, 1000)

if __name__ == '__main__':
    unittest.main()

その後、次の出力(短縮)が表示されます。

======================================================================
FAIL: test_too_high (__main__.Test1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "example.py", line 19, in test_too_high
    self.assertBetween(1001, 998, 1000)
  File "example.py", line 8, in assertBetween
    raise AssertionError('%r is not between %r and %r' % (x, lo, hi))
AssertionError: 1001 is not between 998 and 1000
======================================================================
FAIL: test_too_low (__main__.Test1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "example.py", line 16, in test_too_low
    self.assertBetween(997, 998, 1000)
  File "example.py", line 8, in assertBetween
    raise AssertionError('%r is not between %r and %r' % (x, lo, hi))
AssertionError: 997 is not between 998 and 1000
----------------------------------------------------------------------

またはassertLessEqualおよびassertGreaterEqualを使用します

カスタムアサートが必要ない場合(別のトレースバックレコードと数行のコードが追加されます):

...
def test_no_custom_assert(self):
    my_integer = 100
    self.assertGreaterEqual(my_integer, 998)
    self.assertLessEqual(my_integer, 1000)
...

これはassertTrue(998 <= my_integer <= 1000)よりも少し長いです(カスタムアサートを追加するよりも全体で短い場合があります)。

======================================================================
FAIL: test_no_custom_assert (__main__.Test1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "example.py", line 23, in test_no_custom_assert
    self.assertGreaterEqual(my_integer, 998)
AssertionError: 100 not greater than or equal to 998
5
Jan Spurny
self.assertTrue(998 <= my_integer <= 1000)
1
saulspatz