0Pricing
Python Academy · Урок

Написание первых тестов pytest

Разберитесь в обнаружении тестов, операторах assert и структуре тестов.

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

Установка pytest

Установите pytest с помощью pip. Обязательная конфигурация не требуется — он автоматически обнаруживает тесты.

# pip install pytest

# Run all tests
# pytest

# Run a specific file
# pytest test_math.py

Простая функция тестирования

pytest собирает любую функцию, имя которой начинается с test_. Используйте обычные операторы assert — pytest преобразует их, чтобы выводить подробные сведения.

# test_math.py
def add(a, b):
    return a + b

def test_add():
    assert add(2, 3) == 5

def test_add_negative():
    assert add(-1, 1) == 0

Файлы тестов и обнаружение

pytest обнаруживает файлы тестов с именами test_*.py или *_test.py, а также собирает функции с именами test_* и классы с именами Test*.

tests/
    test_utils.py
    test_models.py
    conftest.py   # shared fixtures

Группировка тестов в классах

Группируйте связанные тесты в классе с префиксом Test. unittest.TestCase не требуется.

class TestCalculator:
    def test_add(self):
        assert 1 + 1 == 2

    def test_multiply(self):
        assert 3 * 4 == 12

Тестирование исключений

Используйте pytest.raises как менеджер контекста, чтобы проверить вызов определённых исключений.

import pytest

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError("cannot divide by zero")
    return a / b

def test_divide_by_zero():
    with pytest.raises(ZeroDivisionError, match="cannot divide"):
        divide(10, 0)

Флаг -v

Запускайте pytest с -v (подробный режим), чтобы видеть имя каждого теста и его статус: пройден или не пройден.

# pytest -v
# test_math.py::test_add PASSED
# test_math.py::test_add_negative PASSED

# Show print output too:
# pytest -v -s

Пропуск тестов

Используйте @pytest.mark.skip или @pytest.mark.skipif, чтобы условно пропускать тесты.

import pytest, sys

@pytest.mark.skip(reason="not implemented yet")
def test_future_feature():
    assert False

@pytest.mark.skipif(sys.platform == "win32", reason="Unix only")
def test_unix_only():
    assert True

Пометка тестов как ожидаемо неуспешных

@pytest.mark.xfail отмечает тест, который, как ожидается, завершится неудачей. Если он завершается неудачей, тест считается пройденным; если неожиданно проходит, pytest выдаёт предупреждение.

import pytest

@pytest.mark.xfail(reason="known bug #42")
def test_buggy():
    assert 1 == 2  # will fail, but that's expected

Преобразование assert

pytest преобразует операторы assert, чтобы показать значения, вызвавшие сбой, — это гораздо полезнее, чем обычный AssertionError.

def test_list_equal():
    result = [1, 2, 4]
    expected = [1, 2, 3]
    assert result == expected
# AssertionError:
#   assert [1, 2, 4] == [1, 2, 3]
#   At index 2 diff: 4 != 3

conftest.py

pytest автоматически загружает conftest.py. Помещайте сюда общие фикстуры и плагины, не импортируя их явно.

# conftest.py
import pytest

@pytest.fixture
def sample_data():
    return {"key": "value"}

# Any test file in the same dir can use sample_data as a parameter

Запуск отдельных наборов тестов

Используйте -k, чтобы запускать тесты, соответствующие ключевому выражению.

# Run tests containing "add"
# pytest -k "add"

# Run tests NOT containing "slow"
# pytest -k "not slow"

# Run a specific test
# pytest test_math.py::test_add

Быстрая проверка

С какого префикса должно начинаться имя функции теста pytest, чтобы она была обнаружена автоматически?

Повторение

pytest не требует шаблонного кода: называйте файлы test_*.py, функции — test_* и используйте обычный assert. Применяйте pytest.raises для исключений, -v для подробного вывода и conftest.py для общих фикстур.

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

Урок «Написание первых тестов pytest» бесплатный?

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

Чему я научусь в уроке «Написание первых тестов pytest»?

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

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

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

Сколько времени занимает урок «Написание первых тестов pytest»?

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

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

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

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

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