Преимущества и недостатки Pytest
Преимущества и недостатки Pytest
Установка Pytest
Как писать тесты
Как писать тесты
Как писать тесты
Как писать тесты
Как писать тесты
Как писать тесты
Как писать тесты
Как писать тесты
Запуск тестов
Запуск тестов
Запуск тестов
Фикстуры в Pytest
Фикстуры в Pytest
Фикстуры в Pytest
Фикстуры в Pytest
Финализатор
Финализатор
Области действия фикстур
Области действия фикстур
Иерархии фикстур
Метки тестов
Метки тестов: пропуск теста
Пропуск теста при условии
Ожидаемый провал теста
Ожидаемый провал теста
Ожидаемый провал теста
Параметризация
Параметризация
Параметризация
Параметризация
Параметризация
Параметризация
Заключение
1.49M
Category: programmingprogramming

Основы работы с Pytest

1.

МДК 01.02. Поддержка и тестирование
программных модулей
Лекция 23-24-25. Тема:
«Основы работы с Pytest».
Преподаватель: Кусков Федор Витальевич

2.

Написать рабочий код — полдела: нужно добиться,
чтобы он выдавал корректные результаты.
Можно тестировать программу вручную: запускать её
вновь и вновь в разных условиях и проверять,
правильно ли всё работает. Но лучше, конечно,
автоматизировать процесс и написать код, который
будет проверять другой код. Чтобы упростить эту
задачу, и придумали Pytest.

3.

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

4.

https://lp.jetbrains.com/python-developers-survey-2022/
Популярность фреймворков для тестирования
(по статистике JetBrains)

5. Преимущества и недостатки Pytest

• Успешность Pytest в сравнении с конкурентами (например, Unittest) легко объясняется
его преимуществами:
• Лаконичный код. В синтаксисе Pytest нет громоздких конструкций, как в том же Unittest.
Простой тест может состоять всего из двух строк.
• Подробные отчёты об ошибках. Если тест работает неправильно, Pytest сам объяснит,
в чём дело.
• Универсальный оператор assert. Не нужно запоминать разные его виды, как в Unittest.
• Фикстуры. Позволяют создавать контекст сразу для группы тестов.
• Метки. Можно настраивать поведение тестов: задавать условия запуска, передавать
одному и тому же тесту разные входные данные и так далее.
• Умеет запускать тесты других фреймворков. С Pytest совместимы Unittest, Doctest
и Nose.
• Множество плагинов. Если какой-то функции «из коробки» не хватает, для Pytest
написано больше тысячи плагинов. Причём 180 из них обновлялись в 2023 году, ещё
360 — в 2022-м.

6. Преимущества и недостатки Pytest

• Тем не менее недостатки у фреймворка тоже есть:
• Неявность и магия. Обратная сторона простоты
и лаконичности есть: многие процессы происходят «под
капотом». Чтобы разобраться в них детально, придётся
штудировать документацию.
• Не входит в стандартную библиотеку. Pytest нужно
устанавливать отдельно. Если у вас старая (ниже 3.7) версия
Python, то нужно будет подключать соответствующую версию
фреймворка.
• Другие фреймворки несовместимы с Pytest. Неизбежное
следствие лидерского, практически королевского,
статуса: Pytest может запускать тесты других фреймворков,
но ни один из других фреймворков не может запускать тесты
Pytest

7. Установка Pytest

• При создании проекта дайте название PyTestIvanov301, где
Ivanov – фамилия, 301 – номер группы
• Pytest входит в большинство пакетов Python. Его последняя
версия доступна для Python 3.7+. Чтобы установить его в свою
виртуальную среду, используйте команду:
pip install -U pytest
• Другой способ — пакетный менеджер вашей IDE. Найдите в нём
модуль с названием pytest и загрузите его.
• Для Pycharm механизм следующий:
File > Settings > Project: имя_проекта > Python
Interpreter > Insert (+) > Pytest > Install Package

8. Как писать тесты

9. Как писать тесты

10. Как писать тесты

11. Как писать тесты

12. Как писать тесты

Обратите внимание!
В файл main.py пишется код с оператором Return
В файл tests.py пишется код с оператором Assert
Для работы с тестами необходимо создать
внутри проекта папку с названием tests.
Перенести файл tests.py
в папку tests

13. Как писать тесты

14. Как писать тесты

15. Как писать тесты

• Примечание – В одном тесте может быть сразу несколько операторов
assert, но делать так не рекомендуется. Лучше руководствоваться
правилом «Один тест — одна сущность, одна функция — один assert».

16. Запуск тестов

• Команда терминала pytest запускает все тесты текущего каталога.
Чтобы управлять условиями запуска, укажите после неё путь до
файла или даже отдельной функции.
• Команда для запуска файла tests.py: pytest tests.py.
• Команда для запуска функции test_sum2 и только её: pytest
tests.py: test_sum2.
• Для более гибкого запуска можно дополнительно добавлять флаги.
Их список есть в документации Pytest.
• Помимо команд терминала можно использовать графический
интерфейс вашей IDE.

17. Запуск тестов

Путь к папке
с тестами
Путь к папке
со всем
проектом
Изменение
конфигурации
в PyCharm

18. Запуск тестов

Путь к папке с
тестами
Путь к папке со
всем проектом
Изменение
конфигурации
(старый
интерфейс)

19. Фикстуры в Pytest

• Фикстуры — это функции,
которые создают окружение
вокруг тестов. Они удобны,
когда нужно передать одни
и те же входные данные
нескольким тестам.
• Допустим, у нас есть
несколько функций
в main.py:

20. Фикстуры в Pytest

• Напишем для каждой из них по тесту
в файле tests.py. В качестве
тестового массива возьмём список простых
чисел от 1 до 50. Создавать его будем
с помощью цикла for-else:

21. Фикстуры в Pytest

22.

23. Фикстуры в Pytest

• Теперь передадим эту фикстуру во все тесты, где она
нужна. Обращаясь к фикстуре, у неё не нужно писать
круглые скобки: как будто это не функция, а переменная.
• Сами тесты в итоге получаются такие:

24. Финализатор

• Если хотите, чтобы после
запуска теста выполнялся ещё
какой-то скрипт, это также
можно сделать через
фикстуры. Для этого вместо
ключевого слова return
используйте yield. Код,
написанный после yield, и
будет выполняться по
завершении теста.
• Изменим в нашем примере с
простыми числами фикстуру
get_prime_nums() и добавим в
неё финализатор:

25. Финализатор

• При запуске тестов
получаем такой
результат:
Если тест не был пройден (то есть assert получил False), код из
финализатора всё равно выполняется.

26. Области действия фикстур

У фикстур можно настраивать область
действия, в которой они существуют.
По умолчанию она равна функции. Это
значит, что, когда тестовая функция
прекращает свою работу, фикстура
финализируется и уничтожается. При
следующем вызове фикстура создаётся
заново. Это хорошо видно по прошлому
примеру с финализатором.
Область действия фикстуры указывается
в её декораторе аргументом scope='область действия'. Посмотрим, как изменится работа
Всего есть пять уровней:
тестов:
'function' — для функции;
'class' — для класса;
'module' — для модуля (то есть py-файла);
'package' — для пакета;
'session' — для всей сессии тестирования.

27. Области действия фикстур

В отличие от прошлого примера,
фикстура здесь вызывается только
один раз — в первой функции,
которая её использует. Затем
результат работы кэшируется.
Финализатор тоже срабатывает
только единожды, когда
заканчивается файл.
Посмотрим, как изменится работа
тестов:

28. Иерархии фикстур

• Одному тесту можно
передать сколько угодно
фикстур, указывая
их через запятую.
Их можно передавать
и другим фикстурам —
тоже в любом количестве.
• Например, фикстуру
get_prime_nums можно
разбить на несколько (хотя
в нашем случае в этом нет
практического смысла):

29. Метки тестов

• Pytest позволяет настраивать запуск тестов, применяя к ним
метки. Использовать их можно не только с тестовыми
функциями, но и с целыми классами. Чтобы добавить метку,
нужно написать декоратор: @pytest.mark.*название метки*.
• В Pytest можно сделать так, чтобы запускались только
помеченные тесты. Для этого используют команду терминала
с аргументом -m: pytest -m *название метки*. Можно
и наоборот: запустить все тесты, кроме помеченных. В таком
случае команда выглядит так: pytest -m 'not название метки'.
• У одного теста или класса может быть сколько угодно меток.
Посмотреть их список можно, вызвав команду pytest -markers и в документации. Разберем основные метки.

30. Метки тестов: пропуск теста

• Чтобы пропустить тест, поставьте метку skip. В качестве
аргумента ей можно передать необязательный
параметр reason='причина пропуска'. Например:
• Результат работы кода:
Укажите в качестве причины пропуска свою фамилию.

31. Пропуск теста при условии

• Метка skipif получает два аргумента. Первый — это условие.
Если оно выполняется (результат True) — тест пропускается,
если нет (результат False) — тест выполняется как обычно.
Во втором аргументе, как и в случае со skip, можно передать
строку с причиной пропуска:
• Результат тот же самый, что и в прошлом случае

32. Ожидаемый провал теста

• Тест под меткой xfail может выдать два результата. Если
тест будет пройден, Pytest пометит его XPASS, если
ожидаемо провален — XFAIL. Ни один из вариантов
не вызовет провала общего набора тестов:

33. Ожидаемый провал теста

Результат работы кода:

34. Ожидаемый провал теста

• У xfail есть несколько аргументов. Как в skipif, вы можете
указать условие (и ожидать провал только при нём)
и передать параметр reason. Дополнительно
к этому xfail позволяет:
• добавить исключение в raises=*название исключения*;
• вообще не выполнять тест в run=False (тогда
он автоматически будет засчитан как XFAIL);
• сделать, чтобы провал теста вызывал провал всего
тестового набора в strict=True.
• Подробнее о возможностях xfail — в документации.

35. Параметризация

• Метка parametrize позволяет вызывать один и тот же
тест с разными входными данными. Это полезно, когда
мы хотим проверить несколько случаев.
• Например, у нас есть функция, которая пишет,
положительное число или отрицательное:

36. Параметризация

Сначала проверим,
правильно ли она
обрабатывает
положительные
числа: целые,
дробные и очень
маленькие. Без
параметризации
нам пришлось бы
писать сразу три
однотипных теста:
Результат:

37. Параметризация

• А потом нужно будет
писать такие же три теста
для отрицательных чисел
и ещё один для нуля. Итого
семь тестов для одной
маленькой функции.
Нерационально. Тут-то
на помощь и приходит
параметризация.
• Метка parametrize получает
два аргумента: название
переменной и список
её значений. Название
переменной передаём
тесту (точно так же, как
фикстуру). Получается вот
так:
Результат:

38. Параметризация

• Можно в одной
строке через
запятую передать
сразу несколько
переменных. Тогда
каждый элемент
списка задаётся
кортежем, в котором
мы по очереди
перечисляем
значения этих
переменных:

39. Параметризация

Результат:

40. Параметризация

Если одному тесту передать
сразу несколько меток
parametrize, он запустит все
их возможные комбинации.
Пример для наглядности:
Результат:

41. Заключение

• Pytest — самый популярный среди Python-разработчиков
фреймворк для тестирования. Он позволяет писать меньше
однотипного кода, чем встроенный Unittest, и может работать без
тестовых классов. Вот его базовые инструменты:
• Ключевое слово assert отвечает за результат тестирования.
Если заданное после него условие правдиво — тест пройден,
если оно ложно — провален.
• Фикстуры — дополнительные функции, в которых можно
задавать окружение тестов. Они могут использовать другие
фикстуры, создавая целые иерархии.
• Метки — декораторы, которые позволяют корректировать
поведение тестов: пропускать их, ожидать определённых
результатов, передавать разные входные данные и так далее.
Источник: https://skillbox.ru/media/code/rukovodstvo-po-pytest-kak-testirovat-kod-v-python/
English     Русский Rules