我想知道Clojure使用什么数据结构来存储使用deftest定义的测试。
我认为它是一张地图,我希望它的类为PersistentArrayMap,但它就像它自己的类一样。
它是否使用记录进行测试?
user=> (use 'clojure.test)
nil
user=> (deftest test-test)
#'user/test-test
user=> (class test-test)
user$test_test
当我们运行测试时,我们只提供命名空间,它如何自动识别命名空间中的所有测试并逐个开始运行它们?
在我们使用当前命名空间中的deftest创建一个测试列表时,是否将这些测试添加到某种测试列表中?
答案 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)))))