Python для новичковФункцииПростая самопроверка функций

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

Уроки курсаПростая самопроверка функций

Типичные ошибки при составлении тестов

Тест — это не просто код, который запускается. Тест может быть синтаксически правильным и при этом ничего не проверять. Вот два класса ошибок, которые встречаются чаще всего.

Ошибочное ожидаемое значение

Если в тесте стоит неверное ожидаемое значение, тест становится бесполезным или, хуже того, вводит в заблуждение. Функция может работать неправильно, а тест выведет 'OK'. Или наоборот — функция корректна, а тест упадёт с 'FAIL'.

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

Правило простое: ожидаемый результат нужно вычислить независимо — на бумаге, в уме, с калькулятором, но не глядя в код функции. Для add(2, 3) ответ равен 5 — это арифметический факт, который не зависит от того, как написана функция.

Пример ошибочного теста:

def add(a, b):
    return a - b  # здесь ошибка: вычитание вместо сложения

# Неверное ожидаемое значение — тест «проходит», но функция сломана
if add(2, 3) == -1:
    print('OK')
else:
    print('FAIL')

Тест вывел 'OK', потому что ожидаемое значение -1 повторяет ошибочную логику функции. Правильный тест должен стоять на 5, и тогда он поймал бы баг:

if add(2, 3) == 5:
    print('OK')
else:
    print('FAIL')  # вот теперь FAIL, и это сигнал

Пропуск граничных случаев

Вторая распространённая ошибка — тестировать только «нормальные» входные данные и считать, что этого достаточно. Типичный и типичный — разные слова. Функция может отлично работать на положительных числах и неожиданно ломаться на нуле, на отрицательных значениях или на пустой строке.

Граничные случаи — это те входные данные, где логика функции может вести себя иначе, чем в стандартных ситуациях. Их нужно выбирать осознанно:

  • ноль как аргумент, если функция работает с числами;
  • отрицательные значения;
  • пустая строка, если функция работает с текстом;
  • один элемент, если функция работает со списком.

Если тесты только на add(2, 3) и add(10, 20) — это два варианта одного и того же случая, а не два независимых сценария. Они не дадут дополнительной уверенности в корректности функции.

Практический способ не пропустить граничные случаи: после того как написаны тесты на «обычные» данные, специально спросить себя: «Что произойдёт, если передать ноль? А отрицательное число? А максимально возможное значение?» Это не паранойя, а нормальная привычка.