#:g1: 1amの紹介

Posted 2014-11-20 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の325日目です。

1amとはなにか

 1amは、James M. Lawrence氏作のシンプルなfiveam風のテストフレームワークです。

パッケージ情報

パッケージ名1am
Quicklisp
CLiKiCLiki: Article not found
Quickdocs1am | Quickdocs

インストール方法

(ql:quickload :1am)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 1amは約60行程のコードとのことですが、マルチスレッドな大きめのプロジェクトでは、良く知られたテストフレームワークでは問題が起きていたとのことで、これを解消するためシンプルが一番という哲学で作られたもののようです。
特長として説明があるのは、

とのことです。
書式はfiveamとほぼ同じなので、手元でfiveamで書いていて遅いと感じていたものを1amに置き換えてみましたが、かなり速くなりました。

ASDFとの連携

 1amの仕組みは、1am:*tests*にテストの関数を詰め込んで実行するという素朴なものです。
fiveamのようにテストをsuiteごとに管理するのではなく、基本的には大域的にこの一つのみです。管理しようと思えばできなくもない感じではありますが。
他のプロジェクトとの競合を予防する場合、テストファイルの中に、1am:*tests*を初期化するコードを入れるか、asdf:prepare-opで初期化したりすることになるのかなと思います。
テストの呼び出しはrunのみなのでASDFでの記述はシンプルです。

(cl:in-package :asdf)

(defsystem :foo :serial t :depends-on (:1am ...) :components (...) :in-order-to ((test-op (load-op ...))) :perform (prepare-op :before (o c) (set (find-symbol* :*tests* :1am) '() )) :perform (test-op (o c) (let ((*package* (find-package ...))) (symbol-call :1am :run))))

*package*を書いているのは、テスト関数は、通常の関数なので大域変数に影響を受けることになるためです。
パッケージやリードテーブルに影響を受ける印字系のプログラムではテスト関数内で影響を受けないように書くか、このようにtest-opで保護するかになるかと思います。

まとめ

 今回は、1amを紹介してみました。
なかなかシンプルで良いかもしれません。

comments powered by Disqus