#:g1: rtの紹介

Posted 2014-01-31 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の32日目です。

rtとはなにか

 rtとは、Richard C. Waters氏作の回帰テストのパッケージで、RTとはそのままRegression Testの頭文字です。
1991年のACM Lisp Pointersの記事として紹介されたものが最初で、以来色々なプロジェクトでも利用されて来たようです。(SBCLにもSB-RTとして標準添付になっていたりします)

パッケージ情報

パッケージ名rt
Quicklisp
参考文献Some Useful Algorithms: Part 1: Supporting the Regression Testing of Lisp Programs
CLiKihttp://cliki.net/rt
Quickdocshttp://quickdocs.org/rt

インストール方法

(ql:quickload :rt)

試してみる

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

 詳細は、上記に紹介した文献のSome Useful Algorithms: Part 1に実装の解説を含めて載っていますが、使い方自体は非常にシンプルです。

(rem-all-tests)
;=>  NIL

(deftest (test 1) 1 1) ;=> (TEST 1)

(deftest (test 2) 1 1) ;=> (TEST 2)

(do-tests) ;>> Doing 2 pending tests of 2 tests total. ;>> (TEST 1) (TEST 2) ;>> No tests failed. ;=> T

 deftestでテストに名前を付け、後続の2つの値がequalで一致するものとして記述します。(名前にはequalで比較可能な任意のLispオブジェクトが利用可能)
あとは、do-testで指定した名前のテストの実行と、do-testsで一括実行です。

 他には、rem-test/rem-all-testsでテストの削除、主に対話的実行で利用するエラーから抜けて続行するcontinue-testingがある位です。

 RTでは値を比較するのみでコンディション系のチェックがありませんが、その辺りは場合に応じて自作してもCommon Lispの場合はすぐ作れるかなというところです。
ASDFのtest-opと組み合せる場合は、

(defmethod asdf:perform ((o asdf:test-op) (c (eql (asdf:find-system ...))))
  (or (funcall (intern (symbol-name '#:do-tests)
		       (find-package '#:rt)))
      (error "test-op failed")
      t))

のような感じで使われていることが多いようです。
テストを纏める機能も特にないので、ばっさり削除して実行という感じになるようです(やろうと思えばできなくもないですが…)

まとめ

 今回は、rtを紹介してみました。
非常にシンプルなのでCommon Lisp初心者がTDD開発で利用するのにも良いかなと思います。

comments powered by Disqus