Один из самых популярных фреймворков для тестирования на Python, которым пользуются при автоматическом тестировании. Это open-source решение — ПО с открытым исходным кодом. Оно развивается за счет комьюнити и поддерживает практически все необходимые тестировщику функции: модульное и функциональное тестирование, а также тестирование API.
Преимущества
✅ Достаточно простой синтаксис, понятный для тех, кто уже знаком с языком Python.
✅ Лаконичность кода. Тестовые функции не занимают много строк, легко читаются и просты для понимания.
✅ Широкий функционал. Фреймворк поддерживает параметризацию и различные инструменты для проверки кода по множеству критериев и параметров.
✅ Совместимость с другими фреймворками: Selenium, Appium, PyMySQL и другими.
Недостатки
❌ Необходимость настройки. PyTest не встроен в стандартную библиотеку Python, его придётся скачивать отдельно и настраивать под нужные задачи или проект.
❌ Недостаточная документация. Поскольку PyTest постоянно обновляется, некоторые части фреймворка могут оставаться слабо задокументированными.
❌ Ограниченность применения. PyTest может быть не подходящим решением для некоторых типов приложений, которые требуют специализированных инструментов. Например, он плохо подходит для тестирования совместимости браузера.
❌ Несовместимость с версиями Python ниже 3.7 и PyPy3.
Рассмотрим код на Python, который будет проверять функцию на корректность выдаваемого результата.
def my_function(x,y):
def test_my_function():
PyTest — практически универсальный фреймворк, который подходит для тестирования большинства приложений и сайтов. Однако есть случаи, когда применять его не стоит:
1. Используются альтернативные решения: уже существует код для тестирования, написанный с помощью других фреймворков — тогда его придётся адаптировать, переписывать или даже создавать с нуля.
2. Команде не хватает компетенций: на проекте отсутствует специалист для конфигурирования, настройки и последующей поддержки, а у тестировщиков недостаточно для этого опыта.
3. Нужно тестировать что-то, для чего PyTest не предназначен.
PyTest позволяет писать даже сложные тесты с минимальными усилиями и поддерживает разные методологии тестирования. Поэтому он отлично подходит для большинства задач и пользуется большой популярностью в автоматическом тестировании.
На курсе «Тестирование веб-приложений на Python» студенты учатся работать именно с фреймворком PyTest, потому что он больше всего подходит для новичков.
Преимущества
✅ Не требует отдельной установки и сразу готов к использованию.
✅ Легко интегрируется в разные среды разработки, в том числе в PyCharm и Visual Studio.
✅ Обладает расширяемой архитектурой, что позволяет запускать тесты на разных устройствах и операционных системах.
✅ Поддерживает разные методы и утилиты: тестовые примеры, проверку ожидаемых результатов, встроенные декораторы для настройки среды, функции для автоматического запуска тестов и многое другое.
Недостатки
❌ Код для теста и код для приложения нужно размещать в одном файле. Это не очень удобно для чтения, изменения и поддержки кода.
❌ Громоздкие конструкции — тесты с использованием этого фреймворка требуют дополнительных обвязок для запуска, параметризации, проверок выполнения и генерации ошибки.
❌ Сложность конфигурации, особенно если нужно запускать тесты на нескольких серверах и платформах. Тесты с помощью других фреймворков настраивать гораздо проще.
❌ Нет поддержки динамических тестов ― не получится тестировать программу во время выполнения и менять их в соответствии с изменяющимися условиями.
import unittest
# Определяем функцию add, которую будем тестировать
def add(x, y):
return x + y
# Создаём дочерний класс TestAddition, который наследует от unittest.TestCase
class TestAddition(unittest.TestCase):
# Методы тестирования определяются с префиксом "test_"
# В данном тесте мы проверяем, что функция add корректно складывает два числа
def test_addition(self):
self.assertEqual(add(2, 3), 5)
if _name_ == '_main_':
unittest.main()
Можно увидеть, что код проверки с фреймворком Unittest гораздо длиннее, чем с PyTest.
Но если нужен более простой, понятный и лаконичный инструмент, лучше выбрать другой фреймворк. Особенно для новичков, которые пока не знакомы с языком Python и изучают его только, чтобы писать автоматические тесты.
Этот фреймворк тоже достаточно популярен для тестирования с помощью Python и при этом сильно отличается от остальных. Для написания тестов используется специальный формат — Gherkin. Этот формат позволяет создавать тесты на английском языке, которые затем преобразуются в автоматические тесты уже на языке Python. Такой подход называется Behaviour Driven Development.
Чтобы обеспечить автоматическое преобразование, в фреймворке Behave есть следующие компоненты:
1. Feature-файлы — описывают тесты на английском языке по специальным правилам. Их может писать специалист или инженер, знакомый с форматом Gherkin.
2. Step Definitions — функции на Python, в которых описано, как выполнять шаги из Feature-файлов. Их могут реализовывать или разрабатывать тестировщики, знакомые с Python.
Преимущества
✅ Поддержка DRY (Don't Repeat Yourself). Этот подход позволяет свободно использовать тестовый код повторно, что уменьшает его дублирование и облегчает обновление тестов.
✅ Простой и понятный синтаксис Feature-файлов. Писать на языке Gherkin проще, чем на языке программирования. С этим могут справиться те, кто не знаком с Python. И читать тесты смогут в том числе не только разработчики и тестировщики, но и, например, аналитики.
✅ Простая настройка. Можно изменить формат вывода результатов, добавлять в сценарии новые шаги, расширять функциональность тестов.
✅ Интеграция с Selenium и другими инструментами для автоматизации тестирования на Python позволяет тестировать приложения в реальном времени в браузере.
✅ Поддержка параллельного выполнения тестов. Одновременно на нескольких устройствах и платформах, что позволяет ускорить процесс.
✅ Максимальная автоматизация. Тесты легко внедрить в процесс CI/CD, чтобы обеспечить непрерывное тестирование при каждом обновлении приложения.
Недостатки
❌ Сложность написания Step Definitions. Если с Feature-файлами всё просто, то функции на Python к ним писать достаточно сложно. А это является обязательным фактором для запуска и выполнения тестирования.
❌ Проблемы в больших проектах. Когда кода очень много, могут возникать трудности с изменениями и отладкой описаний и функций.
❌ Минимальная базовая функциональность. Например, отсутствие встроенной поддержки API-тестирования или выполнения HTTP-запросов из сценариев.
❌ Скудная документация. Из-за этого не всегда понятно, как правильно написать тест.
❌ Нужно изучить BDD-методологию. Только так станет понятна концепция всех компонентов фреймворка.
❌ Ограничения и следование методологии. Сценарии придётся писать в соответствии с требованиями BDD-методологии и языка Gherkin, что накладывает определённые ограничения.
Feature: Login
In order to access my account
As a registered user
I want to be able to login
Scenario: Successful login with correct credentials
Given I am on the login page
When I enter my username and password
And click the login button
Then I should be redirected to the homepage
Step Definitions для этого Feature-файла:
from behave import given, when, then
@given('I am on the login page')
def step_impl(context):
context.browser.get('http://localhost:8000/login/')
@when('I enter my username and password')
def step_impl(context):
context.browser.find_element_by_id('id_username').send_keys ('myusername')
context.browser.find_element_by_id('id_password').send_keys
('mypassword')
@when('click the login button')
def step_impl(context):
context.browser.find_element_by_id('login_button').click()
@then('I should be redirected to the homepage')
def step_impl(context):
assert context.browser.current_url == 'http://localhost:8000/home/'
Если в компании уже используют подход BDD и язык Gherkin, разумно будет дополнить стек именно фреймворком Behave.
Но если проект на стадии развития или это MVP (minimum valuable product — минимально жизнеспособный продукт), Behave только усложнит ситуацию и не раскроется в полной мере. Кроме того, он не подойдёт для проектов, которым требуются сложные тесты, — для них он недостаточно гибкий.
Николай Федосеев
Тестирование — это способ определить, насколько правильно и корректно работает приложение. Если говорить о разработке ПО, то это ещё и метод описания функциональности — как именно должна работать программа, какие есть граничные кейсы, какие условия и данные приведут к неверному поведению. Можно посмотреть только тесты — и понять, как работает программа.
Чем больше покрытие проекта тестами и чем более актуальны и разнообразны тестовые кейсы, тем быстрее решаются бизнес-задачи без опасений за невалидное или нерабочее приложение.
Статью подготовили:
Яндекс Практикум
Иллюстратор
Читать также: