在 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 中建立一個名為 ert-run 的檔案(通常放在 ~/bin)
  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 開啟檔案。