Программирование  •  23 марта  2023  •  5 мин чтения

Автоматизируем тестирование приложений: три популярных фреймворка Python для тестировщиков

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

PyTest

Один из самых популярных фреймворков для тестирования на Python, которым пользуются при автоматическом тестировании. Это open-source решение — ПО с открытым исходным кодом. Оно развивается за счет комьюнити и поддерживает практически все необходимые тестировщику функции: модульное и функциональное тестирование, а также тестирование API.

Преимущества

✅ Достаточно простой синтаксис, понятный для тех, кто уже знаком с языком Python.

✅ Лаконичность кода. Тестовые функции не занимают много строк, легко читаются и просты для понимания.

✅ Широкий функционал. Фреймворк поддерживает параметризацию и различные инструменты для проверки кода по множеству критериев и параметров.

✅ Совместимость с другими фреймворками: Selenium, Appium, PyMySQL и другими.

Недостатки

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

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

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

❌ Несовместимость с версиями Python ниже 3.7 и PyPy3.

Пример теста с применением PyTest

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

def my_function(x,y):

return x + y


def test_my_function():

assert my_function(2,3) == 5
Здесь создаётся функция, которая суммирует два числа, — это возможности самого языка Python. А затем используется вызов assert, который позволяет убедиться, что функция выдаёт правильный результат. Для этого в неё передаются два параметра и сразу прописывается ожидаемый результат. Затем функция проверяет, соответствует ли фактический результат ожидаемому.
Так будет выглядеть отчёт о выполнении теста с помощью PyTest. Здесь он показывает ошибку, так как функция вместо ожидаемых 5 выдаёт 4
Когда стоит использовать PyTest

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

1. Используются альтернативные решения: уже существует код для тестирования, написанный с помощью других фреймворков — тогда его придётся адаптировать, переписывать или даже создавать с нуля.
2. Команде не хватает компетенций: на проекте отсутствует специалист для конфигурирования, настройки и последующей поддержки, а у тестировщиков недостаточно для этого опыта.
3. Нужно тестировать что-то, для чего PyTest не предназначен.

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

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

Начните бесплатно изучать тестирование
Научитесь находить первые баги, познакомитесь с ручным тестированием и узнаете, как работает автоматизация на Python.

✓ тестирование и автоматизация;
✓ полезные знакомства в сфере;
✓ проекты в портфолио;
✓ ИИ для тестирования.

Unittest

Этот фреймворк — модуль, который входит в число стандартных библиотек Python. То есть он уже предустановлен и идёт вместе с интерпретатором, поэтому его можно использовать сразу.

Преимущества

✅ Не требует отдельной установки и сразу готов к использованию.

✅ Легко интегрируется в разные среды разработки, в том числе в PyCharm и Visual Studio.

✅ Обладает расширяемой архитектурой, что позволяет запускать тесты на разных устройствах и операционных системах.

✅ Поддерживает разные методы и утилиты: тестовые примеры, проверку ожидаемых результатов, встроенные декораторы для настройки среды, функции для автоматического запуска тестов и многое другое.

Недостатки

❌ Код для теста и код для приложения нужно размещать в одном файле. Это не очень удобно для чтения, изменения и поддержки кода.

❌ Громоздкие конструкции — тесты с использованием этого фреймворка требуют дополнительных обвязок для запуска, параметризации, проверок выполнения и генерации ошибки.

❌ Сложность конфигурации, особенно если нужно запускать тесты на нескольких серверах и платформах. Тесты с помощью других фреймворков настраивать гораздо проще.

❌ Нет поддержки динамических тестов ― не получится тестировать программу во время выполнения и менять их в соответствии с изменяющимися условиями.

Пример кода с применением Unittest
Протестируем функцию сложения.

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.

Когда стоит использовать Unittest
Unittest — достаточно надёжный инструмент для тестирования приложений на Python. Он подходит для многих задач, например, для базового модульного тестирования. Особенно удобно, что не нужно ничего устанавливать и настраивать — всё нужное для работы в Python в нём уже есть.

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

Behave

Этот фреймворк тоже достаточно популярен для тестирования с помощью 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, что накладывает определённые ограничения.

Примеры файлов фреймворка Behave
Пример Feature файла:

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/'

Когда стоит использовать Behave

Этот фреймворк для тестирования на Python очень полезен, так как позволяет быстро описывать и реализовывать тесты, понятные заказчикам и бизнес-аналитикам. Кроме того, он обеспечивает максимальное покрытие: можно писать тесты сразу на уровне системы, интерфейса и функциональности.

Если в компании уже используют подход BDD и язык Gherkin, разумно будет дополнить стек именно фреймворком Behave.

Но если проект на стадии развития или это MVP (minimum valuable product — минимально жизнеспособный продукт), Behave только усложнит ситуацию и не раскроется в полной мере. Кроме того, он не подойдёт для проектов, которым требуются сложные тесты, — для них он недостаточно гибкий.

Совет эксперта

Николай Федосеев

Тестирование — это способ определить, насколько правильно и корректно работает приложение. Если говорить о разработке ПО, то это ещё и метод описания функциональности — как именно должна работать программа, какие есть граничные кейсы, какие условия и данные приведут к неверному поведению. Можно посмотреть только тесты — и понять, как работает программа.

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

Статью подготовили:

Новый гайд про нейросети от Практикума —
ИИскусство промптинга для начинающих

Поделиться
Бесплатная профориентация со специалистом Практикума. Узнайте, какое направление в IT и диджитал-сфере вам подходит. Записаться
Как ИИ поменяет вашу профессию - бесплатный тест от Практикума с персональными рекомендациями в результатах. Пройти