Как читать вывод тестов в Ruby

Чтобы вам было проще разобраться в выводе тестов, в первую очередь объясним, как работают тесты на платформе.

Тестирование кода на Java происходит с помощью фреймворка minitest, сами тесты также написаны на языке Ruby. Проверка кода запускается автоматически после нажатия на кнопку «Проверить». Тестируемая программа компилируется и проверяется с разными входными данными. При этом тесты следят, чтобы поведение программы соответствовало ожиданиям.

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

Виды ошибок

Никто не пишет код идеально. Поэтому рано или поздно вы столкнетесь с ошибками. Ошибки при выполнении упражнения можно условно разделить на два вида:

  • Ошибки интерпретатора — разного рода синтаксические ошибки и исключения, встроенные в Ruby
  • Ошибки утверждений (AssertionError) — ошибки, вызванные тестами. Они возникают, если результат работы функции не соответствует ожидаемому результату

Ошибки интерпретатора

Ошибки интерпретатора можно условно разделить на две категории:

  • синтаксические ошибки
  • семантические ошибки, которые чаще называют исключениями.

Синтаксические ошибки (SyntaxError) — это нарушение синтаксиса и пунктуации языка. Во время запуска интерпретатор Ruby вызывает ошибку SyntaxError, потому что не понимает, как прочесть ошибочное выражение.  ****Если вы пропустили двоеточие, интерпретатор укажет на место, где оно ожидается:

Семантические ошибки (исключения) — такие ошибки не препятствуют выполнению программы, но при этом она не работает так, как ожидается. Эти ошибки не связаны с тестами и сигнализируют о проблеме в коде.

В Ruby существует огромное количество исключений, но знать их не обязательно. Обычно название вызванного исключения и сообщение об ошибке понятно объясняют, в чем проблема.

Например, при обращении к необъявленной переменной возникнет исключение NameError и пояснение, что переменная result не определена:

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

Одна из отличительных и приятных особенностей Ruby — если вы ошиблись в названии метода, Ruby подскажет, какой метод имелся в виду:

Ошибки утверждений

Такие ошибки возникают, если результат работы функции не соответствует тому результату, который мы ожидали.

Для начала разберемся, как выглядят тесты для упражнений:

Тестируемая функция вызывается с определенными параметрами. Результат ее работы сравнивается с заранее определенным ожидаемым результатом.

Если фактический и ожидаемый результат совпадают, то все хорошо, тесты пройдены.

Но если значения не совпадают, возникает ошибка. Рассмотрим подробнее вывод на вкладке OUTPUT в случае падения тестов:

Здесь мы видим:

  • Название теста, на котором выполнение остановилось — test_0001_should works
  • Файл и строка с ошибкой — [test.rb:12]
  • Само описание проблемы — при сравнении строки ‘**3521’ с ожидаемым результатом функция вернула false. Чтобы этот тест-кейс считался пройденным, сравнение должно вернуть true.
  • Фактический результат вызова prepare_card_for_display(card_number1), который равен "**521"
  • Значение параметра, переданного внутрь функции — "102983470123521"

Изучив такой вывод, мы можем разобраться, чем вызвано несовпадение результатов. Это поможет устранить причину неправильной работы тестируемого кода.

Отладка кода

Иногда с первого взгляда невозможно понять, чем вызвано неправильное поведение кода. Тогда на помощь приходит отладка — возможность заглянуть в процесс выполнения кода.

Существует несколько способов, но мы рассмотрим самый простой и распространенный — отладочную печать.

Отладочная печать — это вывод на экран значений переменных, вызовов функций, сообщений о выполнении итерации цикла в процессе работы программы.

Для этого достаточно добавить вызов функции puts() с интересующим нас значением:

После этого достаточно запустить проверку тестами еще раз, чтобы на вкладке OUTPUT увидеть результат работы нашей отладочной печати:

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