Python Unittest: модульное тестирование сообщения, переданного в поднятом исключении

Я тестирую модуль радиуса круга, используя фреймворк unittest на Python. Если радиус не является числовым значением, я создаю исключение с помощью специального сообщения.

Файл: circle.py

class Circle():

    def __init__(self, radius):
        if not isinstance (radius, (int,float)):
            raise TypeError('radius must be a number')
        else:
            self.radius = radius

Файл: test_circle.py

import unittest
from circle import Circle

class CircleTest(unittest.TestCase):

    def test_radius(self):
        c1 = Circle(2.5)
        self.assertEqual(c1.radius, 2.5)

    def test_radius_type(self):
        self.assertRaises(TypeError, Circle, 'hello')

if __name__ == "__main__":
    unittest.main()

Теперь я могу проверить возникшее исключение. Но я также хочу узнать, является ли сообщение, переданное в исключении, точным сообщением или нет. Может ли кто-нибудь посоветовать мне, как протестировать и проверить сообщение, переданное в исключении в unittest в Python?


person Sujit Devkar    schedule 06.04.2020    source источник


Ответы (1)


Если вы хотите проверить сообщение об ошибке в исключении, вам необходимо зафиксировать исключение.

def test_radius_type(self):
    with self.assertRaises(TypeError) as exc:
        c = Circle('hello')
    self.assertEquals(str(exc.exception), "radius must be a number")

Тем не менее, настраиваемое исключение будет чище.

class NotANumberError(TypeError):
    pass


class Circle:
    def __init__(self, radius):
        try:
            self.radius = float(radius)
        except ValueError:
            raise NotANumberError


...

def test_radius_type(self):
    self.assertRaises(NotANumber, Circle, 'hello')

Сам тип исключения несет ту же информацию, что и произвольное сообщение об ошибке.

person chepner    schedule 06.04.2020
comment
Я проверил официальную документацию. Я пытался сопоставить строку в assertRaises (TypeError, Circle, 'hello', 'radius must be a number') согласно предложению VSCode. Я также попытался поместить self.assertEquals () внутрь self.assertRaises (), но теперь понял проблему с отступом. Спасибо - person Sujit Devkar; 06.04.2020
comment
У меня не сработало. Когда я print(str(exc)) получаю <unittest.case._AssertRaisesContext object at 0x109fb4280> Согласно документам из комментария @jonrsharpe выше, вы должны использовать exc.exception, чтобы получить фактическое исключение. print(str(exc.exception)) дает мне фактическое сообщение об ошибке - person herteladrian; 21.07.2021
comment
Ах хорошо. exc на самом деле не исключение, а диспетчер контекста, который содержит перехваченное исключение. - person chepner; 21.07.2021