📖 Теория: конспект урока 01 (повторение)

🎯 Итоговое повторение блока «Основы и Unit»

⚡ Краткий конспект

  • Auto QA — автоматизация повторяющихся тестов: ускорение, точность, CI/CD.
  • Тестирование ПО — проверка соответствия реального и ожидаемого поведения.
  • Пирамида: Unit (быстрые, изолированные) → Integration → E2E (дорогие).
  • Calculator: sum, sub, mul, div (с ArithmeticError на 0), pow, avg.
  • pytest: файлы test_*.py, функции test_*, фикстура @pytest.fixture.
  • Маркировки: @pytest.mark.skip, skipif, xfail, пользовательские.
  • Параметризация: @pytest.mark.parametrize('a,b,res', [(1,2,3), ...]).

Auto QA — что это и зачем

Автоматизированное тестирование (Auto QA) — использование инструментов и скриптов для выполнения тестов с минимальным участием человека.

Применение Auto QA

  • Автоматизация повторяющихся тестов для повышения эффективности и точности.
  • Снижение времени на тестирование и выявление дефектов.
  • Интеграция в процесс CI/CD: тесты запускаются автоматически при каждом коммите.

Пример из практики

Компания хочет ускорить тестирование веб-приложения. QA-инженеры создают автоматизированные тесты с Selenium для проверки основных функций. Тесты интегрируются в CI/CD и выполняются автоматически при каждом коммите. Результат: процесс тестирования ускорен, количество дефектов в продакшне значительно сокращено.

Выгода от автоматизации

ВыгодаПояснение
СкоростьТесты выполняются в разы быстрее ручных проверок
ПовторяемостьОдинаковый результат при каждом запуске
МасштабируемостьЛегко добавить новые тест-кейсы
ТочностьИсключён человеческий фактор
Снижение затратЭкономия на долгосрочных проектах

Тестирование программного обеспечения

Тестирование ПО — проверка соответствия между реальным и ожидаемым поведением программы, выполняемая на определённом наборе тестов, который подбирается осмысленно и целенаправленно.

Ключевые аспекты

  • Не просто поиск багов — тестирование проверяет, выполняет ли программа свои функции.
  • Проверка ожиданий — важно знать, что должна делать программа.
  • Процесс — систематическая деятельность, а не разовая акция.
Аналогия: тестируете карандаш — не просто ищете сломанный грифель, но проверяете, пишет ли он, стирается ли ластиком, как долго хватает ресурса. Если пишет слишком бледно — это тоже отклонение от ожиданий.

Пирамида тестирования

Пирамида тестирования — концепция, помогающая эффективно распределить усилия на разные уровни тестирования.

УровеньЧто проверяетСкоростьСтоимостьПример
Unit Tests Отдельные модули/функции в изоляции Быстро Дёшево Функция расчёта суммы в корзине
Integration Tests Взаимодействие между компонентами Медленнее Дороже Связь фронтенда и API
E2E Tests Систему целиком (включая UI) Медленно Дорого Сценарий оформления заказа на сайте

Принципы пирамиды

  • Больше unit-тестов, меньше integration, ещё меньше E2E.
  • Фокус на автоматизации нижних уровней для ускорения разработки.
  • Оптимизация затрат за счёт снижения числа сложных и дорогих тестов верхнего уровня.
Аналогия: строительство дома. Unit-тесты — проверка каждого кирпича, Integration-тесты — прочность стен, E2E-тесты — финальная проверка всего дома (двери, окна, инженерные системы).

Класс Calculator — объект тестирования

В лекции использовался класс Calculator как практический объект для написания тестов.

# calculator.py
class Calculator:
    def sum(self, a, b):
        return a + b

    def sub(self, a, b):
        return a - b

    def mul(self, a, b):
        return a * b

    def div(self, a, b):
        if b == 0:
            raise ArithmeticError("На ноль делить нельзя")
        return a / b

    def pow(self, a, b=2):
        return a ** b

    def avg(self, nums):
        if len(nums) == 0:
            return 0
        s = sum(nums)
        return self.div(s, len(nums))

pytest — современный фреймворк тестирования

pytest — популярная библиотека для тестирования Python-кода. Проста в использовании, поддерживает автоматический запуск тестов и генерацию отчётов.

Установка и соглашения

pip install pytest
  • Файлы: имена начинаются с test_ или заканчиваются на _test.
  • Функции: имена начинаются с test_.
  • Фикстуры: функции с декоратором @pytest.fixture.

Фикстуры

Фикстуры позволяют задавать общие настройки и ресурсы для тестов (например, экземпляр класса Calculator):

# test_calculator.py
import pytest
from calculator import Calculator

@pytest.fixture
def calculator():
    return Calculator()

def test_sum_positive_numbers(calculator):
    assert calculator.sum(4, 5) == 9

def test_sum_negative_numbers(calculator):
    assert calculator.sum(-6, -10) == -16

Преимущества pytest перед ручным assert

  • Простота и лаконичность — тесты легко писать и читать.
  • Гибкость фикстур — общие настройки вынесены в одно место.
  • Обработка исключенийpytest.raises() проверяет ожидаемые ошибки.
  • Подробные отчёты — включают причины провалов.

Маркировки тестов в pytest

Маркировки позволяют управлять выполнением тестов — пропускать, группировать, помечать как ожидаемо провальные.

МаркерНазначение
@pytest.mark.skipБезусловный пропуск теста
@pytest.mark.skipif(condition, reason=...)Условный пропуск
@pytest.mark.xfailТест ожидаемо провалится
Пользовательский маркерГруппировка тестов по категории

Запуск по маркеру

pytest -m positive_test

Выборочный запуск по ключевому слову

pytest -k "sum"

Параметризация тестов

Параметризация — техника, позволяющая запускать один и тот же тест с различными наборами входных данных. Уменьшает дублирование кода.

# test_calculator.py
import pytest
from calculator import Calculator

@pytest.mark.parametrize('num1, num2, result', [
    (4, 5, 9),
    (-6, -10, -16),
    (-6, 6, 0),
    (5.61, 4.29, 9.9),
    (10, 0, 10)
])
def test_sum(num1, num2, result):
    calculator = Calculator()
    res = calculator.sum(num1, num2)
    assert res == result

Преимущества параметризации

  • Один тест вместо нескольких — экономия кода.
  • Легко добавлять новые наборы параметров.
  • Тесты компактны и читаемы.
Совет: Попробуйте изменить один из параметров на некорректное значение и запустите pytest -v — вы увидите, как pytest подробно отобразит ошибку по конкретному набору данных.