Мы уже говорили об автоматизации тестирования, теперь пришло время познакомиться с шестью лучшими инструментами автоматизации тестирования на Python.
Есть хорошая новость – в стандартной библиотеке Python уже есть отличные инструменты для модульного тестирования. Вы можете очень долго строить надежную автоматизацию тестирования с помощью встроенных возможностей языка. Но добавить автоматизацию в стандартную базу кода Python очень просто, поскольку этот язык используется для различных задач, в том числе для создания самих инструментов автоматизации тестирования.
Вы можете настроить нужную степень и уровень автоматизации тестирования на Python, и создавать тесты в соответствии с растущей базой кода.
Итак, начнем.
PyUnit и Nose2
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
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 или более поздние версии.
Behave
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
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 года. Вы все еще можете скачать его и использовать в коде, но больше он не поддерживается.
Jasmine для автоматизации тестирования на Python
BDD – не просто популярная парадигма разработки на Python, также она широко распространена в веб-разработке. Jasmine – популярный фреймворк для тестирования веб-приложений в стиле BDD. Скорее всего вы думаете о Jasmine, как об инструменте тестирования приложений на JavaScript, но вы вполне можете использовать его для автоматизации тестирования на Python.
Благодаря Jasmine-Py вы можете добавить Jasmine в свои проекты на Django. Так вы сможете запускать Jasmine из вашей среды Python и с вашего сервера CI/CD.
Тестирование веб-приложений на основе поведения, а не DOM, делает ваши тесты более устойчивыми к изменениям. Это становится огромным преимуществом в тот момент, когда вы тестируете как код на Django создает страницы. Вместо Gherkin вы будете писать тесты в грамматике Jasmine.
Результаты можно применить как к своему веб-сайту, так и к коду на Django.
Фреймворк Robot
Фреймворк Robot – это открытый фреймфорк автоматизации тестирования. Организации используют его для автоматизации приемочного тестирования. Вы пишете тесты в DSL фреймворка Robot, синтаксисе, который используется для создания приемочных тестов.
Вместо того, чтобы ориентироваться на поведение, как в Jasmine, Robot ориентируется на ключевые слова.
Ключевое слово – это любая функция или метод, которые вы можете вызвать в тесте. Ключевые слова определяются либо в Robot, либо в основной системе, либо в пользовательских библиотеках для тестирования. Также вы можете определять новые ключевые слова в терминах уже существующих ключевых слов.
Можно расширить возможности Robot с помощью библиотек для тестирования, написанных на Python или Java. Таким образом, в дополнение к использованию этого фреймворка для тестирования кода на Python, вы можете расширить Robot с помощью Python. Также у вас есть доступ к обширной библиотеке плагинов для Robot.
DSL фреймворка позволяет легко создавать сценарии для автоматизации тестирования. С помощью правильного набора плагинов вы можете автоматизировать почти любой аспект приемочного тестирования. Еще вы можете создавать новые ключевые слова более высокого уровня, используя уже существующие.
Вам определенно нужна автоматизация тестирования на Python
В последние десять лет популярность Python неуклонно росла. Ее рост вы можете увидеть в индексе TIOBE. Велика вероятность, что вы уже пишете на Python или планируете добавить его в свой инструментарий в ближайшее время.
Расширение области применения Python привело к распространению фреймворков, инструментов тестирования и других утилит. Вне зависимости от того, создаете ли вы REST-сервис на бэкенде или любое другое приложение, для вас найдется подходящий фреймворк для автоматизированного тестирования.
Какой из них будет лучше отвечать вашим потребностям? У Testim есть руководство, которое поможет вам принять взвешенное решение. Обратитесь к нему и начните тестировать на Python уже сегодня.
Перевод подготовлен в рамках курса "Python QA Engineer". Приглашаем всех желающих на день открытых дверей онлайн: на этой встрече узнаете больше о программе курса и формате обучения, познакомитесь с преподавателем. Регистрация здесь.
azzas
Товарисчи, а кто то реально использует behave-drive тестирование на реальных проектах?
Я ни разу не видел ни одной удобной реализации поддержки подобных тестов.
Смысл то в том, чтобы сценарии писались на условно человеческом языке и их было удобно писать и поддерживать, но для того, чтобы такие сценарии работали, каждую сущность или действие надо описать настолько точно, что выигрыш от применения такого подхода нивелируется. И все равно никто кроме самих разрабов эти тесты не пишет, и тогда непонятно зачем было так извращаться с behave-driven фрэймворком.
Ommonick
behave синтаксис - это попытка дать менеджерам внятные сценарии as a code.
Не работает нифига, только лишний слой сахара создается, который надо потом поддерживать и ковырять.
Неужели такой вариант хуже?
user := RegisterUser()
order := prepareOrder()
assert(!order.isPaid)
client.PayOrder(user, order)
assert(order.IsPaid)
azzas
Спасибо тебе, добрый человек.
А то у меня складывалось ощущение что я единственный долбодятел, кто не понимает этой божественной абстракции.
Сколько не видел подобные сценарии так везде это в стиле «смотрите как мы можем», а не как это удобно и что у нас девочки менеджеры сценарии пишут.
Я так понимаю это очередной сферический конь в вакууме.