Как настроить и запустить свой первый тест Python с помощью Pytest

Как настроить и запустить свой первый тест Python с помощью Pytest
Такие читатели, как вы, помогают поддерживать MUO. Когда вы совершаете покупку по ссылкам на нашем сайте, мы можем получать партнерскую комиссию. Читать далее.

Тестирование — неотъемлемая часть разработки программного обеспечения. Это помогает выявлять ошибки на ранней стадии и снижает вероятность ошибок в дальнейшем.





Pytest — один из самых популярных фреймворков для тестирования Python. Он позволяет вам писать небольшие и читаемые тесты, которые можно масштабировать по мере роста вашего приложения. Узнайте, как настроить и использовать Pytest с кодом Python.





СДЕЛАТЬ ВИДЕО ДНЯ ПРОКРУТИТЕ, ЧТОБЫ ПРОДОЛЖИТЬ СОДЕРЖАНИЕ

Настройка Pytest

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





Чтобы создать виртуальную среду, выполните следующую команду перед установкой Pytest.

 python -m venv tests 

Это создаст новую виртуальную среду с именем test в вашем текущем каталоге. Чтобы активировать среду, выполните эту команду, если вы используете Linux или Mac:



 source tests/bin/activate 

Для Windows выполните эту команду:

 tests\Scripts\activate 

Чтобы установить Pytest, вы можете использовать pip, менеджер пакетов Python, с помощью этой команды в своем терминале:





АД5D0F2CB01E9469C34928ACE3B14EA6455B051B

Если у вас нет Пипа, не волнуйтесь; ты можешь установить Pip на Windows, Mac и Linux .

Выполните следующую команду, чтобы проверить, правильно ли вы установили Pytest.





 pytest --version 

Это должно вернуть установленный номер версии.

где я могу получить щенка

Создание вашего первого теста

Рассмотрим следующую функцию, которая складывает два числа и возвращает результат.

4F7CAABBCDC42E5E186BC3DF8AB4E675F532E8868

Несколько вещей могут пойти не так с этой функцией. Например, рассмотрим, что произойдет, если вы вызовете функцию с нечисловыми значениями, такими как None или значение типа string. Это некоторые из потенциальных пограничных случаев, которые могут привести к сбою функции.

Один из первых написанных вами тестов должен проверить, возвращает ли функция ожидаемый результат. Для этого вы можете использовать ключевое слово assert, чтобы сравнить фактический результат функции с ожидаемым результатом. В случае с функцией add_numbers тестовая функция может выглядеть так:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 5
    assert add_numbers(-1, 1) == 0
    assert add_numbers(0, 0) == 0

Эта тестовая функция включает три оператора assert, каждый из которых сравнивает выходные данные функции add_numbers с ожидаемым значением. Первый тест проверяет, что сложение 2 и 3 возвращает 5, второй тест проверяет, что сложение -1 и 1 возвращает 0, а третий тест проверяет, что сложение 0 и 0 возвращает 0.

Как запускать тесты с помощью Pytest

После того, как вы написали свои тесты, следующим шагом будет их запуск. Чтобы сделать это с помощью Pytest, перейдите в каталог, содержащий ваш тестовый файл, и выполните команду pytest:

 pytest 

Если все работает как положено, вы увидите сообщение о том, что все тесты прошли успешно. Однако, если какое-либо из утверждений не выполняется, Pytest сообщит об ошибке и покажет вам входные значения, вызвавшие ошибку.

Например, допустим, вы запустили следующую тестовую функцию для функции add_numbers:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 6
    assert add_numbers(-1, 1) == 0
    assert add_numbers(0, 0) == 0

Первое утверждение завершится ошибкой, так как ожидаемое значение равно 6, а фактическое значение равно 5 (сумма 2 и 3). Pytest вернет следующее сообщение:

  Вывод запуска pytest, показывающий сбой одного теста

Это сообщение показывает вам входные значения, которые вызвали это значение, а также сообщает вам, каким должно быть фактическое значение. Это упрощает быстрое выявление и исправление ошибок в вашем коде.

Использование Pytest.raises для утверждения исключений

Теперь давайте напишем тест, чтобы покрыть один из крайних случаев функции add_numbers. Когда вы передаете функции нечисловой аргумент, например None, Python должен вызвать исключение TypeError.

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

Для этого скопируйте следующую тестовую функцию в свой файл. Он использует менеджер контекста pytest.raises, чтобы проверить, вызывает ли вызов функции add_number с «None» исключение TypeError.

 import pytest 

def test_add_numbers_with_invalid_inputs():
    with pytest.raises(TypeError):
        add_numbers(None, 2)

Затем запустите Pytest из командной строки. Если исключение не возникнет, тест завершится ошибкой.

Вы можете пойти дальше и проверить детали сообщения об исключении. Менеджер контекста создает объект ExceptionInfo с подробностями.

Например, в этой тестовой функции подтвердите сообщение об исключении следующим образом:

 def test_add_numbers_with_invalid_inputs(): 
    with pytest.raises(TypeError) as exc_info:
        add_numbers(None, 2)

    assert exc_info.value.args[0] == "unsupported operand type(s) for +: 'NoneType' and 'int'"

Если сообщение не совпадает с сообщением в тесте, Pytest укажет на сбой.

Как использовать параметризованное тестирование для одновременного тестирования нескольких входных данных

Вместо того, чтобы вручную вызывать функцию с несколькими входными данными, например:

 def test_add_numbers(): 
    assert add_numbers(2, 3) == 6
    assert add_numbers(-1, 1) == 0
    assert add_numbers(0, 0) == 0

Pytest предоставляет функцию параметризованного тестирования, которая позволяет вам делать то же самое проще. Вот как вы можете переписать тестовую функцию выше:

 import pytest 

@pytest.mark.parametrize("a,b,expected", [
    (2, 3, 5),
    (-1, 1, 0),
    (0, 0, 0)
])
def test_add_numbers(a, b, expected):
    assert add_numbers(a, b) == expected

Как запустить несколько тестов

Пока вы написали только два теста для функции add_numbers. Для более сложных функций с большим количеством тестов вы можете сгруппировать их в класс.

Например, вот как можно создать тестовый класс для функции добавления.

 class TestAddFunction: 
@pytest.mark.parametrize("a, b, expected", [
        (2, 3, 5),
        (-1, 1, 0),
        (0, 0, 0),
    ])
    def test_addition_with_numbers(self, a, b, expected):
        assert add_numbers(a, b) == expected

    def test_add_numbers_with_invalid_inputs(self):
        with pytest.raises(TypeError) as exc_info:
            add_numbers(None, 2)
        assert exc_info.value.args[0] == "unsupported operand type(s) for +: 'NoneType' and 'int'"

Обратите внимание, что вам нужно добавить к имени класса префикс «Test», чтобы Pytest мог идентифицировать его как тестовый класс и запустить его.

Pytest имеет гораздо больше возможностей

Используя Pytest, вы можете автоматически проверять, работает ли ваш код так, как вы ожидаете. Pytest предлагает множество других функций, таких как фикстуры, которые позволяют вам настраивать и удалять тестовые данные, а также метки для настройки метаданных в ваших тестовых функциях.

Кроме того, вы можете интегрировать Pytest в конвейер непрерывной интеграции и запускать тесты автоматически и непрерывно при изменении кода.