从REPL运行一个Clojure测试(不是名称空间中的所有测试)和fixtures

时间:2014-07-26 12:07:52

标签: testing clojure read-eval-print-loop

如何从Clojure REPL运行一个测试(不是整个命名空间)?

我试过直接调用该功能,例如(the-ns/the-test)但我需要首先运行灯具。所以我想找到一种方法从clojure.test开始测试。

这很接近但不符合我想要做的事情: https://stackoverflow.com/a/24337705/109618

我没有看到如何从clojure.test API提及它。

4 个答案:

答案 0 :(得分:32)

Clojure 1.6中添加了一个新功能来支持这一功能。 clojure.test/test-vars将使用灯具运行一个或多个测试变量。

我认为这样的事情应该有效:

(clojure.test/test-vars [#'the-ns/the-test])

答案 1 :(得分:4)

如果您不介意不使用灯具,可以在致电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 :(得分:2)

要在名称空间中运行单个测试,请执行以下操作:

lein test :only namespace_name/testname

要在一个名称空间中运行所有测试

lein test :only namespace_name

答案 3 :(得分:0)

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