Код БарсикОсновы Python
Основы Python›C23 · Теория

Теория · C23

Тесты и отладка

Разберись в теме, запусти пример и переходи к самостоятельным задачам.

РАЗБИРАЕМ ПО ШАГАМ

От идеи к работающему коду

Автоматический тест сравнивает фактическое поведение с ожидаемым. Начнём с assert, научимся выбирать граничные случаи и разберём, как повторять проверки после каждого изменения.

Сразу к запуску примера ↓
Барсик проверяет программу на обычных данных, границе и ошибочном сценарии.
Барсик проверяет программу на обычных данных, границе и ошибочном сценарии.
  1. 1Подготовка данных
  2. 2Вызов
  3. 3Проверка ожидания

1. assert показывает несовпадение

assert проверяет логическое выражение. При True выполнение продолжается, при False возникает AssertionError. Можно добавить сообщение, объясняющее ожидание.

Проверка должна опираться на заранее известный ответ. Если вычислить ожидание той же ошибочной формулой, тест повторит ошибку. assert подходит для учебных проверок и тестов, но не заменяет обработку пользовательского ввода: в оптимизированном режиме Python такие утверждения могут отключаться.

Python
def add(first, second):    return first + secondassert add(2, 3) == 5assert add(-2, 2) == 0, "Сумма противоположных чисел равна нулю"print("Проверки пройдены")

2. Обычный случай, граница, ошибка

Для допуска от 15 до 35 проверь не только 20, но и 14, 15, 35, 36. Пара значений рядом с границей отличает < от <= и выявляет частую ошибку условия.

Сценарий теста удобно читать в три шага: подготовить данные, вызвать функцию, сравнить результат. Эта схема называется arrange / act / assert. Проверяй поведение, а не наличие конкретной строки кода.

Python
def allowed(value):    return 15 <= value <= 35for value, expected in [(14, False), (15, True), (35, True), (36, False)]:    actual = allowed(value)    assert actual == expected, f"Ошибка на значении {value}"print("Границы проверены")

3. Входные данные не должны портиться

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

Для случайного поведения используй фиксированный источник или передавай функцию выбора аргументом. Проверяй правила результата; случайное совпадение не делает программу правильной или неправильной.

Python
def without_minimum(values):    result = values.copy()    if result:        result.remove(min(result))    return resultsource = [3, 1, 2]actual = without_minimum(source)assert actual == [3, 2]assert source == [3, 1, 2]print("Исходник сохранён")

4. pytest и поиск причины

В локальном проекте сохрани функцию в calculator.py, а тест ниже в test_calculator.py. В активированном окружении установи pytest командой python -m pip install pytest и выполни python -m pytest. Здесь это команды терминала, а не Python-строки.

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

Python
from calculator import adddef test_add():    assert add(2, 3) == 5def test_add_negative():    assert add(-2, 2) == 0

Где легко ошибиться

  • Проверить только один удобный пример.
  • Повторить формулу реализации в расчёте ожидаемого ответа.
  • Считать зелёный тест доказательством всех возможных свойств программы.
Проверь понимание: Какие значения проверят обе границы допуска 15–35?

Как минимум 14, 15, 35, 36: сразу снаружи и прямо на каждой границе.

Проверяем функцию

Запусти пример. Затем измени код или входные данные и проверь, как меняется вывод.

Пример входных данных

Ввод не нужен

Ожидаемый вывод

3 проверки пройдены
main.pyPython · можно менять код

Подготавливаем редактор…

Загрузка Python…

Каждый ответ — с новой строки.

Твой вывод

Здесь появится результат запуска.

Дальше — самостоятельные задачи

  1. Поймать ошибку на границе
  2. Исправить незавершающийся цикл
  3. Проверить, что входной список не изменился