0Pricing
Python Academy · Урок

Параметризация и покрытие тестами

Запускайте тесты с разными входными данными с помощью @pytest.mark.parametrize.

«Параметризация и покрытие тестами» — бесплатный урок Python Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

@pytest.mark.parametrize

Запускайте один и тот же тест с несколькими входными данными с помощью @pytest.mark.parametrize. Каждый кортеж представляет собой отдельный тестовый случай.

import pytest

@pytest.mark.parametrize("a,b,expected", [
    (1, 2, 3),
    (0, 0, 0),
    (-1, 1, 0),
    (10, -5, 5),
])
def test_add(a, b, expected):
    assert a + b == expected

Один параметр

Для одного аргумента передайте список значений напрямую.

import pytest

@pytest.mark.parametrize("n", [1, 2, 3, 4, 5])
def test_positive(n):
    assert n > 0

Именованные идентификаторы тестов

Передайте список ids, чтобы присвоить каждому набору параметров имя и сделать вывод понятнее.

import pytest

@pytest.mark.parametrize("value,result", [
    (2, True),
    (3, False),
], ids=["even", "odd"])
def test_is_even(value, result):
    assert (value % 2 == 0) == result

Объединение декораторов parametrize

Объедините два декоратора parametrize, чтобы получить декартово произведение входных данных.

import pytest

@pytest.mark.parametrize("x", [1, 2])
@pytest.mark.parametrize("y", [10, 20])
def test_product(x, y):
    assert x * y > 0   # 4 test cases: (1,10),(1,20),(2,10),(2,20)

pytest-cov: установка

Установите pytest-cov, чтобы измерять, какие строки вашего кода выполняются в тестах.

# pip install pytest-cov

# Basic usage:
# pytest --cov=mypackage

# HTML report:
# pytest --cov=mypackage --cov-report=html

Чтение вывода о покрытии

Покрытие показывает, какие строки, ветви или инструкции не были достигнуты во время тестирования.

# Name          Stmts   Miss  Cover
# -------       -----   ----  -----
# mypackage/utils.py  20       3    85%
#
# Missing: lines 45, 67, 88

Покрытие ветвей

Используйте --cov-branch, чтобы отслеживать, проверяются ли обе ветви условных конструкций.

# pytest --cov=mypackage --cov-branch

def is_positive(n):
    if n > 0:        # branch 1: True
        return True
    return False     # branch 2: False

Сбой при низком покрытии

Используйте --cov-fail-under=N, чтобы сборка завершалась с ошибкой, если покрытие опускается ниже N процентов.

# pytest --cov=mypackage --cov-fail-under=80
# FAIL Required test coverage of 80% not reached. Total: 72%

Конфигурация .coveragerc

Настройте исключения из покрытия в .coveragerc, чтобы пропускать шаблонный код.

# .coveragerc
[run]
omit =
    */migrations/*
    */tests/*
    setup.py

[report]
exclude_lines =
    pragma: no cover
    if TYPE_CHECKING:

Что означает хорошее покрытие

Высокое покрытие не гарантирует правильность тестов. Стремитесь к содержательным проверкам, а не просто к выполнению строк. Для большинства проектов практичной целью является покрытие 80–90%.

# A covered but useless test:
def test_nothing():
    is_positive(5)   # no assert — 100% coverage, zero confidence

# A meaningful test:
def test_positive():
    assert is_positive(5) is True
    assert is_positive(-1) is False

Объединение параметризации и покрытия

Параметризованные тесты естественным образом повышают покрытие, проверяя несколько путей выполнения с помощью одного определения теста.

import pytest

@pytest.mark.parametrize("n,expected", [
    (5, True), (-1, False), (0, False)
])
def test_is_positive(n, expected):
    assert is_positive(n) == expected

Проверка

Что делает --cov-fail-under=90 при запуске pytest?

Итоги

Используйте @pytest.mark.parametrize, чтобы удобно проверять несколько входных данных. Измеряйте покрытие кода с помощью pytest-cov, отслеживайте ветви с помощью --cov-branch и задавайте минимальный уровень с помощью --cov-fail-under.

Часто задаваемые вопросы

Урок «Параметризация и покрытие тестами» бесплатный?

Да — полный текст урока «Параметризация и покрытие тестами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Параметризация и покрытие тестами»?

Запускайте тесты с разными входными данными с помощью @pytest.mark.parametrize. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Параметризация и покрытие тестами»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Написание первых тестов pytest
  2. Фикстуры и настройка/очистка
  3. Параметризация и покрытие тестами
  4. Имитация с помощью unittest.mock
← Назад к Python Academy