При разработке программного обеспечения автоматизированное тестирование является одним из ключевых шагов для обеспечения качества и стабильности приложения. Selenium — популярный инструмент автоматического тестирования, а PyTest — одна из широко используемых платформ тестирования в сообществе Python. В этой статье рассказывается, как объединить Selenium и PyTest для автоматического тестирования, чтобы повысить эффективность тестирования и качество кода.
Selenium — это инструмент для автоматического тестирования веб-приложений, который поддерживает несколько браузеров и операционных систем. PyTest — это простая, но мощная среда тестирования Python с богатой экосистемой плагинов и простым в использовании синтаксисом. Сочетание этих двух методов позволяет легко писать автоматизированные тестовые сценарии и управлять ими, а также выполнять надежные тесты.
Прежде чем начать, убедитесь, что в вашей системе установлены Python и pip. Затем используйте pip для установки необходимых библиотек:
pip install selenium pytest
Кроме того, убедитесь, что у вас установлен драйвер браузера, например ChromeDriver или GeckoDriver, и добавьте его в переменные среды вашей системы.
Давайте продемонстрируем на простом примере, как объединить Selenium и PyTest. Допустим, мы хотим протестировать страницу входа:
# 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 для запуска наших тестовых случаев. Введите каталог, в котором находится тестовый пример, в командной строке и выполните следующую команду:
pytest test_login.py
PyTest выполнит тестовые примеры и выведет результаты тестов.
PyTestпредоставил Параметрическое Добавлена функциональность для запуска одного и того же тестового примера с учетом набора входных параметров. Это полезно, когда тестирование должно охватывать различные сценарии. Мы можем изменить приведенный выше пример, чтобы использовать Параметрическое Предлагаю протестировать различные комбинации имени пользователя и пароля.
# 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
Параметр указывает количество одновременно выполняемых процессов.。
pytest -n 4 test_login.py
Это ускорит тестирование за счет запуска тестового примера «Выполнение тестов» одновременно с 4 процессами.
Шаблон объекта страница — это шаблон проектирования, используемый для инкапсуляции элементов и операций страницы в отдельные классы для улучшения удобства сопровождения и читаемости тестового кода. Давайте изменим пример и представим Шаблон объекта страницы。
# 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
,Он содержит все элементы и действия страницы входа. Затем,Мы можем изменить тестовый пример, чтобы использовать этот объект страницы.
# 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
Через страницу объекта шаблона,Мы можем отделить элементы страницы и действия от тестового кода.,Улучшена читаемость и ремонтопригодность кода. Любые изменения в структуре или элементах страницы можно обновить в классе объектов страницы.,без необходимости изменять тестовые примеры.
в реальном тестировании,Нам часто приходится использовать разные данные для тестирования,Например, разные имена пользователей、Пароль или другой ввод。тестирование на основе данных — это распространенный метод тестирования, который может управлять выполнением тестовых случаев через внешние источники данных. Давайте расширим наш пример, используя тестирование. на основе данные для проверки различных комбинаций имени пользователя и пароля.
# 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
предоставить параметры。Каждый элемент данных содержит имя пользователя、Пароль и ожидаемый результат (успех или неудача).
Теперь мы можем выполнить наш тестовый пример:
pytest test_login_data_driven.py
PyTestпобежитtest_login_data_driven.py
в файлеизтестовый пример,И используйте различные комбинации данных, предусмотренные для Выполнения тестов.
При автоматизированном тестировании очень важно создавать подробные отчеты о тестировании и записывать процесс выполнения теста. PyTest предоставляет богатую экосистему плагинов, которая позволяет легко создавать красивые отчеты о тестировании и записывать журналы выполнения тестов.
Сначала давайте установим несколько плагинов отчетов PyTest:
pip install pytest-html pytest-logger
Затем мы можем изменить наши тестовые примеры, чтобы генерировать отчеты о тестировании в формате HTML и записывать журналы выполнения.
# 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 и записывать журналы выполнения:
pytest --html=report.html --logger-level=INFO test_login_with_report.py
PyTestсгенерирует файл с именемreport.html
изHTMLотчет об испытаниях,И записывайте информацию журнала во время процесса выполнения.
В дополнение к простому тестированию входа на страницу мы также можем расширить тестовые сценарии, чтобы охватить больше функций и сценариев для расширения охвата тестирования. Например, мы можем протестировать регистрацию новых пользователей, функции забывания пароля и т. д. Давайте расширим наш пример и добавим тестовый пример для проверки функциональности регистрации новых пользователей.
# 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, а затем на примерах подробно рассказали, как объединить эти два инструмента для автоматического тестирования.
В примере мы рассмотрим следующее:
Объединив эти технологии и инструменты, мы можем легко писать, управлять и выполнять автоматизированные тесты, повышая эффективность тестирования, качество кода и стабильность программного обеспечения. В то же время эти методы также помогают лучше понять и применять технологию автоматического тестирования, повышая ценность разработки и тестирования программного обеспечения. Я надеюсь, что эта статья поможет читателям лучше применять технологию автоматического тестирования и повысить качество программного обеспечения и эффективность разработки.