Emacs Lispで書いたスクリプトをert.elでユニットテストしてみました。

ert.el

ert.el(Emacs Lisp Regression Testing)は、いくつかあるEmacs Lisp向け ユニットテスティングツールのひとつです。Emacs trunkに入ったそうなので、 そのうち標準で使えるようになるはず。さしあたって単体で手に入れることも できます。

対話的にはもちろん、非対話的にも実行できるのが便利。

ert.elの簡単な使い方

次のようなtest-foo.elファイルを書きます。

;; 先頭でertとテスト対象をロードしておく
(require 'ert)
(require 'TEST-TARGET)

;; ert-deftestでテストを定義する
(ert-deftest TESTNAME ()
            (should (equal EXPECTED
                           ACTUAL)))

;; 末尾にバッチ処理の指示を書いておく
(ert-run-tests-batch-and-exit)

コマンドラインから次のように実行します。

emacs --directory . --batch --eval '(load-file "test-foo")'

test-foo.elの実例: ;; test-my-foldl.el (require 'ert) (require 'my-foldl) (ert-deftest test-foldl () (should (equal '(3 2 1) (foldl 'cons '() '(1 2 3))))) (ert-run-tests-batch-and-exit)

覚え書き

  • emacsの--scriptは--directoryより優先されるらしい。

    app.elとd/lib.elがあって、app.elで(require 'lib)しているとする。この とき、d/lib.elを使うために

    emacs --directory d --script app.el
    

    とすると、 d/lib.elの読み込みに失敗してCannot open load file: libと言 われる。dがload-pathに追加される前にapp.elが読まれるらしい。

    とりあえず--batchと--evalに変更して回避。

    emacs --batch --directory . --eval '(load-file "app.el")'
    
  • テストスクリプト内で、最初にertをロードしないとエラーが起きる ことがあった。

Makefileの例

#!/usr/bin/make

EMACS    = emacs --batch --quick --directory .
WGET     = wget --timestamping
cached   = ert.el
clean   += $(cached)

testlogs = test-foo-el.log
mostlyclean += $(testlogs)

.PHONY: all test mostlyclean clean

all: test

test: $(testlogs)

test-%-el.log: test/test-%.el ert.el
        $(EMACS) --eval '(load-file "$<")' 2>&1 | tee $@

ert.el:
        $(WGET) --output-document=$@ \
        http://git.savannah.gnu.org/cgit/emacs.git/plain/lisp/emacs-lisp/ert.el

mostlyclean:
        -rm -f $(mostlyclean)

clean: mostlyclean
        -rm -f $(clean)