Рубрики
Без рубрики

Исключения тестирования с Pтойцами

Каждый раз, когда я в конечном итоге желаю проверить, что ожидаемое исключение брошено с Pтойцами, я в конечном итоге смотришь … Теги с Python, тестированием.

Каждый раз, когда я заканчиваю, чтобы проверить, что ожидаемое исключение брошено с Питиш Я в конечном ищете глядя на синтаксис, поэтому вот оно:

import pytest

def test_my_exception_is_raised():
    with pytest.raises(MyException):
        my_function()

Этот тест потерпит неудачу, если звонить my_function () не Поднять исключение типа MyException Отказ

Но что, если я хочу проверить исключение, имеет ожидаемое сообщение?

def test_my_exception_is_raised_with_message():
    with pytest.raises(MyException) as e:
        my_function()
    assert "my message" in str(e.value)

В этом случае е имеет тип ExceptionInfo. , а не на самом деле Исключение Так что вам нужно использовать E.Value получить в сообщении. Вы также можете утверждать вещи о трассировке исключения через e.traaceback Но у меня недавно у меня не было упрецеляции.

Пока я снова смотрел на эти вещи, я обнаружил, что вы действительно можете чистить это немного в некоторых ситуациях, делая матч регулярного выражения на строке, представляющему брошению исключения, как это:

def test_my_exception_is_raised():
    with pytest.raises(MyException, match=r"^My message.*"):
        my_function()

Это использует Re.Search сделать сопоставление и увидеть Python Docs для быстрого регенератора.

Я думаю, что я бы использовал этот метод Regex, если бы я хотел утвердить что-то вроде наличия определенного кода ошибки где-то в моем сообщении об ошибке, но чем более подробно-версию, когда я утверждаю что-то об сообщении, который зависит от контекста моего Тест, такой как идентификатор того, что я просто пытался ввести в мою базу данных в сообщение об ошибке.

def test_this_raises_error_code_1234():
    with pytest.raises(MyException, match=r"1234"):
        myfunction()

def test_this_raises_error_including_item_id_and_data():
    my_test_id, my_test_data = "XXXX", {"some": "data"}
    my_test_object = MyThing(id=my_test_id, data=my_test_data)

    with pytest.raises(MyException) as e:
        my_function(my_test_object)

    assert f"Couldn't process MyThing {my_test_id} with data {my_test_data}!" in str(e.value)

Оригинал: “https://dev.to/caro401/testing-exceptions-with-pytest-7ch”