Контракт начинается с точного слова
Пусть функция получает список целых чисел и возвращает количество элементов, строго больших нуля. Слово строго исключает ноль. Для списка из минус единицы, нуля, двух и пяти правильный ответ равен двум. Если реализация считает неотрицательные числа, она вернёт три и нарушит условие. Оба варианта кода могут выглядеть разумно и работать без исключений. Поэтому сначала описывают вход, выход и границы поведения, а уже затем оценивают предложенную реализацию. Вопросы о строках или других типах данных решают отдельно.
Хороший пример различает возможные ошибки
Список из двух и пяти проверит обычный положительный случай, но не различит строго положительное и неотрицательное условие. Для этой границы нужен ноль. Пустой список проверяет отсутствие элементов, а список отрицательных чисел — ситуацию без подходящих значений. Каждый пример должен иметь собственную цель. Большое количество похожих тестов не обязательно полезнее нескольких различающих случаев. Важно заранее получить ожидаемый ответ из требования, а не переписать результат текущей программы в поле правильно. Иначе тест закрепит ошибку вместо её обнаружения.
Объяснение ИИ не заменяет выполнение проверки
Генератор может уверенно описать, что функция учитывает все границы, но это утверждение ещё нужно проверить. В Python стандартный модуль unittest позволяет сравнивать полученный результат с ожидаемым, например через assertEqual. Тестовые данные и ожидаемые числа лучше держать видимыми и простыми. Если реализация и тест одновременно предложены одной системой, оба нуждаются в просмотре: в них может повториться одно неверное понимание задачи. Независимость здесь означает опору на контракт и ручную проверку малых случаев, а не обязательно другого исполнителя.
После правки сохраняйте найденный случай
Предположим, проверка обнаружила, что ноль ошибочно учитывается. Исправление должно сопровождаться повторным запуском этого случая и остальных значимых тестов, чтобы новое изменение не нарушило прежнее поведение. Полезно сравнить разницу в коде и убедиться, что затронута именно нужная логика. Успех небольшой группы тестов не доказывает совершенства любой программы. Для реального проекта дополнительно важны интерфейсы, безопасность, зависимости и работа с данными. Но проверяемая маленькая задача даёт надёжную основу для следующего шага вместо безусловного доверия сгенерированному тексту.
Попробуйте на практике
Составьте набор проверок функции подсчёта строго положительных целых чисел на бумаге или в знакомой среде Python.
- Запишите контракт: вход — список целых чисел, выход — количество элементов строго больше нуля. Укажите, что ноль не считается.
- Подготовьте четыре случая: пустой список; только ноль; минус три и минус один; минус один, ноль, два и пять.
- Вычислите ожидаемые результаты вручную до просмотра реализации: ноль, ноль, ноль и два соответственно.
- Представьте ошибочную версию, которая считает все числа не меньше нуля. Отметьте, какие проверки её обнаружат, и объясните почему.
Как проверить результат. Нулевой элемент выявляет различие между двумя условиями: ошибочная версия провалит второй и четвёртый случаи. Ожидаемые ответы получены из контракта, а не из результата проверяемой функции.
Частые вопросы
Нужно ли тестировать все возможные списки?
Для общего случая это невозможно. Выбирают значимые классы входов и границы, а затем добавляют случаи, связанные с обнаруженными ошибками и реальными требованиями.
Если все тесты прошли, можно ли не читать код?
Нет. Тесты проверяют выбранные свойства на выбранных данных. Просмотр реализации помогает обнаружить лишние действия, неверные предположения и риски, которые этот набор проверок не охватывает.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.