如何从Clojure REPL运行一个测试(不是整个命名空间)?
我试过直接调用这个函数,例如(the-ns/the-test)
,但我需要先固定装置。所以我想找到一种方法从clojure.test
开始测试。
这很接近但不符合我想做的事情:https://stackoverflow.com/a/24337705/109618
我没有看到如何从clojure.test API做到这一点。
Clojure 1.6中添加了一个新功能来支持这一功能。 clojure.test/test-vars将使用固定装置运行一个或多个测试变量。
我认为这样的事情应该有效:
(clojure.test/test-vars [#'the-ns/the-test])
如果你不介意不运行灯具,你可以在调用run-tests
之前执行以下操作:
(defn test-ns-hook []
(my-test))
要删除钩子,你可以这样做
(ns-unmap *ns* 'test-ns-hook)
如果你仍然需要你的灯具并希望保留一个测试命名空间,你可以添加一个ns-unmap
来删除你不想从命名空间运行的所有测试/灯具,然后运行你的测试建模:
(doseq [v (keys (ns-publics 'my-ns))]
(let [vs (str v)]
(if (.startsWith vs "test-") (ns-unmap 'my-ns v))))
使用多个名称空间可能更容易,其中一个名称空间包含所有测试和装置,在其他名称空间中使用refer
来运行您希望从主测试名称空间运行的测试和装置。然后,您可以使用ns
切换到特定的测试命名空间,或者将run-tests
传递给您要测试的命名空间:
(ns test-main
(:require [clojure.test :refer :all]))
(deftest addition
(is (= 4 (+ 2 2)))
(is (= 7 (+ 3 4))))
(deftest subtraction
(is (= 1 (- 4 3)))
(is (= 3 (- 7 4))))
(run-tests)
;Runs all the tests
(ns test-specific
(:require [clojure.test :refer :all]
[test-main :refer :all]))
(deftest arithmetic
(subtraction))
(run-tests)
;Just runs the tests you want
要在命名空间中运行单个测试:
lein test :only namespace_name/testname
在一个名称空间中运行所有测试
lein test :only namespace_name
clojure.test的一个很好的替代方案(如果你可以添加额外的依赖项是eftest
)。这个库是一个替代的跑步者(它与clojure.test兼容)。它具有灵活的测试选择器(即按文件夹,按名称空间,按var)。
在REPL中,您可以执行以下操作:
(require '[eftest.runner :refer [find-tests run-tests]])
(run-tests (find-tests #'foo.bar/baz))