2013-10-09 19 views
2

我想知道Clojure使用什麼數據結構來存儲使用deftest定義的測試。clojure.test如何存儲使用deftest定義的測試?

我認爲它的地圖,我希望得到它的類作爲PersistentArrayMap,但它出來就像它自己的類。

它是否使用記錄進行測試?

user=> (use 'clojure.test) 
nil 
user=> (deftest test-test) 
#'user/test-test 
user=> (class test-test) 
user$test_test 

當我們運行測試,我們只提供了命名空間,它是如何自動識別命名空間中的所有測試並開始運行逐一?

這些測試是否被添加到每次我們在當前命名空間中使用deftest創建一個測試列表?

回答

3

如果您參考test.clj的源代碼,您可以看到deftest宏通過調用vary-meta在當前名稱空間中創建一個var。

(defmacro deftest 
    [name & body] 
    (when *load-tests* 
    `(def ~(vary-meta name assoc :test `(fn [] [email protected])) 
     (fn [] (test-var (var ~name)))))) 

測試本身在該var內。

運行測試等同於檢查命名空間中具有:test關聯的所有var。

刪除一些周圍的膠水,讓:

(doseq [v (vals (ns-interns ns))] 
    (when (:test (meta v)) 
    (each-fixture-fn (fn [] (test-var v))))) 
+0

感謝。我仍然習慣於閱讀長久的clojure代碼。你的解釋和必要的片段是非常有用的。 –

相關問題