тест кода на python
Автоматизация тестирования на Python. Шесть способов тестировать эффективно
Мы уже говорили об автоматизации тестирования, теперь пришло время познакомиться с шестью лучшими инструментами автоматизации тестирования на Python.
Есть хорошая новость – в стандартной библиотеке Python уже есть отличные инструменты для модульного тестирования. Вы можете очень долго строить надежную автоматизацию тестирования с помощью встроенных возможностей языка. Но добавить автоматизацию в стандартную базу кода Python очень просто, поскольку этот язык используется для различных задач, в том числе для создания самих инструментов автоматизации тестирования.
Вы можете настроить нужную степень и уровень автоматизации тестирования на Python, и создавать тесты в соответствии с растущей базой кода.
PyUnit и Nose2
PyUnit – это фреймворк юнит-тестирования на Python. Его добавили в стандартную библиотеку Python еще в версии 2.1, он совместим со всеми последующими версиями языка. PyUnit – это реализация JUnit на Python, стандартного фреймворка юнит-тестирования Java. Именно поэтому разработчики, которые переходят с Java на Python найдут его очень простым в использовании. Оба фреймворка обязаны своим существованием фреймворку для тестирования на Smalltalk от Кента Бека.
PyUnit содержит все необходимые инструменты для создания автоматизированных тестов.
Фикстуры, с помощью которых вы можете создавать и удалять объекты, необходимые для теста.
Методы для выполнения тестов.
Наборы для группировки классов тестов в логические юниты.
Раннеры для выполнения тестов.
Вот пример базового юнит-теста:
PyUnit – отличная вещь для начала настройки автоматизации тестирования на Python, но это лишь базовый набор инструментов. Вам еще понадобятся инструменты для автоматизации выполнения тестов и сбора результатов. Здесь в игру вступает Nose.
Nose2 – это следующий шаг после PyUnit. Он добавляет поддержку автоматического обнаружения тестов и плагины для выполнения тестов и создания документации. Система плагинов Nose2 добавляет дополнительный функционал в виде декораторов, параметризированных тестов и поиска тестов. Например, AllModules находит все тесты и собирает из них выходные данные.
Nose2 также содержит Such – DSL для написания функциональных тестов.
PyTest
PyTest (https://pytest.org/en/latest/) – нативная библиотека тестирования на Python, она содержит расширенный набор функций PyUnit. По сравнению с моделированием архитектуры JUnit, она определенно написана в стиле Python. Она активно использует декораторы и ассерты Python.
PyTest также поддерживает параметризированное тестирование (без плагинов по типу Nose), что упрощает переиспользование кода и его покрытие тестами.
Если вы перепишете под Pytest тот тест, который мы написали выше, он будет выглядеть более декларативным.
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, как представлено ниже.
Вот грамматика естественного языка:
А вот код на Python. У Given, When и Then есть соответствующие аннотации.
Lettuce
Lettuce – это behavior-driven инструмент автоматизации для Selenium и Python. Подобно Behave, он использует синтаксис Gherkin для описания тестовых сценариев, но у него не такая совместимость, как у Behave. Lettuce не так распространен, как Behave, однако он хорошо работает с небольшими проектами.
Его также легко интегрировать с другими фреймворками, такими как Selenium и Nose.
Тесты на Lettuce чем-то напоминают тесты на Behave. Вот как это выглядит на естественном языке:
А вот код. Вместо отдельной аннотации для каждого шага теста, Lettuce аннотирует сам step.
Когда вы интегрируете 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». Приглашаем всех желающих на день открытых дверей онлайн: на этой встрече узнаете больше о программе курса и формате обучения, познакомитесь с преподавателем. Регистрация здесь.
Юнит-тесты на Python: Быстрый старт
Перевод статьи подготовлен специально для студентов курса «Python QA Engineer».
Юнит-тестирование кода является неотъемлемой частью жизненного цикла разработки программного обеспечения. Юнит-тесты также формируют основу для проведения регрессионного тестирования, то есть они гарантируют, что система будет вести себя согласно сценарию, когда добавятся новые функциональные возможности или изменятся существующие.
В этой статье я продемонстрирую основную идею юнит-тестирования на одном классе. На практике вам придется писать множество тестовых случаев, добавлять их в тестовый набор и запускать все вместе. Управление тест-кейсами мы рассмотрим в следующей статье.
Сегодня мы сосредоточимся на тестировании бэкенда. То есть разработчик реализовал некоторый проект согласно спецификациям (например, Calculator.py), а ваша задача состоит в том, чтобы убедиться, что разработанный код действительно им соответствует (например, с помощью TestCalculator.py ).
Предположим, что вы написали класс Calculator для выполнения основных вычислительных функций: сложения, вычитания, умножения и деления.
Код для этого здесь ( Calculator.py ):
Теперь я хочу запустить юнит-тест, чтобы понять, что функциональность в приведенном выше классе работает, как запланировано.
Юнит-тест имеет следующую структуру:
setUp() и tearDown() – это стандартные методы, которые поставляются с фреймворком unittest (они определены в классе unittest.TestCase). В зависимости от вашего тестового случая вы можете переопределять или не переопределять два этих метода по умолчанию.
Всякий раз, когда выполняется этот тест-кейс, сначала выполняется метод setUp(). В нашем случае мы просто создаем объект класса Calculator и сохраняем его как атрибут класса. В родительском классе есть несколько других методов по умолчанию, которые мы рассмотрим позже.
Вы увидите вывод, сходный со следующим:
Что делать, если что-то не работает, как ожидалось? Давайте изменим ожидаемое значение test_divide с 5 на 6 (5 – правильное значение, сейчас мы посмотрим, что случится при сбое. Это не ошибка в исходном коде, а ошибка в тестовом наборе, у вас тоже могут быть ошибки в тестовых наборах, поэтому всегда проверяйте тестовые сценарии на наличие ошибок!)
При запуске этого тест-кейса, вы получите следующий результат:
Здесь написано, что 3 из 4 тестов прошли успешно, а один не удался. В реальном сценарии, предполагается, что ваш тестовый случай является верным, то есть таким образом он помогает определять неправильно реализованную функцию.
8 лучших фреймворков для тестирования с помощью Python в 2021 году
Если вы когда-нибудь думали: «С какого же языка программирования мне следует начать свое путешествие в тестирование?» Ваш ответ – Python. Но он подойдет не только начинающим! В недавнем опросе, который я провела в LinkedIn, мы видим, что среди опытных программистов 35% проголосовали за то, что Python является их самым любимым языком программирования (немного опередив всеми любимую Java, которая заняла 2-е место с 32%).
На протяжении многих лет Python действительно набирает обороты как среди тестировщиков, так и среди разработчиков, да и в целом является самым динамично развивающимся языком программирования (как видно на диаграмме трендов Stack Overflow), и мы прекрасно понимаем, что это значит. Популярность = релевантность!
К концу этой статьи я ставлю своей целью дать вам понимание того, насколько мощным является язык программирования Python и какой фреймворк для тестирования лучше всего подойдет вашему проекту исходя из его потребностей.
Что хорошего в Python для автоматизации тестирования?
Есть довольно много причин, по которым популярность Python растет в области автоматизации тестирования и версий, почему он считается лучшим вариантом для нее. Среди них вы найдете: Дзен Python (19 основополагающих принципов философии проектирования на Python), удобство для начинающих, но мощность для профессионалов; Python – одновременно объектно-ориентированный и функциональный, у него есть большая библиотека пакетов для тестирования, серьезное сообщество по всему миру и многое другое! Я рекомендую прочитать вам чуть больше об этом в блоге AutomationPanda.
Фреймворк для тестирования на Python, который вам подходит
С ростом применения Python растет и популярность фреймворков для тестирования на его основе. Поначалу может быть неясно, какой инструмент из всего многообразия следует выбрать, поскольку у каждого из них есть свои плюсы и минусы. Тем не менее, у каждого проекта и организации, есть свои требования и ограничения, поэтому нам нужно учитывать их все при выборе инструмента, который подойдет нам лучше всего. Чтобы лучше разобраться в этом вопросе, я рекомендую вам прочитать эти статьи:
И, конечно, зачем же нужны списки с плюсами и минусами, как ни для того, чтобы собрать важные сведения об инструментах в одном месте! Итак, давайте рассмотрим 8 лучших фреймворков для тестирования на Python и рассмотрим как их преимущества, так и недостатки, чтобы вам было проще выбрать идеальный фреймворк для тестирования.
Преимущества и недостатки 8 лучших фреймворков для тестирования на Python
Настройка модульного тестирования для кода Python
Модульные тесты — это сегменты кода, которые проверяют работу других частей кода в приложении, например изолированных функций, классов и т. д. Если приложение успешно проходит все модульные тесты, то вы по меньшей мере уверены, что все низкоуровневые функции работают правильно.
В Python модульное тестирование широко используется для проверки скриптов в процессе разработки. Поддержка Python в Visual Studio включает обнаружение, выполнение и отладку модульных тестов непосредственно в контексте процесса разработки, а значит, вам не потребуется выполнять эти тесты отдельно.
Эта статья содержит краткий обзор модульного тестирования в Visual Studio для Python. Общие сведения о модульном тестировании см. в статье о модульном тестировании кода.
Обнаружение и просмотр тестов
Откройте Проект Python, загруженный в Visual Studio, щелкните его правой кнопкой мыши, выберите Добавить > Новый элемент, а затем выберите Модульный тест Python и нажмите Добавить.
Если нужно, сохраните этот файл, а затем откройте обозреватель тестов, последовательно выбрав Тест > Окна > Обозреватель тестов.
Обозреватель тестов ищет тесты в проекте и отображает результаты, как показано ниже. Дважды щелкните тест, чтобы открыть его исходный файл.
Когда тестов в проекте будет больше, их можно упорядочить в обозревателе тестов, используя команду Группировать на панели инструментов:
Также вы можете ввести текст в поле Поиск, чтобы отфильтровать тесты по именам.
Дополнительные сведения о модуле unittest и создании тестов можно получить в документации по Python 2.7 или в документации по Python 3.7 (python.org).
Выполнить тесты
В обозревателе тестов можно запустить тесты несколькими способами:
Тесты выполняются в фоновом режиме, а обозреватель тестов обновляет их состояние по мере завершения:
Успешно выполненные тесты обозначаются зеленым флажком, и для них указывается затраченное время:
Отладка тестов
Модульные тесты являются частью кода проекта, и в них могут встречаться ошибки, как и в любом другом коде. Периодически тест следует запускать в отладчике, где можно установить точки останова, просмотреть переменные или выполнить код пошагово. Также Visual Studio предоставляет средства диагностики для модульных тестов.
Чтобы начать отладку, установите в коде начальную точку останова, а затем щелкните в обозревателе тестов правой кнопкой мыши этот тест (или выделенный набор тестов) и выберите Отладить выбранные тесты. Visual Studio запускает отладчик Python, как для обычного кода приложения.
Вы также можете использовать команду Анализ покрытия кода для выбранных тестов. Дополнительные сведения см. в разделе Использование покрытия кода для определения объема протестированного кода.
Известные проблемы
Выбор платформы тестирования для проекта Python
Visual Studio поддерживает две платформы тестирования для Python — unittest и pytest (доступна в Visual Studio 2019, начиная с версии 16.3). По умолчанию при создании проекта Python платформа не выбрана. Чтобы указать платформу, щелкните правой кнопкой мыши имя проекта в обозреватель решений и выберите параметр Свойства. Открывается конструктор проектов, позволяющий настраивать тесты с помощью вкладки Тест. На этой вкладке можно выбрать платформу тестирования, используемую для вашего проекта.
После сохранения выбранных параметров и платформы в обозревателе тестов инициируется обнаружение тестов. Если окно обозревателя тестов еще не открыто, перейдите на панель инструментов и выберите Тест > Обозреватель тестов.
Настройка тестирования для Python без проекта
Visual Studio позволяет запускать и тестировать существующий код Python без проекта, открыв папку с кодом Python. В этих случаях для настройки тестирования потребуется файл PythonSettings.json.
Откройте существующий код Python с помощью параметра Открыть локальную папку.
В окне обозревателя решений щелкните значок Показать все файлы, чтобы отобразить все файлы в текущей папке.
Перейдите к файлу PythonSettings.json в папке Локальные параметры. Если этот файл отсутствует в папке Локальные параметры, создайте его вручную.
Добавьте поле TestFramework в файл параметров и задайте для него значение pytest или unittest в зависимости от требуемой платформы тестирования.
Если для платформы unittest в файле PythonSettings.json не указаны поля UnitTestRootDirectory and UnitTestPattern, они добавляются и получают значения по умолчанию «.» и «test*.py», соответственно.
Если папка содержит каталог src, отличный от папки с вашими тестами, укажите путь к папке src с помощью поля SearchPaths в файле PythonSettings.json.
Сохраните изменения в файле PythonSettings.json, чтобы начать обнаружение тестов для указанной платформы.
Если окно обозревателя тестов уже открыто нажатие клавиш CTRL + R,A также активирует обнаружение.
Обнаружение и просмотр тестов
После загрузки проекта в Visual Studio щелкните проект правой кнопкой мыши в обозревателе решений и выберите платформу unittest или pytest на вкладке Тест в области свойств.
Выбрав платформу, снова щелкните проект правой кнопкой мыши и выберите Добавить > Новый Элемент, затем Модульный тест Python и нажмите кнопку Добавить.
Если нужно, сохраните этот файл, а затем откройте обозреватель тестов, последовательно выбрав команды Тест > Обозреватель тестов.
Обозреватель тестов ищет тесты в проекте и отображает результаты, как показано ниже. Дважды щелкните тест, чтобы открыть его исходный файл.
Когда тестов в проекте будет больше, их можно упорядочить в обозревателе тестов, используя команду Группировать на панели инструментов:
Также вы можете ввести текст в поле Поиск, чтобы отфильтровать тесты по именам.
Дополнительные сведения о модуле unittest и создании тестов можно получить в документации по Python 2.7 или в документации по Python 3.7 (python.org).
Выполнить тесты
В обозревателе тестов можно запустить тесты несколькими способами:
Тесты выполняются в фоновом режиме, а обозреватель тестов обновляет их состояние по мере завершения:
Успешно выполненные тесты обозначаются зеленым флажком, и для них указывается затраченное время:
Отладка тестов
Модульные тесты являются частью кода проекта, и в них могут встречаться ошибки, как и в любом другом коде. Периодически тест следует запускать в отладчике, где можно установить точки останова, просмотреть переменные или выполнить код пошагово. Также Visual Studio предоставляет средства диагностики для модульных тестов.
При тестовой отладке по умолчанию используется отладчик ptvsd 4 для Visual Studio 2017 (версии 15.8 и последующих) и debugpy для Visual Studio 2019 (версии 16.5 и последующих). Если вы хотите использовать вместо него ptvsd 3, можно выбрать параметр Использовать устаревший отладчик в меню Сервис > Параметры > Python > Отладка.
Чтобы начать отладку, установите в коде начальную точку останова, а затем щелкните в обозревателе тестов правой кнопкой мыши этот тест (или выделенный набор тестов) и выберите Отладить выбранные тесты. Visual Studio запускает отладчик Python, как для обычного кода приложения.
Вы также можете использовать команду Анализ покрытия кода для выбранных тестов. Дополнительные сведения см. в разделе Использование покрытия кода для определения объема протестированного кода.