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)
Other Articles
- 12 May 2011 : onlispja ebook
- 07 May 2011 : 文字校正用ユーティリティ
- 28 Apr 2011 : htdigest設定支援スクリプト
- 15 Apr 2011 : HudsonからJenkinsへの移行
- 25 Mar 2011 : Jenkins導入
- 11 Mar 2011 : 地震 / Earthquake in Japan
- 23 Feb 2011 : DocDiff 0.4.0