Повысьте эффективность тестирования и качество кода с помощью идеального сочетания Selenium и PyTest.
Повысьте эффективность тестирования и качество кода с помощью идеального сочетания Selenium и PyTest.

При разработке программного обеспечения автоматизированное тестирование является одним из ключевых шагов для обеспечения качества и стабильности приложения. Selenium — популярный инструмент автоматического тестирования, а PyTest — одна из широко используемых платформ тестирования в сообществе Python. В этой статье рассказывается, как объединить Selenium и PyTest для автоматического тестирования, чтобы повысить эффективность тестирования и качество кода.

Введение

Selenium — это инструмент для автоматического тестирования веб-приложений, который поддерживает несколько браузеров и операционных систем. PyTest — это простая, но мощная среда тестирования Python с богатой экосистемой плагинов и простым в использовании синтаксисом. Сочетание этих двух методов позволяет легко писать автоматизированные тестовые сценарии и управлять ими, а также выполнять надежные тесты.

Настройки среды

Прежде чем начать, убедитесь, что в вашей системе установлены Python и pip. Затем используйте pip для установки необходимых библиотек:

Язык кода:javascript
копировать
pip install selenium pytest

Кроме того, убедитесь, что у вас установлен драйвер браузера, например ChromeDriver или GeckoDriver, и добавьте его в переменные среды вашей системы.

Пишите тестовые случаи

Давайте продемонстрируем на простом примере, как объединить Selenium и PyTest. Допустим, мы хотим протестировать страницу входа:

Язык кода:javascript
копировать
# test_login.py
​
from selenium import webdriver
import pytest
​
@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # Используйте браузер Chrome
    yield driver
    driver.quit()
​
def test_login_success(browser):
    browser.get("https://example.com/login")
    browser.find_element_by_id("username").send_keys("your_username")
    browser.find_element_by_id("password").send_keys("your_password")
    browser.find_element_by_id("login-button").click()
    assert browser.current_url == "https://example.com/dashboard"
​
def test_login_failure(browser):
    browser.get("https://example.com/login")
    browser.find_element_by_id("username").send_keys("invalid_username")
    browser.find_element_by_id("password").send_keys("invalid_password")
    browser.find_element_by_id("login-button").click()
    assert "Invalid username or password" in browser.page_source

В приведенном выше примере мы сначала определяем приспособление browser,Он будет запускать и закрывать браузер до и после выполнения каждого тестового примера. Затем мы написали два тестовых примера,Проверьте успех и неудачу входа в систему соответственно.

Запуск тестов

Теперь мы можем использовать PyTest для запуска наших тестовых случаев. Введите каталог, в котором находится тестовый пример, в командной строке и выполните следующую команду:

Язык кода:javascript
копировать
pytest test_login.py

PyTest выполнит тестовые примеры и выведет результаты тестов.

Параметрическое тестирование

PyTestпредоставил Параметрическое Добавлена ​​функциональность для запуска одного и того же тестового примера с учетом набора входных параметров. Это полезно, когда тестирование должно охватывать различные сценарии. Мы можем изменить приведенный выше пример, чтобы использовать Параметрическое Предлагаю протестировать различные комбинации имени пользователя и пароля.

Язык кода:javascript
копировать
# test_login_parametrized.py
​
import pytest
from selenium import webdriver
​
@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # Используйте браузер Chrome
    yield driver
    driver.quit()
​
@pytest.mark.parametrize("username, password", [
    ("valid_username", "valid_password"),
    ("invalid_username", "invalid_password"),
    ("another_valid_username", "another_valid_password"),
])
def test_login(browser, username, password):
    browser.get("https://example.com/login")
    browser.find_element_by_id("username").send_keys(username)
    browser.find_element_by_id("password").send_keys(password)
    browser.find_element_by_id("login-button").click()
    if username == "valid_username" and password == "valid_password":
        assert browser.current_url == "https://example.com/dashboard"
    else:
        assert "Invalid username or password" in browser.page_source

В этом примере,мы использовали@pytest.mark.parametrizeдекоратор для указания Параметрическое тестированиевходные параметры。тестовый примерtest_loginбудет выполняться для каждого набора комбинаций параметров,и убедитесь, что вход в систему прошел успешно.

Параллельное тестирование

Объединив функцию распределенного выполнения Selenium и плагин параллельного выполнения PyTest.,Мы можем реализовать вариант использования параллельного выполнения тестов.,Тем самым увеличивая скорость тестирования. В PyTest,Можно использовать-nПараметр указывает количество одновременно выполняемых процессов.。

Язык кода:javascript
копировать
pytest -n 4 test_login.py

Это ускорит тестирование за счет запуска тестового примера «Выполнение тестов» одновременно с 4 процессами.

Шаблон объекта страницы

Шаблон объекта страница — это шаблон проектирования, используемый для инкапсуляции элементов и операций страницы в отдельные классы для улучшения удобства сопровождения и читаемости тестового кода. Давайте изменим пример и представим Шаблон объекта страницы。

Язык кода:javascript
копировать
# login_page.py
​
class LoginPage:
    def __init__(self, browser):
        self.browser = browser
        self.url = "https://example.com/login"
        self.username_field = "username"
        self.password_field = "password"
        self.login_button = "login-button"
    
    def load(self):
        self.browser.get(self.url)
    
    def login(self, username, password):
        self.browser.find_element_by_id(self.username_field).send_keys(username)
        self.browser.find_element_by_id(self.password_field).send_keys(password)
        self.browser.find_element_by_id(self.login_button).click()

Теперь мы можем создать отдельный объект страницы. LoginPage,Он содержит все элементы и действия страницы входа. Затем,Мы можем изменить тестовый пример, чтобы использовать этот объект страницы.

Язык кода:javascript
копировать
# test_login_page.py
​
from selenium import webdriver
from login_page import LoginPage
import pytest
​
@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # Используйте браузер Chrome
    yield driver
    driver.quit()
​
def test_login_success(browser):
    login_page = LoginPage(browser)
    login_page.load()
    login_page.login("your_username", "your_password")
    assert browser.current_url == "https://example.com/dashboard"
​
def test_login_failure(browser):
    login_page = LoginPage(browser)
    login_page.load()
    login_page.login("invalid_username", "invalid_password")
    assert "Invalid username or password" in browser.page_source

Через страницу объекта шаблона,Мы можем отделить элементы страницы и действия от тестового кода.,Улучшена читаемость и ремонтопригодность кода. Любые изменения в структуре или элементах страницы можно обновить в классе объектов страницы.,без необходимости изменять тестовые примеры.

тестирование на основе данных

в реальном тестировании,Нам часто приходится использовать разные данные для тестирования,Например, разные имена пользователей、Пароль или другой ввод。тестирование на основе данных — это распространенный метод тестирования, который может управлять выполнением тестовых случаев через внешние источники данных. Давайте расширим наш пример, используя тестирование. на основе данные для проверки различных комбинаций имени пользователя и пароля.

Язык кода:javascript
копировать
# test_login_data_driven.py
​
import pytest
from selenium import webdriver
from login_page import LoginPage
​
@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # Используйте браузер Chrome
    yield driver
    driver.quit()
​
# Определение тестовых данных
test_data = [
    ("valid_username", "valid_password", True),
    ("invalid_username", "invalid_password", False),
    ("another_valid_username", "another_valid_password", False)
]
​
@pytest.mark.parametrize("username, password, expected_result", test_data)
def test_login_data_driven(browser, username, password, expected_result):
    login_page = LoginPage(browser)
    login_page.load()
    login_page.login(username, password)
    if expected_result:
        assert browser.current_url == "https://example.com/dashboard"
    else:
        assert "Invalid username or password" in browser.page_source

В этом примере,мы использовали@pytest.mark.parametrizeдекоратор для указания Параметрическое тестированиевходные параметры,но на этот размы использоваливнешнийиз Список данныхtest_dataпредоставить параметры。Каждый элемент данных содержит имя пользователя、Пароль и ожидаемый результат (успех или неудача).

Выполнение тестов

Теперь мы можем выполнить наш тестовый пример:

Язык кода:javascript
копировать
pytest test_login_data_driven.py

PyTestпобежитtest_login_data_driven.pyв файлеизтестовый пример,И используйте различные комбинации данных, предусмотренные для Выполнения тестов.

Тестирование отчетов и журналов

При автоматизированном тестировании очень важно создавать подробные отчеты о тестировании и записывать процесс выполнения теста. PyTest предоставляет богатую экосистему плагинов, которая позволяет легко создавать красивые отчеты о тестировании и записывать журналы выполнения тестов.

Сначала давайте установим несколько плагинов отчетов PyTest:

Язык кода:javascript
копировать
pip install pytest-html pytest-logger

Затем мы можем изменить наши тестовые примеры, чтобы генерировать отчеты о тестировании в формате HTML и записывать журналы выполнения.

Язык кода:javascript
копировать
# test_login_with_report.py

import pytest
from selenium import webdriver
from login_page import LoginPage

@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # Используйте браузер Chrome
    yield driver
    driver.quit()

# Определение тестовых данных
test_data = [
    ("valid_username", "valid_password", True),
    ("invalid_username", "invalid_password", False),
    ("another_valid_username", "another_valid_password", False)
]

@pytest.mark.parametrize("username, password, expected_result", test_data)
def test_login_with_report(browser, username, password, expected_result):
    login_page = LoginPage(browser)
    login_page.load()
    login_page.login(username, password)
    if expected_result:
        assert browser.current_url == "https://example.com/dashboard"
    else:
        assert "Invalid username or password" in browser.page_source

# Добавьте конфигурацию плагина для создания отчетов о тестировании HTML.
def pytest_configure(config):
    config._metadata['Project Name'] = 'Web Login Test'
    config._metadata['Tester'] = 'Your Name'

# Добавить конфигурацию плагина для записи логов выполнения тестов
def pytest_logger_stdoutloggers():
    return ['tests']

Теперь мы можем использовать тесты PyTestЗапуск, генерировать отчеты о тестировании в формате HTML и записывать журналы выполнения:

Язык кода:javascript
копировать
pytest --html=report.html --logger-level=INFO test_login_with_report.py

PyTestсгенерирует файл с именемreport.htmlизHTMLотчет об испытаниях,И записывайте информацию журнала во время процесса выполнения.

Расширить покрытие тестирования

В дополнение к простому тестированию входа на страницу мы также можем расширить тестовые сценарии, чтобы охватить больше функций и сценариев для расширения охвата тестирования. Например, мы можем протестировать регистрацию новых пользователей, функции забывания пароля и т. д. Давайте расширим наш пример и добавим тестовый пример для проверки функциональности регистрации новых пользователей.

Язык кода:javascript
копировать
# test_registration.py

import pytest
from selenium import webdriver
from login_page import LoginPage

@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # Используйте браузер Chrome
    yield driver
    driver.quit()

def test_register_new_user(browser):
    login_page = LoginPage(browser)
    login_page.load()
    browser.find_element_by_link_text("Register").click()
    # Заполните здесь операцию регистрации нового пользователя. Если регистрация прошла успешно, произойдет переход на страницу входа.
    assert "Login" in browser.title

В этом примере,Мы добавилитестовый примерtest_register_new_userДля проверки зарегистрируйте новых пользователейиз Функция。Когда начнется тест,Загружаем страницу входа,Тогда нажмите ссылку регистрации,Выполнить операцию регистрации нового пользователя,И проверьте, успешно ли он переходит на страницу входа.

Подвести итог

В этой статье описывается, как объединить Selenium и PyTest для автоматического тестирования, а также приводится ряд примеров, демонстрирующих, как писать, выполнять и оптимизировать сценарии автоматического тестирования. Сначала мы узнали об основных концепциях и использовании Selenium и PyTest, а затем на примерах подробно рассказали, как объединить эти два инструмента для автоматического тестирования.

В примере мы рассмотрим следующее:

  1. Напишите базовые автоматизированные тестовые сценарии для проверки успешности и неудачи страницы входа в систему.
  2. использовать Параметрическое Предлагаю протестировать различные комбинации имени пользователя и пароля.
  3. Ускорьте выполнение тестов с помощью «Параллельного тестирования».
  4. Представляем шаблон объекта страницы для улучшения удобства сопровождения и читаемости тестового кода.
  5. Используйте прогноз на основе данных, чтобы охватить больше сценариев тестирования.
  6. Создавайте подробные отчеты о тестировании и записывайте журналы выполнения, чтобы понимать результаты тестов и устранять проблемы.
  7. Расширить покрытие тестирование, тестовые функции, такие как регистрация новых пользователей.

Объединив эти технологии и инструменты, мы можем легко писать, управлять и выполнять автоматизированные тесты, повышая эффективность тестирования, качество кода и стабильность программного обеспечения. В то же время эти методы также помогают лучше понять и применять технологию автоматического тестирования, повышая ценность разработки и тестирования программного обеспечения. Я надеюсь, что эта статья поможет читателям лучше применять технологию автоматического тестирования и повысить качество программного обеспечения и эффективность разработки.

Я участвую в последнем конкурсе эссе для специального учебного лагеря Tencent Technology Creation 2024. Приходите и разделите со мной приз!

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.