Могу ли я протестировать функции ELisp? - PullRequest
0 голосов
/ 26 сентября 2019

Мне нравится функция Python doc-тестов для независимого тестирования функций.Есть ли в Emacs Lisp что-то похожее или я могу каким-то образом эмулировать?

Например, эта функция получает временные метки из сегмента часов в режиме Org:

(defun org-get-timestamps (line)
  "Parses a clock segment line and returns the first and last timestamps in a list."
  (let* ((org-clock-regexp (concat "CLOCK: " org-ts-regexp3 "--" org-ts-regexp3))
     (t1 (if (string-match org-clock-regexp line)
         (match-string 1 line)
           (user-error "The argument must have a valid CLOCK range")))
     (t2 (match-string 9 line)))
    (cons t1 (cons t2 '()))))

Я бы хотелdoc-test, такой как:

(org-get-timestamps "CLOCK: [2019-09-26 Thu 00:29]--[2019-09-26 Thu 01:11] =>  0:42")
("2019-09-26 Thu 00:29" "2019-09-26 Thu 01:11")

Было бы неплохо проверить user-error.

Я также хотел бы убедиться, что любой рефакторинг прошел doc-тест, поэтомутакже регрессионный тест.

Это существует?

1 Ответ

1 голос
/ 27 сентября 2019

Важной особенностью Python doctest является то, как его ввод выглядит как интерактивный сеанс REPL Python, как описано в документации doctest :

Модуль doctest ищет фрагментытекст, который выглядит как интерактивные сеансы Python, а затем выполняет эти сеансы, чтобы убедиться, что они работают точно так, как показано.

Я не знаю ни о каких средствах elisp, подобных этому, но я думаю, что вы можете достичьчто вы хотите, используя среду регрессионного тестирования Emacs Lisp (ERT) , которая поддерживает как интерактивное, так и пакетное выполнение теста.

Чтобы протестировать функцию org-get-timestamps, вы можете определить тест следующим образом:

(require 'ert)

(ert-deftest org-timestamp-test ()
  (should (equal
           (org-get-timestamps "CLOCK: [2019-09-26 Thu 00:29]--[2019-09-26 Thu 01:11] => 0:42")
           '("2019-09-26 Thu 00:29" "2019-09-26 Thu 01:11"))))

Чтобы запустить тест в интерактивном режиме, вы можете набрать Mx ert , нажать клавишу ввода, а затем либо снова нажать клавишу ввода, чтобы выбрать все тесты с использованием аргумента t по умолчанию, либо ввестиимя теста для запуска и нажмите клавишу ввода, и результаты теста будут показаны в буфере *ert*:

Selector: org-timestamp-test
Passed:  1
Failed:  0
Skipped: 0
Total:   1/1

Started at:   2019-09-27 08:44:57-0400
Finished.
Finished at:  2019-09-27 08:44:57-0400

.

Точка в точкесамый конец выше представляет тест, который был выполнен.Если было выполнено несколько тестов, было бы несколько точек.

Чтобы запустить тест в пакетном режиме, сохраните его в файл org-timestamp-test.el и, предполагая, что функция org-get-timestamps находится в файле org-timestamps.el, запустите его какэто из командной строки вашей оболочки:

emacs -batch -l ert -l org-timestamps.el -l org-timestamp-test.el -f ert-run-tests-batch-and-exit

Результаты теста будут представлены в выводе оболочки:

Выполнение 1 теста (2019-09-27 06:03:09-0700) прошел 1/1 орг-тест отметки времени

Выполнен 1 тест, 1 ожидаемый результат (2019-09-27 06: 03: 09-0700)

...