РАЗБИРАЕМ ПО ШАГАМ
От идеи к работающему коду
Автоматический тест сравнивает фактическое поведение с ожидаемым. Начнём с assert, научимся выбирать граничные случаи и разберём, как повторять проверки после каждого изменения.
Сразу к запуску примера ↓
- 1Подготовка данных
- 2Вызов
- 3Проверка ожидания
1. assert показывает несовпадение
assert проверяет логическое выражение. При True выполнение продолжается, при False возникает AssertionError. Можно добавить сообщение, объясняющее ожидание.
Проверка должна опираться на заранее известный ответ. Если вычислить ожидание той же ошибочной формулой, тест повторит ошибку. assert подходит для учебных проверок и тестов, но не заменяет обработку пользовательского ввода: в оптимизированном режиме 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. Проверяй поведение, а не наличие конкретной строки кода.
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. Входные данные не должны портиться
Если функция обещает вернуть новый список, отдельный тест проверяет исходник после вызова. Одного совпадения результата недостаточно: функция могла получить его разрушительным изменением входа.
Для случайного поведения используй фиксированный источник или передавай функцию выбора аргументом. Проверяй правила результата; случайное совпадение не делает программу правильной или неправильной.
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-строки.
Если тест падает, воспроизведи минимальный случай и проверь значения перед ошибочной строкой. Для незавершающегося цикла сначала останови запуск, затем проверь изменение условия. После исправления снова выполни все связанные тесты, а не только последний.
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: сразу снаружи и прямо на каждой границе.
