Автоматизация тестирования на Python. Шесть способов тестировать эффективно
- пятница, 4 июня 2021 г. в 00:38:14
Мы уже говорили об автоматизации тестирования, теперь пришло время познакомиться с шестью лучшими инструментами автоматизации тестирования на Python.
Есть хорошая новость – в стандартной библиотеке Python уже есть отличные инструменты для модульного тестирования. Вы можете очень долго строить надежную автоматизацию тестирования с помощью встроенных возможностей языка. Но добавить автоматизацию в стандартную базу кода Python очень просто, поскольку этот язык используется для различных задач, в том числе для создания самих инструментов автоматизации тестирования.
Вы можете настроить нужную степень и уровень автоматизации тестирования на Python, и создавать тесты в соответствии с растущей базой кода.
Итак, начнем.
PyUnit – это фреймворк юнит-тестирования на Python. Его добавили в стандартную библиотеку Python еще в версии 2.1, он совместим со всеми последующими версиями языка. PyUnit – это реализация JUnit на Python, стандартного фреймворка юнит-тестирования Java. Именно поэтому разработчики, которые переходят с Java на Python найдут его очень простым в использовании. Оба фреймворка обязаны своим существованием фреймворку для тестирования на Smalltalk от Кента Бека.
PyUnit содержит все необходимые инструменты для создания автоматизированных тестов.
Фикстуры, с помощью которых вы можете создавать и удалять объекты, необходимые для теста.
Методы для выполнения тестов.
Наборы для группировки классов тестов в логические юниты.
Раннеры для выполнения тестов.
Вот пример базового юнит-теста:
import unittest
class SimpleWidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget("The widget")
class DefaultWidgetSizeTestCase(SimpleWidgetTestCase):
def runTest(self):
assert self.widget.size() == (50,50), 'incorrect default size'
SimpleWidgetTestCase
использует фикстуру setUp
, чтобы создать Widget
для тестирования. DefaultWidgetSizeTestCase
– это класс-наследник SimpleWidgetTestCase
, который проверяет размер Widget
.
PyUnit – отличная вещь для начала настройки автоматизации тестирования на Python, но это лишь базовый набор инструментов. Вам еще понадобятся инструменты для автоматизации выполнения тестов и сбора результатов. Здесь в игру вступает Nose.
Nose2 – это следующий шаг после PyUnit. Он добавляет поддержку автоматического обнаружения тестов и плагины для выполнения тестов и создания документации. Система плагинов Nose2 добавляет дополнительный функционал в виде декораторов, параметризированных тестов и поиска тестов. Например, AllModules находит все тесты и собирает из них выходные данные.
Nose2 также содержит Such – DSL для написания функциональных тестов.
Если вы поместите код в файл с именем test_widgets.py
, тест-раннер Nose2 найдет тест и запустит его. Все, что вам нужно сделать – это добавить в ваши файлы префикс tests_
.
PyTest (https://pytest.org/en/latest/) – нативная библиотека тестирования на Python, она содержит расширенный набор функций PyUnit. По сравнению с моделированием архитектуры JUnit, она определенно написана в стиле Python. Она активно использует декораторы и ассерты Python.
PyTest также поддерживает параметризированное тестирование (без плагинов по типу Nose), что упрощает переиспользование кода и его покрытие тестами.
Если вы перепишете под Pytest тот тест, который мы написали выше, он будет выглядеть более декларативным.
@pytest.fixture
def widget():
return Widget("The widget")
def test_widget_size(widget):
assert widget.size() == (50,50), 'incorrect default size'
PyTest использует тестовые фикстуры для передачи Widget методу тестирования.
В дополнение к фикстурам, тестовым наборам и тест-раннерам, в PyTest есть собственная поддержка поиска тестов. Вы можете выбрать наборы тестов для запуска, основываясь на именах методов, пактов или декораторов, которые вы добавляете в код тестов. Еще PyTest умеет выполнять тесты параллельно. При использовании этих функций одновременно, вы облегчите себе управление большими базами кода по сравнению с PyUnit.
PyTest упрощает создание отчетов в виде обычного текста, XML или HTML. Также вы можете добавить информацию о покрытии кода в отчеты PyTest.
Несмотря на то, что PyTest можно использовать самостоятельно, вы можете интегрировать его с другими фреймворками тестирования и тест-раннерами, такими как PyUnit и Nose2. Благодаря такой совместимости PyTest станет отличным выбором для растущих проектов, которым нужно хорошее покрытие тестами. Для PyTest нужен Python 3.6 или более поздние версии.
PyUnit и PyTest – мощные традиционные фреймворки для юнит-тестирования, но что, если вам нужны behavior-driven тесты?
Behave – это behavior-driven (BDD) фреймворк для тестирования. Он критически отличается от PyUnit и PyTest. В нем вы пишете тесты на Gherkin вместо Python. Несмотря на то, что здесь не оригинальный Gherkin от Cucumber, в Behave есть полная поддержка Gherkin, поэтому он является одним из самых популярных BDD-фреймворков для Python.
Behave настолько распространен, что даже у Jetbrains есть для него плагин в PyCharm Professional Edition. Также существует множество онлайн-руководств и документации для работы с Behave.
Вы описываете тесты грамматикой естественного языка, и описываете функцию с точки зрения поведения и ожидаемых результатов тестирования. Затем вы пишете свои тесты с аннотациями, которые соответствуют поведению и условиям. Behave запускает тесты, собирает результаты и документирует их в виде файлов поведения.
Если вы интересуетесь или даже уже используете behavior-driven разработку (BDD), Behave – один из лучший вариантов для этого. Он поставляется с интеграциями как для Django, так и для Flask, так что вы можете использовать его в full-stack проектах.
Тест из предыдущих примеров можно реализовать на Behave, как представлено ниже.
Вот грамматика естественного языка:
Feature: widget size
Scenario: verify a widget's size
Given we have a widget
When the widget is valid
Then the size is correct
А вот код на Python. У Given, When и Then есть соответствующие аннотации.
from behave import *
@given('we have a widget')
def step_given_a_widget(context):
context.widget = Widget('The widget')
@when('the widget is valid')
def step_widget_is_valid(context)
assert context.widget is not None
@then('the size is correct')
def step_impl(context):
assert context.widget.size() == (50,50)
Lettuce – это behavior-driven инструмент автоматизации для Selenium и Python. Подобно Behave, он использует синтаксис Gherkin для описания тестовых сценариев, но у него не такая совместимость, как у Behave. Lettuce не так распространен, как Behave, однако он хорошо работает с небольшими проектами.
Его также легко интегрировать с другими фреймворками, такими как Selenium и Nose.
Тесты на Lettuce чем-то напоминают тесты на Behave. Вот как это выглядит на естественном языке:
Feature: widget size
Scenario: verify a widget's size
Given we have a widget
When the widget is valid
Then the size is correct
А вот код. Вместо отдельной аннотации для каждого шага теста, Lettuce аннотирует сам step.
from lettuce import step
from lettuce import world
@step('we have a widget')
def step_given_a_widget(step):
world.widget = Widget('The widget')
@step('the widget is valid')
def step_widget_is_valid(step)
assert world.widget is not None
@step('the size is corrrect')
def step_impl(context):
assert world.widget.size() == (50,50)
Когда вы интегрируете Lettuce с Selenium, у вас получается надежный фреймворк для тестирования приложений на Django. Так что, если вам не нравится синтаксис Jasmine с JavaScript, этот вариант может оказаться наилучшим.
Однако Lettuce не обновлялся с 2016 года. Вы все еще можете скачать его и использовать в коде, но больше он не поддерживается.
BDD – не просто популярная парадигма разработки на Python, также она широко распространена в веб-разработке. Jasmine – популярный фреймворк для тестирования веб-приложений в стиле BDD. Скорее всего вы думаете о Jasmine, как об инструменте тестирования приложений на JavaScript, но вы вполне можете использовать его для автоматизации тестирования на Python.
Благодаря Jasmine-Py вы можете добавить Jasmine в свои проекты на Django. Так вы сможете запускать Jasmine из вашей среды Python и с вашего сервера CI/CD.
Тестирование веб-приложений на основе поведения, а не DOM, делает ваши тесты более устойчивыми к изменениям. Это становится огромным преимуществом в тот момент, когда вы тестируете как код на Django создает страницы. Вместо Gherkin вы будете писать тесты в грамматике Jasmine.
Результаты можно применить как к своему веб-сайту, так и к коду на Django.
Фреймворк Robot – это открытый фреймфорк автоматизации тестирования. Организации используют его для автоматизации приемочного тестирования. Вы пишете тесты в DSL фреймворка Robot, синтаксисе, который используется для создания приемочных тестов.
Вместо того, чтобы ориентироваться на поведение, как в Jasmine, Robot ориентируется на ключевые слова.
Ключевое слово – это любая функция или метод, которые вы можете вызвать в тесте. Ключевые слова определяются либо в Robot, либо в основной системе, либо в пользовательских библиотеках для тестирования. Также вы можете определять новые ключевые слова в терминах уже существующих ключевых слов.
Можно расширить возможности Robot с помощью библиотек для тестирования, написанных на Python или Java. Таким образом, в дополнение к использованию этого фреймворка для тестирования кода на Python, вы можете расширить Robot с помощью Python. Также у вас есть доступ к обширной библиотеке плагинов для Robot.
DSL фреймворка позволяет легко создавать сценарии для автоматизации тестирования. С помощью правильного набора плагинов вы можете автоматизировать почти любой аспект приемочного тестирования. Еще вы можете создавать новые ключевые слова более высокого уровня, используя уже существующие.
В последние десять лет популярность Python неуклонно росла. Ее рост вы можете увидеть в индексе TIOBE. Велика вероятность, что вы уже пишете на Python или планируете добавить его в свой инструментарий в ближайшее время.
Расширение области применения Python привело к распространению фреймворков, инструментов тестирования и других утилит. Вне зависимости от того, создаете ли вы REST-сервис на бэкенде или любое другое приложение, для вас найдется подходящий фреймворк для автоматизированного тестирования.
Какой из них будет лучше отвечать вашим потребностям? У Testim есть руководство, которое поможет вам принять взвешенное решение. Обратитесь к нему и начните тестировать на Python уже сегодня.
Перевод подготовлен в рамках курса "Python QA Engineer". Приглашаем всех желающих на день открытых дверей онлайн: на этой встрече узнаете больше о программе курса и формате обучения, познакомитесь с преподавателем. Регистрация здесь.