Emacs Lispトラックでのテスト

ExercismでEmacs Lispの演習をテストする方法を学びます


Elispのテストは、回帰テストや単体テストのためのEmacs LispライブラリであるERTを使って実行します。テストの実行方法はいくつかあります。

Emacsの中で対話的にテストを実行するには、次のようにします。

  1. テストファイルを開き、M-x eval-buffer RETを実行します
  2. M-x ert RET test-name RETで、対話的に1つずつ実行します
  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のフレームを縦に2つのウィンドウに分割した様子を示すスクリーンショット

C-x 3でフレームを縦に分割し、C-x oで新しいウィンドウに切り替えて、C-x C-f /path/to/fileでファイルを開きます。