私はいくつかのユニットテストを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つのアサートを使用した私の例よりも優れている点はありますか?
" 連鎖比較 "を使用できます:
self.assertTrue(998 <= my_integer <= 1000)
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は、テストする値からの許容距離を指定します。
内部で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
self.assertTrue(998 <= my_integer <= 1000)