📖 Теория: Summary session 8 — Итог курса Auto QA
⚡ Весь курс Auto QA за 3 минуты
Курс: unit-тесты → Selenium → POM → Requests API → Allure.
- Unit-тесты:
pytest,assert,@pytest.fixture,@pytest.mark.parametrize - Selenium:
webdriver.Chrome(),find_element(By.X, "..."),WebDriverWait,EC - POM: классы-страницы,
BasePage,BaseTest,scope="class" - Requests:
requests.get/post/patch/delete(),resp.status_code,resp.json() - Allure:
@allure.feature/story/title,with allure.step(),allure.attach()
Блок 1: Основы автоматизированного тестирования
Из лекции (экспресс-опрос): автоматизация тестирования — процесс написания и использования скриптов для автоматической проверки ПО. Цели: ускорение тестирования, уменьшение рутины, повышение стабильности.
| Преимущества | Недостатки |
|---|---|
| Высокая скорость выполнения | Сложность поддержки тестов |
| Повторяемость без ошибок | Высокая начальная стоимость |
| Уменьшение человеческого фактора | Ограниченная способность находить UI-ошибки |
| Возможность ночного запуска | Требует навыков программирования |
Пирамида тестирования (из лекции)
- Unit-тесты — наиболее быстрые, покрывают отдельные функции/модули
- Интеграционные тесты — проверяют взаимодействие компонентов
- UI-тесты (E2E) — самые дорогие в обслуживании, тестируют приложение с точки зрения пользователя
Блок 2: Selenium WebDriver (из лекции)
Selenium — инструмент для автоматизации тестирования веб-приложений. Управляет браузером, имитируя действия пользователя, через WebDriver.
Компоненты Selenium (из лекции)
- Selenium WebDriver — основная библиотека для управления браузером
- Selenium Grid — параллельный запуск тестов на нескольких машинах
- Selenium IDE — плагин для записи и воспроизведения тестов
Локаторы (из лекции)
| Локатор | Пример | Когда использовать |
|---|---|---|
By.ID | By.ID, "username" | Есть уникальный id — всегда предпочтительно |
By.CLASS_NAME | By.CLASS_NAME, "btn-primary" | Уникальный класс |
By.CSS_SELECTOR | By.CSS_SELECTOR, "form#login input" | Сложные условия через CSS |
By.XPATH | By.XPATH, "//button[text()='Login']" | Нет id/class, нужна навигация по дереву |
By.NAME | By.NAME, "q" | Элементы форм с атрибутом name |
Блок 3: Page Object Model
POM — паттерн проектирования, где каждая страница (или компонент) представлена отдельным классом. Тесты работают с методами страниц, а не с локаторами напрямую.
- BasePage — базовый класс с общими методами (клик, ввод, ожидание)
- BaseTest — базовый класс для тестов, управляет жизненным циклом драйвера
scope="class"— фикстура создаётся один раз на класс (не на каждый тест)
Блок 4: Requests и API-тестирование
Из лекции: тестирование HTTP API через библиотеку requests. Проверяем: статус-коды, тело ответа, заголовки.
# test_api.py
import requests
BASE_URL = "https://x-clients-be.onrender.com"
def test_get_companies():
resp = requests.get(BASE_URL + "/company")
assert resp.status_code == 200
companies = resp.json()
assert isinstance(companies, list)
Блок 5: Allure Framework (из лекции)
Из лекции: Allure — инструмент с открытым исходным кодом для генерации интерактивных и наглядных отчётов по результатам автоматизированного тестирования.
Основные возможности Allure (из лекции)
- Визуализация результатов — интерактивные диаграммы, цветовая индикация статусов (успешно, неуспешно, пропущено)
- Детализация результатов — просмотр логов, скриншотов, вложений; подробные шаги выполнения
- Категоризация и маркировка — группировка тестов по фичам, историям, эпикам, пользовательским меткам
- История запусков — сравнение текущего и предыдущих запусков, динамика изменений
Применение Allure с pytest (из лекции)
# Шаг 1: Установка
pip install pytest allure-pytest
# Шаг 2: Запуск тестов с генерацией данных для отчёта
pytest --alluredir=allure-results
# Шаг 3: Просмотр отчёта (запуск веб-сервера)
allure serve allure-results
# Генерация статического HTML-отчёта
allure generate allure-results -o allure-report --clean
# Открытие готового отчёта
allure open allure-report
Признаки (декораторы) для разметки тестов (из лекции)
| Декоратор | Назначение | Уровень |
|---|---|---|
@allure.epic | Принадлежность к проекту/модулю | Класс или метод |
@allure.feature | Функциональная группа (READ, CREATE, UPDATE) | Метод |
@allure.story | Конкретная история/сценарий | Метод |
@allure.title | Читаемое название теста | Метод |
@allure.description | Подробное описание теста | Метод |
@allure.severity | Критичность: blocker, critical, normal, minor, trivial | Класс или метод |
@allure.id | Уникальный ID (для навигации в коде) | Метод |
@allure.id) не отображаются непосредственно в отчётах Allure — они используются исключительно для удобства чтения и навигации в коде. Общие для группы тестов декораторы (@allure.epic, @allure.severity) рекомендуется выносить на уровень класса.
Шаги в Allure (из лекции)
Из лекции: анализировать сложные тесты трудно — не всегда очевидно, на каком этапе возникла ошибка. Шаги делают тест прозрачным.
# test_companies.py
import allure
def test_get_companies():
with allure.step("Получить список компаний через API"):
api_result = api.get_company_list()
with allure.step("Получить список компаний из БД"):
db_result = db.get_companies()
with allure.step("Сравнить размеры двух списков"):
assert len(api_result) == len(db_result)
Вложенные шаги (из лекции)
# test_companies.py
def test_add_new():
with allure.step("Получить количество организаций ДО"):
len_before = len(api.get_company_list())
with allure.step("Создать организацию"):
with allure.step("Сгенерировать название"):
name = "Autotest"
with allure.step("Вызвать API-метод для создания"):
result = api.create_company(name)
new_id = result["id"]
with allure.step("Получить количество организаций ПОСЛЕ"):
len_after = len(api.get_company_list())
with allure.step("Проверить, что список ДО меньше ПОСЛЕ на 1"):
assert len_after - len_before == 1
Оптимизация: @allure.step на методах класса (из лекции)
Из лекции: декорировать сами методы API- и БД-классов через @allure.step. Тогда при вызове методов в тестах отдельные with allure.step() прописывать не нужно.
# company_api.py
import allure
import requests
class CompanyApi:
def __init__(self, url):
self.url = url
@allure.step("api. Получить список компаний")
def get_company_list(self, params_to_add=None):
# Allure автоматически отображает вызов с параметрами
...
@allure.step("api. Получить токен авторизации пользователя '{user}'")
def get_token(self, user="raphael", password="cool-but-crude"):
# {user} подставится автоматически из аргумента
...
Вложения в отчёт (из лекции)
Из лекции: метод allure.attach(content, title, type) позволяет прикреплять SQL-запросы, скриншоты, тексты к шагам отчёта.
# company_table.py
import allure
from sqlalchemy import create_engine
from sqlalchemy.sql import text
class CompanyTable:
@allure.step("БД. Запросить список организаций")
def get_companies(self):
query = self.__db.execute(self.__scripts["select"])
# Прикрепляем SQL-запрос к отчёту
allure.attach(
str(query.context.cursor.query),
"SQL-запрос на получение списка компаний",
allure.attachment_type.TEXT
)
return query.fetchall()
Автоматизация генерации отчёта (из лекции)
Из лекции: для удобства можно автоматизировать запуск тестов и создание отчёта через run.sh.
# run.sh
#!/bin/bash
results="allure-results"
report="allure-report"
# Очистить предыдущие результаты
rm -rf $results
rm -rf $report
# Запустить тесты
pytest --alluredir=$results
# Сгенерировать HTML-отчёт
allure generate $results -o $report --clean
# Открыть отчёт в браузере
allure open $report
run.sh используйте файл run.ps1 с PowerShell-синтаксисом, или запускайте команды по одной в терминале.
Сводная таблица курса Auto QA
| Блок | Уроки | Ключевые инструменты |
|---|---|---|
| Основы и Unit | 01–02 | unittest, pytest, assert, fixture, parametrize |
| Selenium — введение | 03–04 | webdriver.Chrome(), find_element(), By, click/send_keys |
| Локаторы | 05–06 | By.ID, By.CSS_SELECTOR, By.XPATH, By.CLASS_NAME |
| Selenium advanced | 07–10 | WebDriverWait, EC, Alert, ActionChains, iframe, вкладки |
| Page Object Model | 11–12 | BasePage, BaseTest, scope="class", методы страниц |
| API: Requests | 13–14 | requests.get/post/patch/delete, Response, json(), CompanyApi |
| API: Allure | 15–16 | allure-pytest, @allure.step, allure.attach(), allure serve |