python unittest 将断言与上下文管理器相结合
python unittest combine assertions with context manager
为了测试一个函数,当第一个参数不是整数类型时我抛出一个异常:
def magicWithInteger(integerA):
if not isinstance(integerA, int):
raise TypeError("argument should be integer type")
我使用 unittest assertRaises 和 assertEqual,所以我可以检查带有错误参数的函数是否引发 TypeError 以及 TypeError 是否实际吐出“参数应为整数类型”
class test(unittest.TestCase):
def test_magicWithInteger(self):
self.assertRaises(TypeError, MagicWithInteger, "TEST")
try:
MagicWithInteger("TEST")
except TypeError as error:
self.assertEqual(str(error), "argument should be integer type")
两次调用该函数看起来有点傻,第一次检查它是否引发异常,第二次检查哪个 TypeError 异常?
经过一些研究,我知道应该可以使用上下文管理器一次完成这两个测试,但我似乎无法维持生计...
您可以使用 with self.assertRaises(ExceptionType)
上下文管理器来捕获异常。根据 assertRaises manual,您可以查看 with
块之后的异常:如果您使用 as <name>
语法给它命名,它似乎仍在范围内:
with self.assertRaises(SomeException) as cm:
do_something()
the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
因此您的代码将变为:
class test(unittest.TestCase):
def test_magicWithInteger(self):
with self.assertRaises(TypeError) as cm:
MagicWithInteger("TEST")
self.assertEqual(str(cm.exception), "argument should be integer type")
PS:我不知道这一点,但是 with
语句没有在 Python 中引入新的范围。 with
中定义的变量与 with
语句本身在同一范围内。参见 to this specific point and, for what actually creates scopes, 。
为了测试一个函数,当第一个参数不是整数类型时我抛出一个异常:
def magicWithInteger(integerA):
if not isinstance(integerA, int):
raise TypeError("argument should be integer type")
我使用 unittest assertRaises 和 assertEqual,所以我可以检查带有错误参数的函数是否引发 TypeError 以及 TypeError 是否实际吐出“参数应为整数类型”
class test(unittest.TestCase):
def test_magicWithInteger(self):
self.assertRaises(TypeError, MagicWithInteger, "TEST")
try:
MagicWithInteger("TEST")
except TypeError as error:
self.assertEqual(str(error), "argument should be integer type")
两次调用该函数看起来有点傻,第一次检查它是否引发异常,第二次检查哪个 TypeError 异常?
经过一些研究,我知道应该可以使用上下文管理器一次完成这两个测试,但我似乎无法维持生计...
您可以使用 with self.assertRaises(ExceptionType)
上下文管理器来捕获异常。根据 assertRaises manual,您可以查看 with
块之后的异常:如果您使用 as <name>
语法给它命名,它似乎仍在范围内:
with self.assertRaises(SomeException) as cm:
do_something()
the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
因此您的代码将变为:
class test(unittest.TestCase):
def test_magicWithInteger(self):
with self.assertRaises(TypeError) as cm:
MagicWithInteger("TEST")
self.assertEqual(str(cm.exception), "argument should be integer type")
PS:我不知道这一点,但是 with
语句没有在 Python 中引入新的范围。 with
中定义的变量与 with
语句本身在同一范围内。参见