【问题标题】:Run one Clojure test (not all tests in a namespace), with fixtures, from the REPL从 REPL 运行一个带有固定装置的 Clojure 测试(不是命名空间中的所有测试)
【发布时间】:2014-09-18 04:49:18
【问题描述】:
【问题讨论】:
标签:
testing
clojure
read-eval-print-loop
【解决方案1】:
如果您不介意不运行灯具,您可以在致电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
【解决方案2】:
Clojure 1.6 中添加了一个新函数来支持这一点。 clojure.test/test-vars 将使用固定装置运行一个或多个测试变量。
我认为这样的事情应该可行:
(clojure.test/test-vars [#'the-ns/the-test])
【解决方案3】:
在命名空间中运行单个测试:
lein test :only namespace_name/testname
在一个命名空间中运行所有测试
lein test :only namespace_name
【解决方案4】:
clojure.test 的一个不错的替代方案(如果您可以添加其他依赖项,请使用 eftest)。这个库是一个替代运行器(它与 clojure.test 兼容)。它具有灵活的测试选择器(即按文件夹、按命名空间、按 var)。
在 REPL 中,您可以执行如下操作:
(require '[eftest.runner :refer [find-tests run-tests]])
(run-tests (find-tests #'foo.bar/baz))
见https://github.com/weavejester/eftest