2

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

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

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

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

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

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

4

1 回答 1

4

如果您参考 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)))))
于 2013-10-09T06:58:14.910 回答