Emacs Lisp 赛道上的测试

了解如何在 Exercism 上测试你的 Emacs Lisp 练习


Elisp 的测试使用 ERT 来运行,这是一个用于回归测试和单元测试的 Emacs Lisp 库。测试可以通过多种方式运行。

要在 Emacs 中交互式地运行测试:

  1. 打开测试文件,M-x eval-buffer RET
  2. 交互式地逐个运行,使用 M-x ert RET test-name RET
  3. 交互式地一次运行全部,使用 M-x ert RET t RET 注意,这会运行当前已加载到 Emacs 中的所有测试!
  4. 每次修改后,测试之前都要重新运行 M-x eval-buffer RET

如果只想运行当前缓冲区中的测试,可以把下面的代码加到你的 .emacs 或 init.el 里:

(defun my-eval-and-run-all-tests-in-buffer ()
  "Delete all loaded tests from the runtime, evaluate the current buffer and run all loaded tests with ert."
  (interactive)
  (ert-delete-all-tests)
  (eval-buffer)
  (ert 't))

重启 Emacs 后:

  1. 打开测试文件
  2. M-x my-eval-and-run-all-tests-in-buffer RET

在做练习的过程中,交互式测试非常好用,但如果你想确认练习已经可以提交,批处理模式测试更合适。

要在终端中以批处理模式运行所有测试,请执行 emacs -batch -l ert -l *-test.el -f ert-run-tests-batch-and-exit

上面的命令稍微有点繁琐,所以如果你愿意,可以这样做:

  1. 在你的 $PATH 上(大概在 ~/bin 里)创建一个名为 ert-run 的文件
  2. 文件内容如下:
    #!/usr/bin/env sh
    emacs -batch -l ert -l $1 -f ert-run-tests-batch-and-exit
    
  3. 用 chmod +x ert-run 让这个文件变成可执行文件

这样你只要调用 ert-run *-test.el,就可以在批处理模式下运行测试了。

其他选项可以在文档中找到:C-h i m ert RET。

做练习

因为 Emacs 本身就是一个 elisp 翻译,你写的代码始终运行在它原生的执行环境中。你可以把光标放在表达式末尾按 C-x e 来求值任意一个表达式,也可以用 M-x eval-region 求值选中的区域,或者用 M-x eval-buffer 求值整个缓冲区。这在快速调试代码时非常有用。

建议

既然你的代码和测试都是合法的 elisp,建议把练习代码和它的测试并排放进两个缓冲区窗格,就像这样:

截图:Emacs 的框架被垂直分割为两个窗口

用 C-x 3 把框架垂直分割,用 C-x o 切换到新窗口,再用 C-x C-f /path/to/file 打开文件。