clojure.test如何存储使用deftest定义的测试?

时间:2013-10-09 06:27:28

标签: clojure

我想知道Clojure使用什么数据结构来存储使用deftest定义的测试。

我认为它是一张地图,我希望它的类为PersistentArrayMap,但它就像它自己的类一样。

它是否使用记录进行测试?

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

当我们运行测试时,我们只提供命名空间,它如何自动识别命名空间中的所有测试并逐个开始运行它们?

在我们使用当前命名空间中的deftest创建一个测试列表时,是否将这些测试添加到某种测试列表中?

1 个答案:

答案 0 :(得分:3)

如果您参考test.clj的源代码,您可以看到deftest宏通过调用vary-meta在当前命名空间中创建了一个var。

 (defmacro deftest
  [name & body]
   (when *load-tests*
    `(def ~(vary-meta name assoc :test `(fn [] ~@body))
      (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)))))