Clojure組込みのtest関数を使う

組込みの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は、関数ではない(スペシャルフォーム)ので、引数指定時に #’ は不要です。

参考

http://d.hatena.ne.jp/fatrow/20100208/1265639951

http://clojure.org/special_forms

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください