При автоматизации тестирования фронтенда выбор идеального языка программирования становится чрезвычайно важным. Python – один из таких языков, который лидирует благодаря простоте использования и обширной поддержке сообщества.
Более того, автоматизация тестирования на Python позволяет использовать возможности популярных библиотек и фреймворков, таких как Selenium, pytest и Robot, среди прочих. Использование Selenium с Python помогает максимально использовать мощные возможности автоматизации браузера Selenium в сочетании с простотой и расширяемостью Python. В целом, автоматизация тестирования на Python широко используется специалистами по тестированию качества во всем мире, особенно с Selenium WebDriver.
В этом блоге мы углубимся в тонкости работы с Python с точки зрения фронтенда. Знания, полученные из этого блога, будут полезны при использовании возможностей Python для автоматизации как простых, так и сложных сценариев фронтенда.
Что такое автоматизация тестирования на Python?
Как следует из названия, автоматизация тестирования на Python – это процесс использования сценариев Python для автоматизации тестов. Это один из наиболее востребованных языков программирования для автоматизации рутинных и повторяющихся задач.
Простой пример автоматизированного тестирования на Python включает использование фреймворка pytest с Selenium для автоматизации фронтальных тестов на платформе электронной коммерции. Вы можете проверить функциональность регистрации на сайте электронной коммерции и использовать ту же сессию для навигации по сайту и добавления необходимых товаров в корзину. К концу этого теста вы проверите функциональность регистрации, входа и корзины на сайте электронной коммерции.
Наконец, вы также можете использовать Python для автоматизации системного администрирования, автоматизации электронной почты и обработки данных. Поскольку Python является необходимым условием для автоматизированных тестов, пожалуйста, обратитесь к видео ниже, которое подробно рассматривает установку Python.
Почему Python для автоматизированного тестирования?
Теперь, когда мы знаем, почему тестировщики предпочитают Selenium с Python, давайте рассмотрим некоторые из основных причин выбора Python для автоматизированного тестирования:
1. Широкий выбор библиотек и фреймворков
PyUnit (или unittest) является стандартным тестовым фреймворком для выполнения модульного тестирования на Python. Хотя PyUnit доступен “из коробки”, Python поддерживает и другие популярные фреймворки, такие как pytest, Behave, Robot, Lettuce и Nose2.
Все они могут быть использованы в сочетании с фреймворками Selenium и Playwright для автоматизации тестов веб-браузеров.
2. Супер простой параллельный запуск тестов
Параллельное тестирование в Selenium и Python может широко использоваться для выполнения автоматизированных тестов веб-браузеров на различных комбинациях браузеров и платформ. Хотя все языки, поддерживаемые Selenium, поддерживают параллельный запуск тестов, это очень удобно использовать с Python.
3. Много-парадигменный язык программирования
Python является много-парадигменным языком программирования. Поэтому он полностью поддерживает объектно-ориентированное и структурное программирование. Большинство функций в Python поддерживают функциональное программирование и аспектно-ориентированное программирование. Python, вместе с Selenium, также может использоваться для функционального тестирования веб-сайтов и веб-приложений.
4. Динамическая типизация
Язык Python использует динамическую типизацию и позднее связывание (или динамическое разрешение имен), которое связывает методы и имена переменных во время выполнения. Эта функция очень полезна для автоматизации тестирования на Python.
Python также предлагает такие опции, как Pyre (производительный проверщик типов для Python 3) и Mypy, которые являются популярными статическими проверщиками типов. С помощью этих проверщиков Python позволяет комбинировать мощь динамической и статической типизации.
5. Веб-скрейпинг
Веб-скрейпинг с помощью Python — это процесс извлечения значимой и полезной информации/данных с веб-сайтов. Он в основном используется для академических исследований, анализа конкурентов, агрегации контента и многого другого.
Python предлагает ряд библиотек и фреймворков, а именно BeautifulSoup (bs4), Selenium, Puppeteer и Pyppeteer, которые упрощают задачу скрейпинга контента с веб-сайтов.
6. Мощная и беззаботная отчетность
Отчётность в автоматизации тестирования обеспечивает более подробное представление о тонкостях выполнения тестов (например, процент пройденных/проваленных тестов, тестовая среда, скриншоты и т. д.). Мощные отчёты, предоставляющие правильную информацию в краткой и понятной форме, могут быть отправлены заинтересованным сторонам (в команде), чтобы они были в курсе прогресса в области тестирования.
Как выполнять автоматизированное тестирование на Python?
Теперь, когда мы рассмотрели важность автоматизированного тестирования на Python, давайте приступим к делу и запустим некоторые тесты. Наше обсуждение в основном будет касаться автоматизированного тестирования интерфейса с помощью Python.
Прежде чем мы приступим к тестам, давайте настроим виртуальное окружение (venv
), которое поможет лучше управлять окружением и зависимостями. venv
играет важную роль в обеспечении изоляции от установленных пакетов в базовом окружении.
Запустите команды virtualenv venv
и source venv
/bin
/activate
в терминале, чтобы создать виртуальное окружение. Все зависимости (или пакеты Python), такие как pytest
, selenium
, и т. д., необходимые для выполнения проекта, доступны в файле requirements.txt.
pytest-selenium
pytest-xdist
selenium>=4.6.0
urllib3==1.26.12
requests
py
Зависимости
Зависимости могут быть установлены, запустив pip install -r requirements.txt
в терминале. Selenium v4.6.0 (или выше) устанавливается в рамках процедуры установки.
Для демонстрации мы будем выполнять простые тесты Selenium Python с использованием фреймворков pytest и PyUnit (или unittest). Если вы хорошо знаете любой из этих фреймворков, рекомендуется использовать фикстуры в Python и модель объектов страницы в Selenium Python для улучшенного обслуживания тестов. Сам пакет Selenium не предоставляет инструмент тестирования или фреймворк. Поэтому мы будем использовать Selenium с pytest и PyUnit для автоматизации взаимодействия с элементами на веб-странице.
Сценарий тестирования
- Перейти на страницу LambdaTest Selenium Playground.
- Найти ссылку на отправку формы ввода на странице.
- Ввести необходимую информацию на странице.
- Отправить данные и убедиться, что информация не была успешно отправлена.
Реализация (фреймворк pytest)
Ниже приведен скрипт теста для указанного сценария тестирования:
import os
import pytest
from os import environ
import time
from selenium.webdriver import ChromeOptions
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
exec_platform = os.getenv('EXEC_PLATFORM')
time_sleep = 2
########################## Locators #########################
xSubmitForm = "//a[.='Input Form Submit']"
xInpName = "//input[@id='name']"
cInpName = "#name"
xInpEmail = "//form[@id='seleniumform']//input[@name='email']"
xInpPassword = "//input[@name='password']"
cssCompany = "#company"
cWebName = "#websitename"
xInpCountry = "//select[@name='country']"
xInpCity = "//input[@id='inputCity']"
cssAddress1 = "[placeholder='Address 1']"
cssAddress2 = "[placeholder='Address 2']"
cssInpState = "#inputState"
cssInpZip = "#inputZip"
cssInpButton = ".bg-lambda-900"
nameSearchBox = "search"
class TestFormInput:
def setup_method(self):
if exec_platform == 'cloud':
username = environ.get('LT_USERNAME', None)
access_key = environ.get('LT_ACCESS_KEY', None)
ch_options = webdriver.ChromeOptions()
lt_options = {}
lt_options["build"] = "Build: Getting Started with Selenium PyTest"
lt_options["project"] = "Project: Getting Started with Selenium PyTest"
lt_options["name"] = "Test: Getting Started with Selenium PyTest"
lt_options["browserName"] = "Chrome"
lt_options["browserVersion"] = "latest"
lt_options["platformName"] = "macOS Sonoma"
lt_options["geoLocation"] = "US"
lt_options["console"] = "error"
lt_options["w3c"] = True
lt_options["headless"] = False
ch_options.set_capability('LT:Options', lt_options)
gridURL = "https://{}:{}@hub.lambdatest.com/wd/hub".format(username, access_key)
self.driver = webdriver.Remote(
command_executor = gridURL,
options = ch_options
)
elif exec_platform == 'local':
ch_options = ChromeOptions()
self.driver = webdriver.Chrome(options=ch_options)
def test_enter_form_details(self):
resultant_str = "Thanks for contacting us, we will get back to you shortly."
driver = self.driver
driver.get("https://www.lambdatest.com/selenium-playground/")
# Commented once the tests are executed in non-headless mode
driver.maximize_window()
wait = WebDriverWait(driver, 5)
try:
element = driver.find_element(By.XPATH, xSubmitForm)
element.click()
elem_name = driver.find_element(By.XPATH, xInpName)
elem_name.send_keys("Testing")
time.sleep(time_sleep)
elem_email = driver.find_element(By.XPATH, xInpEmail)
elem_email.send_keys("[email protected]")
time.sleep(time_sleep)
elem_pass = driver.find_element(By.XPATH, xInpPassword)
elem_pass.send_keys("password")
time.sleep(time_sleep)
elem_comp = driver.find_element(By.CSS_SELECTOR, cssCompany)
elem_comp.send_keys("LambdaTest")
elem = driver.find_element(By.CSS_SELECTOR, cWebName)
elem.send_keys("https://wwww.lambdatest.com")
country_dropdown = Select(driver.find_element(By.XPATH, xInpCountry))
country_dropdown.select_by_visible_text("United States")
time.sleep(time_sleep)
elem = driver.find_element(By.XPATH, xInpCity)
elem.send_keys("San Jose")
time.sleep(time_sleep)
elem = driver.find_element(By.CSS_SELECTOR, cssAddress1)
elem.send_keys("Googleplex, 1600 Amphitheatre Pkwy")
time.sleep(time_sleep)
elem = driver.find_element(By.CSS_SELECTOR, cssAddress2)
elem.send_keys("Mountain View, CA 94043")
time.sleep(time_sleep)
elem = driver.find_element(By.CSS_SELECTOR, cssInpState)
elem.send_keys("California")
time.sleep(time_sleep)
elem = driver.find_element(By.CSS_SELECTOR, cssInpZip)
elem.send_keys("94088")
time.sleep(time_sleep)
# Click on the Submit button
submit_button = driver.find_element(By.CSS_SELECTOR, cssInpButton)
submit_button.click()
time.sleep(2)
try:
element = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".success-msg"))
)
assert resultant_str in element.text, f"'{resultant_str}' not found in the specified element."
except Exception as e:
if exec_platform == 'cloud':
driver.execute_script("lambda-status=failed")
pytest.fail(f"Text '{resultant_str}' not found: {str(e)}")
time.sleep(2)
except Exception as e:
# Catch other exceptions
print(f"Failed: Input Form Demo, generic exception - {e}")
if exec_platform == 'cloud':
driver.execute_script("lambda-status=failed")
if exec_platform == 'cloud':
driver.execute_script("lambda-status=passed")
print(f"PyTest Demo: Test Passed")
def teardown_method(self):
if (self.driver != None):
# self.driver.close()
self.driver.quit()
if __name__ == "__main__":
pytest.main()
Обзор кода
Для начала работы мы импортируем необходимые модули, необходимые для реализации тестов. Поскольку мы используем pytest, модуль pytest
также импортируется в код.
Класс WebDriverWait
из модуля selenium.webdriver.support.ui импортируется, чтобы мы могли использовать явные ожидания в сценариях, где элементы веб-страницы находятся динамически. Модуль expected_conditions
предоставляет набор предопределенных ожидаемых условий в Selenium, которые могут использоваться с явными ожиданиями.
Поскольку элементы должны быть найдены перед выполнением какого-либо действия, сначала мы определяем локаторы элементов, необходимых для этого. Идентификатор (ID), имя (Name), XPath, текст ссылки (Link Text), частичный текст ссылки (Partial Link Text) и т. д. – некоторые из широко используемых веб-локаторов, которые помогают вам найти элементы внутри модели объектов документа (DOM).
Вы можете использовать инструменты инспекции, доступные нативно веб-браузере, или плагин (или дополнение), например, POM Builder, который упрощает поиск XPath/CSS Selector веб-элементов.
После того как веб-локатор определен, соответствующий(ие) веб-элемент(ы) находятся путем объединения локатора с методом find_element()
или find_elements()
в Selenium Python. Метод find_element()
возвращает один веб-элемент, в то время как find_elements()
возвращает список веб-элементов, соответствующих критериям локатора.
Как уже упоминалось ранее, setup_method()
– это фикстура pytest, которая является частью инициализации. Этот метод вызывается перед каждой тестовой функцией, реализованной в указанном классе тестов.
Тесты, которые реализованы, могут быть запущены на Selenium, установленном на локальной машине, а также на онлайн-сетке Selenium, предлагаемой облачным тестированием. LambdaTest – это платформа для выполнения тестов с использованием искусственного интеллекта, которая позволяет запускать автоматизированные тесты Python масштабно на разных браузерах и операционных системах. Он обладает рядом преимуществ, основные из которых – снижение затрат на обслуживание, снижение затрат и ускорение выполнения тестов.
Что касается реализации, единственное изменение связано с Selenium WebDriver, где Remote WebDriver в Selenium создается при запуске тестов на облачной сетке. Генератор автоматизации возможностей помогает создавать возможности для комбинации тестов, предназначенных для использования в тестах.
В Selenium 4 вместо желаемых возможностей используются параметры браузера. Вы можете ознакомиться с блогом по различиям между Selenium 3 и Selenium 4, чтобы узнать больше о том, что устарело в Selenium 4.
Переменные среды LT_USERNAME
и LT_ACCESS_KEY
можно получить из настроек учетной записи LambdaTest в разделе Пароль и безопасность. Комбинация, передаваемая вместе с URL-адресом сетки LambdaTest, помогает выполнять тесты на облачной сетке. В методе test_enter_form_details()
мы сначала переходим по URL теста, вызывая метод driver.get()
.
Затем созданное окно браузера максимизируется, поскольку это считается одной из лучших практик Selenium.
Затем элемент Input Form Submit находится с использованием метода find_element()
вместе с локатором XPath в Selenium. Как только он найден, вызывается нажатие кнопки в Selenium для имитации действия нажатия на элемент кнопки, найденный на предыдущем этапе.
Поскольку все шаги теста включают в себя поиск элементов и выполнение действий, мы сосредотачиваемся только на нескольких методах. Подход, используемый для поиска элемента компании с помощью селектора CSS в Selenium, показан ниже. Метод send_keys()
в Selenium WebDriver помогает отправлять текстовый ввод в найденный элемент.
Выпадающие списки широко используются на веб-сайтах; поэтому автоматизация взаимодействия с выпадающими списками с помощью Selenium становится абсолютной необходимостью для ваших тестов. Класс Select
модуля selenium.webdriver.support.ui предоставляет методы, которые позволяют вам управлять выпадающими списками с помощью Selenium.
Здесь создается объект (т. е. country_dropdown
) класса Select
с вводом, установленным в элемент выпадающего списка, найденный с помощью XPath. Метод select_by_visible_text()
класса Select
помогает выбрать элементы с видимым текстом, совпадающим с данным строкой (т. е. Соединенные Штаты).
Как только вся информация в форме введена и нажата кнопка Отправить, мы ждем, пока строка успешного сообщения (по умолчанию: скрытая) не станет видимой на странице. Явное ожидание с использованием ожидаемого условия (т. е. присутствие найденного элемента) выполняется до тех пор, пока успешное сообщение не появится на странице.
Утверждение порождается, если результирующая строка отсутствует на странице. Для выполнения в облаке переменная lambda-status
помечается как пройдено/неудачно в зависимости от статуса выполнения.
Фикстура teardown_method()
содержит реализацию для очистки ресурсов или состояния после выполнения тестов в классе. Конструкция if __name__ == "__main__":
гарантирует, что выполнение кода происходит только при запуске скрипта напрямую. Вызов pytest.main()
запускает фреймворк pytest, который далее обнаруживает и выполняет все включенные (т. е. не помеченные как пропущенные) тесты в скрипте.
Выполнение тестов (фреймворк pytest)
После установки EXEC_PLATFORM
в значение cloud, выполните следующую команду в терминале, чтобы запустить тесты pytest на облачной платформе LambdaTest:
pytest --verbose --capture=no tests/pytest/pytest_selenium_demo.py
Ниже приведен скриншот панели веб-автоматизации LambdaTest, который указывает на успешное выполнение теста:
Реализация (фреймворк PyUnit)
Скрипт теста для вышеупомянутого тестового сценария с использованием фреймворка PyUnit находится в tests/pyunit/pyunit_selenium_demo.py.
Основная логика теста остается неизменной при миграции с pytest на фреймворк PyUnit (или unittest). Вместо модуля pytest
в код импортируется модуль unittest
. Класс тестового случая наследуется от unittest.TestCase
, что информирует модуль unittest о том, что это тестовый случай.
Фикстуры pytest setup_method()
/teardown()
аналогичны методам setUp()
/tearDown()
фреймворка PyUnit. Методы setUp()
и tearDown()
содержат реализацию, отвечающую за инициализацию и деинициализацию соответственно.
Ниже приведен шаблонный код для выполнения тестового набора:
if __name__ == "__main__":
unittest.main()
Выполнение тестов (фреймворк PyUnit)
После установки EXEC_PLATFORM
в облако, вызовите следующую команду в терминале для запуска тестов PyUnit на облачной сетке:
python tests/pyunit/pyunit_selenium_demo.py
Ниже показан снимок экрана панели автоматизации веб-тестирования LambdaTest, указывающий успешное выполнение теста:
Если вы хотите запустить вышеуказанные тесты на Selenium, установленном на локальной машине, просто установите EXEC_PLATFORM
в local, и вы готовы к локальному выполнению.
Лучшие фреймворки тестирования на Python
Поскольку Python поддерживает ряд фреймворков для автоматизации тестирования, выбор правильного фреймворка становится крайне важным для вашего проекта. Выбор фактически заложит основу для эффективного тестирования. Помимо возможностей фреймворка, вам также необходимо обратить внимание на внутренние навыки с данным фреймворком. Ниже приведены некоторые из лучших фреймворков тестирования на Python:
PyUnit (unittest)
Это фреймворк по умолчанию, доступный в Python. Как следует из названия, он в основном используется для модульного тестирования. PyUnit вдохновлен фреймворком JUnit для Java и обладает схожей структурой и функциональностью.
Фреймворк unittest также поддерживает автоматизацию тестирования с общим кодом настройки и завершения для тестов, независимость тестов от системы отчетности и многое другое. Он также поддерживает тестовые наборы и тестовые случаи в объектно-ориентированном стиле. Также имеется тестовый запускающий компонент, который отвечает за оркестрацию выполнения тестов.
pytest
Это один из самых популярных фреймворков для автоматизации тестирования на Python. Он использует менее развернутый и удобный для пользователя синтаксис для реализации тестов. pytest можно использовать для написания модульных тестов, а также сложных функциональных тестов для тестирования веб-сайтов и веб-приложений.
Тесты, написанные с использованием pytest, значительно компактнее, поскольку фреймворк не требует шаблонного кода. В pytest встроены функции, которые помогают с автоматическим обнаружением модулей и функций для тестирования.
Robot
Это фреймворк на основе ключевых слов с открытым исходным кодом на Python, который в основном используется для роботизации процессов (RPA) и автоматизации тестирования. Подобно фреймворку pytest, Robot также расширяем. Использование читаемого человеком синтаксиса/ключевых слов минимизирует кривую обучения, связанную с изучением Robot.
Тесты, написанные в Robot, сохраняются с расширением .robot
. Если вы планируете использовать Robot для тестов интерфейса, вы можете сделать это с помощью SeleniumLibrary, который является библиотекой для веб-тестирования для фреймворка Robot. Библиотека поддерживает обширный набор ключевых слов (Click Button, Click Image, Open Browser, Drag and Drop, среди прочего).
Nose2
Это наследник Nose и является фреймворком тестирования на Python, который расширяет возможности фреймворка PyUnit (или unittest). Начать работу с Nose2 довольно легко, если у вас уже есть опыт работы с unittest.
Основное преимущество Nose2 перед PyUnit заключается в наличии большого количества встроенных плагинов Nose, которые делают тестирование более простым и быстрым. Плагины в Nose2 помогают в параметризации тестов, лучшей организации тестов, поддержке фикстур, обнаружении тестов и многом другом.
Behave
Это фреймворк на Python, используемый для Behavior-Driven Development (BDD). Тесты основаны на синтаксисе Gherkin, который соответствует формату Given-When-Then.
Поскольку тесты реализованы в сценариях и файлов функционала, даже не технический персонал может участвовать в процессе QA. SpecFlow (C#) и Cucumber (Java, JS, Ruby) – некоторые из других популярных BDD-фреймворков.
Заключение
Как видно из вышесказанного, Python – безусловно лучший язык сценариев для автоматизации тестирования. Начать работу с автоматизированным тестированием на Python довольно легко. Его широкий выбор тестовых фреймворков может использоваться для модульного тестирования, тестирования на разных браузерах и многого другого. Дайте нам знать ниже ваш предпочитаемый язык программирования для тестирования Selenium и как вы его оцениваете по сравнению с Python, бесспорным королем автоматизированного тестирования. Счастливого тестирования!
Source:
https://dzone.com/articles/python-automation-testing-with-examples