19.2.13 Тестирование покрытия

Edebug предоставляет рудиментарное тестирование покрытия и отображение частоты выполнения.

Тестирование покрытия работает путем сравнения результата каждого выражения с предыдущим результатом; каждая форма в программе считается покрытой, если она вернула два разных значения с момента начала тестирования покрытия в текущей сессии Emacs. Таким образом, чтобы провести тестирование покрытия вашей программы, выполните ее при различных условиях и отметьте, ведет ли она себя правильно; Edebug сообщит вам, когда вы попробовали достаточное количество различных условий, чтобы каждая форма вернула два разных значения.

Тестирование покрытия замедляет выполнение, поэтому оно выполняется только в том случае, если edebug-test-coverage не равно nil. Подсчет частоты выполняется для всех выполнений инструментализированной функции, даже если режим выполнения установлен в Go-nonstop, и независимо от того, включено ли тестирование покрытия.

Используйте C-x X = (edebug-display-freq-count) для отображения как информации о покрытии, так и подсчета частоты для определения. Просто = (edebug-temp-display-freq-count) временно отображает ту же информацию, только до тех пор, пока вы не нажмете другую клавишу.

Команда: edebug-display-freq-count

Эта команда отображает данные подсчета частоты для каждой строки текущего определения.

Она вставляет подсчеты частоты в виде комментариев после каждой строки кода. Вы можете отменить все вставки одной командой undo. Подсчеты появляются под «(» перед выражением или «)» после выражения или в последнем символе переменной. Для упрощения отображения подсчет не показывается, если он равен подсчету более раннего выражения в той же строке.

Символ «=» после подсчета для выражения означает, что выражение возвращало одно и то же значение при каждом вычислении. Другими словами, оно еще не покрыто для целей тестирования покрытия.

Чтобы очистить данные подсчета частоты и покрытия для определения, просто повторно инструментализуйте его с помощью eval-defun.

Например, после вычисления (fac 5) с точкой останова исходного кода и установки edebug-test-coverage в t, когда достигается точка останова, данные частоты выглядят следующим образом:

(defun fac (n)
  (if (= n 0) (edebug))
;#6           1      = =5
  (if (< 0 n)
;#5         =
      (* n (fac (1- n)))
;#    5               0
    1))
;#   0

Строки комментариев показывают, что fac был вызван 6 раз. Первое утверждение if вернулось 5 раз с одинаковым результатом; то же самое относится и к условию второго if. Рекурсивный вызов fac не вернулся вовсе.