Python: Продвинутое тестирование

Теория: Тестирование ошибок

В этом уроке мы начнем погружаться в тестирование и обсудим нюансы, которые возникают в тестировании приложений.

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

Посмотрим на примере такого теста:

def test_exception():
    try:
        function_with_exception(0)
    except Exception as e:
        assert e

Этот код пытается протестировать ситуацию, при которой функция function_with_exception() генерирует исключение, если ей передать 0. Как думаете, этот тест проверит, что функция действительно порождает исключение?

На самом деле, нет. Если функция function_with_exception() не сгенерирует исключение, то тест пройдет, потому что код не попадет в блок except.

В Pytest встроен контекстный менеджер, который самостоятельно отлавливает исключение и проверяет, что оно вообще было сгенерировано:

import pytest


def test_exception():
    with pytest.raises(Exception):
        function_with_exception(0)

Здесь raises перехватывает только те исключения, которые являются подтипами переданного класса. Благодаря этому мы можем управлять ожидаемым поведением и ловить только те ошибки, которые хотим поймать.

Более того, можно проверить конкретное сообщение, которое пришло вместе с исключением:

import pytest


def test_exception():
    # Добавляем: as e. Здесь e – произвольное имя переменной, содержащей исключение
    with pytest.raises(Exception) as e:
        function_with_exception(0)

    assert str(e.value) == "expected message from exception"

Рекомендуемые программы

Завершено

0 / 8