Как читать вывод тестов в Python
Чтобы разобраться в выводе тестов в первую очередь, стоит объяснить, как работают тесты на платформе. Тестирование кода на Python происходит с помощью фреймворка Pytest и также написаны на языке Python. Проверка кода выполняется автоматически при нажатии на кнопку “Проверить”, после чего тестируемая программа загружается в память и вызывается с разными параметрами, а тесты следят за тем, чтобы ее поведение соответствовало ожидаемому.
После этого на вкладке OUTPUT можно увидеть результат проверки. И вот здесь, при возникновении ошибок, возникают трудности с пониманием того, что происходит. Здесь нам поможет чтение вывода тестов — нашего главного помощника в отладке кода.
Виды ошибок
Никто не пишет код идеально. Поэтому рано или поздно вам придется столкнуться с ошибками. И понимание, какого вида ошибка, поможет вам разобраться в корне проблемы.
Условно ошибки, возникающие при выполнении упражнения, можно разделить на два вида:
- ошибки интерпретатора — разного рода ошибки и исключения, встроенные в Python.
- ошибки утверждений (AssertionError) — ошибка, вызванная тестами. Результат работы функции не соответствует ожидаемому результату.
Ошибки интерпретатора
Ошибки интерпретатора можно условно разделить на две категории:
- синтаксические ошибки
- семантические ошибки, которые чаще называют исключениями.
Синтаксические ошибки (SyntaxError) — это нарушение синтаксиса и пунктуации языка. Во время запуска интерпретатор Python не понимает, как прочесть ошибочное выражение, и вызывает ошибку SyntaxError. Пропустили двоеточие — интерпретатор укажет на место, где оно ожидается.
Семантические ошибки (исключения) — не препятствуют запуску программы, однако программа не работает как ожидается. В Python существует огромное количество исключений, но знать их не обязательно — чаще всего смысл ошибки скрыт в названии вызванного исключения. Например, при обращении к необъявленной переменной возникнет исключение NameError и пояснение, что переменная text не определена.
Не стоит бояться исключений: достаточно прочитать описание исключения и станет понятно, что хочет интерпретатор. Если даже из описания не ясно, что требуется, то всегда есть возможность обратиться к документации, в которой описаны случаи возникновения тех или иных исключений.
Важно понять, что данные ошибки не связаны с тестами и сигнализируют о проблеме в коде.
AssertionError
Отдельно стоит выделить ошибки утверждений (AssertionError). Данные ошибки возникают в случае несоответствия ожидаемого значения с результатом работы функции.
Для начала разберемся, как выглядят тесты для упражнений:
Тестируемая функция вызывается с определенными параметрами, и результат ее работы сравнивается с заранее определенным ожидаемым результатом.
Однако в случае, если значения не совпадают, возникает AssertionError. Рассмотрим подробнее вывод на вкладке OUTPUT в случае падения тестов:
- со знаком «-» указывается ожидаемый результат
- со знаком «+» указывается результат работы тестируемой функции
- со знаком «?» указывается результат сравнения: знаком + указаны участки, которые встречаются только в результате работы функции, знаком «-» указаны места, которые есть только в ожидаемом результате
После этого стоит задуматься, чем конкретно вызвано несовпадение результатов, и устранить причину неправильной работы тестируемой функции.
Отладка кода
Иногда с первого взгляда невозможно понять, чем вызвано неправильное поведение функции. Тогда на помощь приходит отладка — возможность заглянуть в процесс выполнения кода. Существует несколько способов, но мы рассмотрим самый простой и распространенный — отладочную печать.
Отладочная печать — вывод на экран значений переменных, вызовов функций, сообщений о выполнении итерации цикла в процессе работы программы. Для этого достаточно добавить вызов функции print() с интересующим нас значением.
После этого достаточно запустить проверку тестами еще раз, чтобы на вкладке OUTPUT увидеть результат работы нашей отладочной печати:
С помощью отладочной печати становится легче следить за процессом выполнения программы, а значит, установить, где закралась ошибка, становится намного проще. Подробнее вопрос отладки рассмотрен в уроке “Отладка” курса “Основы Python”.