📖 Теория: 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.IDBy.ID, "username"Есть уникальный id — всегда предпочтительно
By.CLASS_NAMEBy.CLASS_NAME, "btn-primary"Уникальный класс
By.CSS_SELECTORBy.CSS_SELECTOR, "form#login input"Сложные условия через CSS
By.XPATHBy.XPATH, "//button[text()='Login']"Нет id/class, нужна навигация по дереву
By.NAMEBy.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 (для навигации в коде)Метод
Важно из лекции: 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
Windows PowerShell: В Windows вместо run.sh используйте файл run.ps1 с PowerShell-синтаксисом, или запускайте команды по одной в терминале.

Сводная таблица курса Auto QA

БлокУрокиКлючевые инструменты
Основы и Unit01–02unittest, pytest, assert, fixture, parametrize
Selenium — введение03–04webdriver.Chrome(), find_element(), By, click/send_keys
Локаторы05–06By.ID, By.CSS_SELECTOR, By.XPATH, By.CLASS_NAME
Selenium advanced07–10WebDriverWait, EC, Alert, ActionChains, iframe, вкладки
Page Object Model11–12BasePage, BaseTest, scope="class", методы страниц
API: Requests13–14requests.get/post/patch/delete, Response, json(), CompanyApi
API: Allure15–16allure-pytest, @allure.step, allure.attach(), allure serve