Python 断言整数在范围内
我正在用python编写一些单元测试,测试我是否收到一个整数。然而,有时这个整数可以被1或2关闭,我真的不在乎。本质上,我希望能够断言接收到的整数在某个范围内,比如:Python 断言整数在范围内,python,unit-testing,python-2.7,python-unittest,Python,Unit Testing,Python 2.7,Python Unittest,我正在用python编写一些单元测试,测试我是否收到一个整数。然而,有时这个整数可以被1或2关闭,我真的不在乎。本质上,我希望能够断言接收到的整数在某个范围内,比如: self.assertBetween(998, 1000, my_integer) 有没有一种公认的方法可以做到这一点?或者我必须这样做: self.assertTrue(998 <= my_integer) self.assertTrue(my_integer <= 1000) self.assertTrue(9
self.assertBetween(998, 1000, my_integer)
有没有一种公认的方法可以做到这一点?或者我必须这样做:
self.assertTrue(998 <= my_integer)
self.assertTrue(my_integer <= 1000)
self.assertTrue(998您可以使用“”:
self.assertTrue(998self.assertTrue(998Python有一个可用于此的工具:assertAlmostEqual
)
self.assertAlmostEqual(myinteger, 999, delta=1)
# is equivalent to
self.assertTrue(998 <= myinteger <= 1000)
# ... but gives better error messages.
self.assertalPosteQual(myinteger,999,delta=1)
#相当于
self.assertTrue(998我认为使用assertTrue
进行内部比较不是一个好主意-
这样,您将在失败消息中丢失任何信息:
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()
或者使用assertLessEqual
和assertGreaterEqual
如果您不希望自定义断言(这会添加另一个回溯记录和几行代码):
这比assertTrue(998@Yep_it's_Me:你问过这比你的两个独立条件有什么好处吗?是的,它更简洁、更清晰、更高效(一个函数调用而不是两个函数调用)@JohnZwinck虽然我同意这较短,但我不认为这是我会推荐的,因为它与两个assertTrue
s有相同的缺点。你会失去失败消息的详细性。使用assertTrue
,你会得到AssertionError:False不是真的
,这不是很有帮助。我更喜欢看看哪里出了问题,所以我您更愿意使用assertGreaterEqual(my_integer,998);assertLessEqual(my_integer,1000)
——这样您就可以立即知道哪里出了问题(例如:断言错误:100不大于或等于998
)。使用1个断言还是2个断言取决于您真正想知道和传达的内容。如果您只关心my_integer
是否在限制范围内,则一个断言是一种更简洁的方法,可以测试并将其传达给下一个查看代码的人(可能在3个月内)。相反,如果有充分的理由分别知道my_integer
是否低于1000,也知道my_integer
是否高于998,那么使用2个断言就更有意义。如果将自定义断言方法放在带有\u unittest
全局的模块中,则回溯将被忽略,并且您将得到一个干净的traceback使用内置的TestCase.assertX
方法。
self.assertAlmostEqual(myinteger, 999, delta=1)
# is equivalent to
self.assertTrue(998 <= myinteger <= 1000)
# ... but gives better error messages.
AssertionError: False is not true
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
----------------------------------------------------------------------
...
def test_no_custom_assert(self):
my_integer = 100
self.assertGreaterEqual(my_integer, 998)
self.assertLessEqual(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