我正在用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)