Clojure で 一部分だけテストがしたい Using Midje

TOC

ruby と比べて、 clojure のテスト

普段書いている ruby と比べて、圧倒的に clojure の方が良いところはテストの実行速度だ。
比べ物にならないくらい早い。DB にデータとか入れてないからかもしれないけど。
基本的に保存したら結果が出ている。 repl の立ち上がりとか、最初のテスト読み込みとかはクソ重いけども。
さて、普段は rspec でテストを書いているが、 describe “hoge test “, filter:true do … とかすると
filter ができるのだが、 clojure ではどうやるのだろうか。調査してみた。

test のメソッド filter をどうやるか?

; in repl.clj
(defn filter-autotest []
(require 'midje.repl) (midje.repl/autotest :filter (fn [fact] (:filter fact) ))
)

(defn all-autotest []
(require 'midje.repl) (midje.repl/autotest :filter (fn [fact] true))
)

; in test
(fact :filter "do something great test"
 (is true)
)

上記をrepl 内で定義しておき、
(filter-autotest) か (all-autotest) かを評価する。
そうすると、 filter-autotest の場合は filter つきだけが、
all-autotest の場合は全てが実行される。

repl で最初に定義されていてほしい

repl を起動するたびにいちいち定義するのは面倒くさいので,
こちら
を参考にして設定することで, 起動時に load するようにした。

+++ b/dev/user.clj
@@ -0,0 +1,29 @@
+(ns user
+  (:require
+    [clojure.repl :refer :all]
+    [clojure.tools.namespace.repl :refer [refresh]]
+    [midje.sweet :refer :all]
+    [midje.repl :refer :all]
+    )
+  )
+
+(defn filter-autotest []
+  (require 'midje.repl) (midje.repl/autotest :filter (fn [fact] (:filter fact) ))
+)
+
+(defn all-autotest []
+  (require 'midje.repl) (midje.repl/autotest :filter (fn [fact] true))
+)
+
+(defn start
+  "Start the application"
+  []
+  )
+
+(defn stop
+  "Stop the application"
+  []
+  )
+
+(defn reset []
+  (stop)
+  (refresh :after 'user/start))

+++ b/project.clj
@@ -20,7 +20,8 @@
-  {:dev {:dependencies [
+  {:dev {:source-paths ["dev"]
+         :dependencies [

注意点

(fact "do something"
 (fact "do2"
  ....

のように、 fact でネストした場合は filter に引っかからないので、
この場合は 最初の fact を fact-group に修正してあげましょう。

所感

これがわかってよかった。開発効率が ちょっと上がった。

このエントリーをはてなブックマークに追加