Clojure組込みのtest関数を使う
2010/07/25
組込みのtest関数は、メタデータの:testに設定されたテスト関数を実行します。関数を定義する際にテスト関数をメタデータに設定する例です。
(defn #^{:test (fn [] (assert (= (add1 2) 3)) (assert (= (add1 -1) 0)))} add1 [x] (inc x))
テストを実行するには、test関数を実行します。
(test #'add1) => :ok
test関数の引数は、varを渡すので、#’を付けてます。
#’を付けない場合は、値が渡る。そうするとメタデータがtest関数に渡らないから、テストが実行できない。(と理解してます)
このテスト記述方法の利点
関数定義と同時にテストを記述することができるので、簡単な使用方法を同時に示すという意味でもよいかもしれません。ドキュメントも一緒に定義すると以下のような感じになります。
user=> (defn #^{:doc "引数より1大きい整数を返します。" :test (fn [] (assert (= (add1 2) 3)) (assert (= (add1 -1) 0)))} add1 [x] (inc x))
ドキュメントの表示とテストの実行例
user=> (doc add1) ------------------------- user/add1 ([x]) 引数より1大きい整数を返します。 nil user=> (test #'add1) :ok user=>
docは、関数ではない(スペシャルフォーム)ので、引数指定時に #’ は不要です。