Параметризация и покрытие тестами
Запускайте тесты с разными входными данными с помощью @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 — локальная установка не требуется.
Все уроки этого курса
- Написание первых тестов pytest
- Фикстуры и настройка/очистка
- Параметризация и покрытие тестами
- Имитация с помощью unittest.mock