Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 断言整数在范围内_Python_Unit Testing_Python 2.7_Python Unittest - Fatal编程技术网

Python 断言整数在范围内

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

我正在用python编写一些单元测试,测试我是否收到一个整数。然而,有时这个整数可以被1或2关闭,我真的不在乎。本质上,我希望能够断言接收到的整数在某个范围内,比如:

self.assertBetween(998, 1000, my_integer)
有没有一种公认的方法可以做到这一点?或者我必须这样做:

self.assertTrue(998 <= my_integer)
self.assertTrue(my_integer <= 1000)
self.assertTrue(998您可以使用“”:

self.assertTrue(998
self.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