Sử dụng unittest.TestCase.assertRaises để kiểm tra hàm có ném ngoại lệ mong đợi hay không.
Cách 1: Context Manager (khuyên dùng)
import unittest
class MyTestCase(unittest.TestCase):
def test_add_int_and_str(self):
with self.assertRaises(TypeError):
1 + '1' # Phải ném TypeError
unittest.main(exit=False)
Cách 2: Truyền callable và args
import operator
class MyTestCase(unittest.TestCase):
def test_add_int_and_str_v2(self):
self.assertRaises(TypeError, operator.add, 1, '1')
Đầu ra test thành công
.. ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK
Giải thích
assertRaises(ExceptionType, callable, *args, **kwargs): Gọi callable với args/kwargs, kiểm tra ném ExceptionType.- Context manager (
with self.assertRaises(...)) dễ đọc hơn, tự động cleanup. - Có thể dùng
assertRaisesRegexđể kiểm tra cả message lỗi.
Ví dụ kiểm tra exception tùy chỉnh
def divide(a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
class TestDivide(unittest.TestCase):
def test_divide_by_zero(self):
with self.assertRaises(ValueError) as cm:
divide(10, 0)
self.assertEqual(str(cm.exception), "Cannot divide by zero")