Программирование  •  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 позволяет писать даже сложные тесты с минимальными усилиями и поддерживает разные методологии тестирования. Поэтому он отлично подходит для большинства задач и пользуется большой популярностью в автоматическом тестировании.

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

Научитесь тестировать веб‑приложения на Python
Получите новые навыки за два месяца: начните работать с библиотекой PyTest, писать автотесты для веб-приложений и внедрять в свои проекты автоматизацию.

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: Бесплатный гид Практикума по профессиям
Wed Aug 16 2023 12:48:23 GMT+0300 (Moscow Standard Time)