Простая самопроверка функций
Уроки курсаПростая самопроверка функций
Типичные ошибки при составлении тестов
Тест — это не просто код, который запускается. Тест может быть синтаксически правильным и при этом ничего не проверять. Вот два класса ошибок, которые встречаются чаще всего.
Ошибочное ожидаемое значение
Если в тесте стоит неверное ожидаемое значение, тест становится бесполезным или, хуже того, вводит в заблуждение. Функция может работать неправильно, а тест выведет '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) — это два варианта одного и того же случая, а не два независимых сценария. Они не дадут дополнительной уверенности в корректности функции.
Практический способ не пропустить граничные случаи: после того как написаны тесты на «обычные» данные, специально спросить себя: «Что произойдёт, если передать ноль? А отрицательное число? А максимально возможное значение?» Это не паранойя, а нормальная привычка.
