Similar presentations:
Основы работы с 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/
programming