Примеры автоматизированных тестов
Пройдите тест, узнайте какой профессии подходите
Для кого эта статья:
- Специалисты по тестированию ПО (QA) и автоматизации тестирования
- Студенты и начинающие инженеры, желающие освоить карьеру в области тестирования
Руководители проектов и команды разработки, заинтересованные в улучшении процессов тестирования и качества продукта
Автоматизированное тестирование давно перестало быть опцией и превратилось в необходимость для команд, стремящихся к высокому качеству продукта. Знание конкретных примеров автоматизированных тестов — это ключ к построению надежной стратегии проверки ПО. Рассмотрим реальные кейсы, которые трансформируют процесс тестирования из рутинного в высокотехнологичный, минимизируют человеческие ошибки и значительно сокращают время от обнаружения дефекта до его исправления. 🔍 Эффективность вашего тестирования напрямую зависит от выбранных инструментов и подходов.
Погружение в автоматизацию тестирования открывает новые горизонты для QA-специалистов. Хотите освоить полный спектр навыков инженера по тестированию и научиться создавать автоматизированные тесты любой сложности? Курс «Инженер по тестированию» с нуля от Skypro предлагает структурированную программу, где вы не только изучите теорию, но и создадите портфолио из реальных проектов под руководством опытных менторов. Курс включает все виды тестирования, от UI до производительности, с практикой на современных инструментах.
Типы и применение автоматизированных тестов в работе тестировщика
Автоматизированное тестирование — это комплекс методов, позволяющих программно имитировать действия пользователей или системных взаимодействий для проверки корректности работы приложения. Выбор типа теста зависит от задач и уровня тестирования. 🧪
Основные типы автоматизированных тестов, используемых в индустрии:
- Модульные (Unit) тесты — проверяют отдельные компоненты кода в изоляции
- Интеграционные тесты — тестируют взаимодействие между модулями
- UI-тесты — имитируют действия пользователя через интерфейс
- API-тесты — проверяют программные интерфейсы приложения
- Функциональные тесты — валидируют соответствие функциональным требованиям
- Нагрузочные тесты — измеряют производительность при различных нагрузках
- Регрессионные тесты — проверяют, не влияют ли новые изменения на существующую функциональность
Для эффективного внедрения автоматизации критично правильно подобрать инструменты и применить их в соответствующих сценариях.
Тип тестирования | Основные инструменты | Примеры применения |
---|---|---|
Unit-тестирование | JUnit, PyTest, Mocha | Валидация алгоритмов расчёта стоимости заказа |
UI-тестирование | Selenium, Cypress, Playwright | Проверка процесса регистрации пользователя |
API-тестирование | Postman, REST Assured, Karate | Проверка CRUD-операций в микросервисах |
Нагрузочное тестирование | JMeter, Gatling, k6 | Симуляция высокой активности пользователей в пиковые часы |
При выборе автоматизированного подхода важно оценивать ROI (Return on Investment). Некоторые процессы экономически нецелесообразно автоматизировать — например, тесты с частыми изменениями требований или однократные проверки.
Алексей Смирнов, Lead QA Engineer
В компании, разрабатывающей финтех-решения, мы столкнулись с серьезной проблемой — каждое обновление требовало недельного цикла ручного регрессионного тестирования. Это создавало существенную задержку релизов и недовольство бизнеса.
Мы начали с автоматизации критичных бизнес-процессов — создания счетов, авторизации, проведения платежей. Для UI использовали Selenium WebDriver с Python, для API-тестов выбрали pytest с библиотекой requests. Критически важные компоненты покрыли модульными тестами с помощью unittest.
Через три месяца регрессионный прогон сократился с недели до 3 часов. Ключевым фактором успеха стала правильная приоритизация — мы начали с тестов, которые приносили максимальную выгоду при минимальных усилиях на поддержку.

Эффективные UI-тесты: от базовых до комплексных решений
UI-тестирование — один из самых наглядных видов автоматизации, имитирующий действия реальных пользователей. Тесты пользовательского интерфейса могут варьироваться от простейших проверок элементов до сложных сценариев, охватывающих целые бизнес-процессы. 🖥️
Базовый пример UI-теста на Python с использованием Selenium для проверки логина:
from selenium import webdriver
from selenium.webdriver.common.by import By
def test_login():
# Инициализация драйвера
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# Ввод данных в форму
driver.find_element(By.ID, "username").send_keys("test_user")
driver.find_element(By.ID, "password").send_keys("secure_password")
driver.find_element(By.ID, "login-button").click()
# Проверка успешного входа
welcome_message = driver.find_element(By.ID, "welcome-header").text
assert "Welcome, test_user" in welcome_message
driver.quit()
Для более комплексных UI-тестов часто применяют паттерн Page Object Model (POM), который позволяет создать абстракцию между тестами и конкретными деталями интерфейса:
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username_field = (By.ID, "username")
self.password_field = (By.ID, "password")
self.login_button = (By.ID, "login-button")
def open(self):
self.driver.get("https://example.com/login")
return self
def enter_credentials(self, username, password):
self.driver.find_element(*self.username_field).send_keys(username)
self.driver.find_element(*self.password_field).send_keys(password)
return self
def click_login(self):
self.driver.find_element(*self.login_button).click()
return DashboardPage(self.driver)
# Использование в тесте
def test_login_pom():
driver = webdriver.Chrome()
login_page = LoginPage(driver).open()
dashboard = login_page.enter_credentials("test_user", "secure_password").click_login()
assert dashboard.is_loaded()
driver.quit()
Ключевые рекомендации для создания устойчивых UI-тестов:
- Используйте стабильные селекторы (ID, data-атрибуты) вместо XPath по тексту или позиции
- Внедрите явные ожидания элементов с разумными таймаутами
- Применяйте паттерн Page Object Model для отделения логики тестов от деталей интерфейса
- Делайте тесты независимыми друг от друга, с собственной инициализацией и очисткой
- Используйте снимки экрана и видеозапись сессий для отладки сбоев
Современные фреймворки вроде Cypress, Playwright или Puppeteer предлагают более надежные решения в сравнении с классическим Selenium за счет встроенной автоматической синхронизации и полного контроля над браузером.
API-тестирование: ключевые методики и инструменты
API-тестирование представляет собой выверенный баланс между скоростью выполнения тестов и ценностью выявляемых дефектов. В отличие от UI-тестов, API-тесты исключают нестабильность интерфейса и выполняются значительно быстрее, что позволяет получать мгновенную обратную связь о качестве сервисов. 🔌
Рассмотрим практический пример API-теста с использованием Python и библиотеки requests:
import requests
import pytest
base_url = "https://api.example.com/v1"
auth_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
def test_get_user_details():
# Настройка заголовков с авторизацией
headers = {
"Authorization": f"Bearer {auth_token}",
"Content-Type": "application/json"
}
# Выполнение запроса
response = requests.get(
f"{base_url}/users/123",
headers=headers
)
# Проверка результатов
assert response.status_code == 200
data = response.json()
assert data["id"] == 123
assert "email" in data
assert "name" in data
Для более сложного тестирования с помощью инструмента Postman используется коллекция тестов, которую можно запускать как через GUI, так и через Newman в CI/CD:
// Фрагмент Postman-теста для проверки создания нового пользователя
pm.test("Status code is 201", function() {
pm.response.to.have.status(201);
});
pm.test("Response includes user id", function() {
var jsonData = pm.response.json();
pm.expect(jsonData.id).to.exist;
pm.globals.set("userId", jsonData.id);
});
pm.test("Email validation passed", function() {
var jsonData = pm.response.json();
pm.expect(jsonData.email).to.match(/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/);
});
Мария Ковалева, QA Automation Lead
В проекте по переработке монолитного приложения в микросервисную архитектуру мы столкнулись с проблемой: после разделения системы обнаружились десятки интеграционных ошибок, невидимых на уровне отдельных сервисов.
Решение пришло в виде комплексной стратегии API-тестирования. Мы создали набор контрактных тестов с помощью PACT, проверяющих соответствие ожиданий потребителей и провайдеров. Затем разработали автоматизированные сценарии с использованием Karate DSL, имитирующие пользовательские пути в системе, но на уровне API.
Критический момент: мы внедрили API-тесты в CI/CD-пайплайн. Каждая сборка проверялась на API-уровне до деплоя, и при обнаружении регрессий автоматически блокировалась. За шесть месяцев количество блокирующих интеграционных дефектов снизилось на 87%, а время обнаружения проблем сократилось с дней до минут.
Структурный элемент API-теста | Примеры реализации | Что проверяет |
---|---|---|
Статус-код | assert response.status_code == 200 | Успешность выполнения операции |
Схема ответа | jsonschema.validate(response.json(), schema) | Структурную корректность данных |
Бизнес-логика | assert data["total"] == sum(item["price"] for item in data["items"]) | Корректность вычислений и преобразований |
Производительность | assert response.elapsed.total_seconds() < 0.3 | Время ответа сервера |
При проектировании API-тестов следует придерживаться следующих принципов:
- Изолируйте тестовые среды и данные для предотвращения побочных эффектов
- Используйте контрактное тестирование для валидации интерфейсов между сервисами
- Стройте цепочки тестов, имитирующие реальные бизнес-процессы
- Внедряйте мониторинг API на промышленных средах для раннего обнаружения проблем
Правильное сочетание модульных, API и UI-тестов формирует тестовую пирамиду, где основная масса проверок сосредоточена на быстрых и стабильных уровнях.
Задумываетесь о карьере в IT, но не уверены, подойдет ли вам роль тестировщика автоматизатора? Профессиональная диагностика поможет определить, совпадают ли ваши навыки и склонности с требованиями этой специальности. Пройдите Тест на профориентацию от Skypro — это бесплатный инструмент, который проанализирует ваши технические и аналитические способности, поможет понять, насколько вам подойдет работа с автоматизированными тестами и какие инструменты стоит изучить в первую очередь.
Интеграционное и модульное тестирование для тестировщиков
Интеграционное и модульное тестирование формируют фундамент пирамиды тестирования, обеспечивая раннее обнаружение дефектов непосредственно в процессе разработки. Несмотря на то, что эти виды тестирования традиционно считаются прерогативой разработчиков, тестировщики могут существенно повысить эффективность процесса, участвуя в их создании и поддержке. 🔄
Рассмотрим пример модульного теста на Python с использованием pytest для проверки функции расчета скидки:
# Тестируемая функция
def calculate_discount(price, user_tier):
discount_rates = {
"bronze": 0.05, # 5%
"silver": 0.10, # 10%
"gold": 0.15, # 15%
"platinum": 0.20 # 20%
}
if user_tier not in discount_rates:
return price # Нет скидки для неизвестного уровня
discount = price * discount_rates[user_tier]
return price – discount
# Модульный тест
def test_calculate_discount():
# Тестирование разных уровней пользователей
assert calculate_discount(100, "bronze") == 95
assert calculate_discount(100, "silver") == 90
assert calculate_discount(100, "gold") == 85
assert calculate_discount(100, "platinum") == 80
# Граничные случаи
assert calculate_discount(0, "gold") == 0 # Нулевая цена
assert calculate_discount(100, "unknown") == 100 # Неизвестный уровень
Интеграционное тестирование фокусируется на проверке взаимодействия между компонентами. Пример интеграционного теста, проверяющего работу сервиса и репозитория:
# Интеграционный тест с использованием pytest и mock
def test_order_creation_integration(mocker):
# Создаем мок для базы данных
mock_db = mocker.patch('app.database.Database')
mock_db.return_value.save_order.return_value = 12345 # ID созданного заказа
# Инициализируем тестируемые компоненты с зависимостями
product_repo = ProductRepository(mock_db)
order_service = OrderService(product_repo)
# Выполняем тестовый сценарий
order_id = order_service.create_order(
user_id=789,
items=[{"product_id": 1, "quantity": 2}, {"product_id": 3, "quantity": 1}]
)
# Проверяем взаимодействие между сервисами
assert order_id == 12345
mock_db.return_value.save_order.assert_called_once()
assert mock_db.return_value.update_inventory.call_count == 2
Ключевые практики для эффективного модульного и интеграционного тестирования:
- Используйте TDD (Test-Driven Development) при создании критичной функциональности
- Внедряйте мок-объекты для изоляции тестируемых компонентов от внешних зависимостей
- Создавайте тестовые фикстуры для обеспечения воспроизводимости тестовой среды
- Применяйте параметризацию для проверки разных сценариев с минимальным дублированием кода
- Используйте coverage-инструменты для контроля полноты тестового покрытия
Важно помнить, что тестировщик, работающий с модульными и интеграционными тестами, должен обладать хорошим пониманием архитектуры системы и навыками программирования на уровне, близком к разработчикам. Это позволяет создавать релевантные тесты, выявляющие не только очевидные, но и граничные случаи.
Нагрузочные и системные тесты: сложный уровень автоматизации
Нагрузочное тестирование и комплексные системные проверки представляют собой верхушку пирамиды автоматизации, требующую не только технической экспертизы, но и понимания бизнес-контекста и инфраструктуры. Эти типы тестов выявляют проблемы, которые невозможно обнаружить на уровне отдельных компонентов или функций. 📊
Пример скрипта нагрузочного тестирования на JMeter:
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="E-Commerce Load Test">
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments">
<collectionProp name="Arguments.arguments"/>
</elementProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="User Scenario">
<stringProp name="ThreadGroup.num_threads">1000</stringProp>
<stringProp name="ThreadGroup.ramp_time">120</stringProp>
<boolProp name="ThreadGroup.scheduler">true</boolProp>
<stringProp name="ThreadGroup.duration">600</stringProp>
</ThreadGroup>
<hashTree>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Browse Homepage">
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.path">/</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
</HTTPSamplerProxy>
<hashTree/>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Search Products">
<stringProp name="HTTPSampler.domain">example.com</stringProp>
<stringProp name="HTTPSampler.path">/search</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<elementProp name="HTTPsampler.Arguments" elementType="Arguments">
<collectionProp name="Arguments.arguments">
<elementProp name="q" elementType="HTTPArgument">
<stringProp name="Argument.name">q</stringProp>
<stringProp name="Argument.value">smartphone</stringProp>
</elementProp>
</collectionProp>
</elementProp>
</HTTPSamplerProxy>
<hashTree/>
<!-- Дополнительные запросы в пользовательском сценарии -->
</hashTree>
<ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report"/>
<hashTree/>
</hashTree>
</hashTree>
</jmeterTestPlan>
Основные виды нагрузочного тестирования включают:
- Стресс-тестирование — определение предельной нагрузки, при которой система выходит из строя
- Тестирование производительности — измерение времени отклика при стандартной нагрузке
- Тестирование масштабируемости — проверка способности системы адаптироваться к возрастающей нагрузке
- Тестирование выносливости (soak testing) — проверка стабильности при длительной работе
- Тестирование всплесков (spike testing) — моделирование резких скачков нагрузки
Инструмент | Тип тестирования | Преимущества | Ограничения |
---|---|---|---|
JMeter | Нагрузочное, производительность | Бесплатный, кроссплатформенный, обширные плагины | Высокое потребление ресурсов при больших нагрузках |
Gatling | Нагрузочное, стресс-тестирование | Высокая производительность, DSL на Scala | Крутая кривая обучения для непрограммистов |
k6 | Производительность, масштабируемость | JavaScript API, интеграция с CI/CD | Ограниченная поддержка протоколов кроме HTTP |
Locust | Масштабируемое нагрузочное | Python-скрипты, распределенное тестирование | Меньше готовых интеграций, чем у конкурентов |
Системное тестирование объединяет все компоненты приложения и проверяет их совместную работу в условиях, приближенных к реальным. Пример автоматизированного системного теста с использованием Pytest и Selenium для проверки полного процесса заказа в интернет-магазине:
@pytest.mark.system
def test_complete_purchase_flow(setup_browser, generate_test_user):
# Подготовка тестовой среды
driver = setup_browser
user = generate_test_user
# Последовательность действий пользователя
login_page = LoginPage(driver).open()
home_page = login_page.login(user["email"], user["password"])
# Поиск и выбор товара
search_results = home_page.search_for("laptop")
product_page = search_results.select_product(0) # Выбираем первый из результатов
# Добавление в корзину и оформление
cart_page = product_page.add_to_cart().go_to_cart()
checkout_page = cart_page.proceed_to_checkout()
# Ввод платежных данных
payment_page = checkout_page.fill_shipping_info(
address=user["address"],
city=user["city"],
zip_code=user["zip"]
).continue_to_payment()
order_confirmation = payment_page.enter_card_details(
card_number="4111111111111111", # Тестовый номер карты
expiry="12/25",
cvv="123"
).submit_payment()
# Проверка результатов
assert order_confirmation.is_success_message_displayed()
order_id = order_confirmation.get_order_id()
# Дополнительная проверка через API (интеграция с бэкендом)
order_api = OrderAPI(user["token"])
order_details = order_api.get_order(order_id)
assert order_details["status"] == "PAID"
assert len(order_details["items"]) == 1
Рекомендации по организации нагрузочного и системного тестирования:
- Создавайте реалистичные профили нагрузки на основе данных о реальном использовании
- Проводите тестирование на инфраструктуре, максимально приближенной к промышленной
- Устанавливайте четкие критерии успешности по метрикам (отклик, пропускная способность)
- Используйте мониторинг для выявления узких мест в системе во время тестов
- Автоматизируйте анализ результатов для быстрого выявления деградации производительности
Автоматизация тестирования — это итеративный процесс, требующий постоянного улучшения и адаптации. От модульных тестов до сложных системных проверок, каждый слой тестирования вносит свой вклад в общее качество продукта. Правильно выбранные инструменты и стратегии позволяют создать надежную систему автоматизации, которая не только находит дефекты на ранних стадиях, но и служит своеобразной документацией поведения системы. Помните, что эффективная автоматизация не заменяет ручное тестирование, а дополняет его, позволяя сконцентрировать усилия человека на исследовательских и творческих аспектах обеспечения качества.