python如何判断整数-关于python:判断一个整数在范围内

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

1self.assertBetween(998, 1000, my_integer)

有没有一种公认的方法可以做到这一点?或者我必须这样做:

1

2self.assertTrue(998 <= my_integer)

self.assertTrue(my_integer <= 1000)

编辑迄今为止的答案表明:

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

在我的示例中,使用2个断言是否有任何好处?

使用1或2个断言取决于您真正想要了解和通信的内容。如果您只关心my_integer在限制之间,那么一个断言是一种更简洁的方法,可以测试并将其传递给下一个查看代码的人(可能在3个月内完成)。相反,如果有充分的理由分别知道my_integer是否低于1000,也知道my_integer是否高于998,那么使用2个断言更为合理。

您可以使用"链接比较":

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

谢谢你的回答,看我的编辑。

@是的,是我:你问过你的两个条件是否对这个有好处。对。它更简洁、更清晰、更高效(一个函数调用而不是两个函数调用)。

@约翰温克虽然我同意这是较短的,但我不认为这是我会推荐的,因为它有两个assertTrues相同的缺点。你会失去失败信息的冗长。使用assertTrue,你会得到AssertionError: False is not true,这不是很有帮助。我更喜欢看有什么问题,所以我宁愿用assertGreaterEqual(my_integer, 998); assertLessEqual(my_integer, 1000)--这样你就可以立即知道有什么问题(例如:AssertionError: 100 not greater or equal to 998)。

python有一个内置函数,您可以使用它:assertAlmostEqual。

1

2

3

4self.assertAlmostEqual(myinteger, 999, delta=1)

# is equivalent to

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

# ... but gives better error messages.

可选参数delta指定与要测试的值的允许距离。

我不认为用assertTrue进行内部比较是个好主意。-这样,您将在失败消息中丢失任何信息:

1AssertionError: False is not true

这根本没有帮助,你基本上回到了"原始"的assert,你失去了很多unittest的方法优势。

我建议:创建自己的自定义断言

您可以在其中打印更有意义的消息。例如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19import 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()

然后您将得到以下输出(缩短):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19======================================================================

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。

如果不需要自定义断言(这会添加另一个回溯记录和多行代码):

1

2

3

4

5

6...

def test_no_custom_assert(self):

my_integer = 100

self.assertGreaterEqual(my_integer, 998)

self.assertLessEqual(my_integer, 1000)

...

它比assertTrue(998 <= my_integer <= 1000)长一点(如果只使用一次,它可能比添加自定义断言短一点),但您仍然会收到很好的失败消息(也没有额外的回溯记录):

1

2

3

4

5

6

7======================================================================

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

如果将自定义断言方法放在一个具有_unittestglobal的模块中,那么将省略回溯,并且您将获得使用内置TestCase.assertX方法的清晰的回溯。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值