具有多个断言和报告的Clojure检验

时间:2018-09-25 20:44:25

标签: testing clojure frameworks clojure.test

使用clojure.test测试框架报告故障时,我遇到了一些问题。

现在,我了解可以覆盖一些功能以进行不同的报告,以便将其打印到控制台或打印到的任何位置。我也了解我可以将此输出保存到文件中。

我的问题是...当我像这样的例子声明deftest时:

(deftest test1 (is (= 1 1) (is (= 2 1))

此测试将运行,并且如果我执行类似(run-tests)(test-var #'test1)的操作,它将返回无,但打印失败。

我决定覆盖:fail方法进行报告,因为我想要的是这样的故障图:{"expected" (:expected m), "actual" (:actual m)},如果我仅使用报告功能,这种方法也可以工作。

问题是,当您通过Clojure.test框架运行测试时,会调用许多宏,并且它的行为与我想要的不完全一样。

我的最终目标是:运行测试,如果有任何失败,请打印它们,而不是打印出来,然后将其返回给我。如果它们全部通过,那么我不在乎它会返回我什么。

这甚至可能吗?如果某个测试失败,我不想停止测试,我只想将其记录在某个地方,最好是地图。


来源:

Clojure test with mutiple assertions

https://clojure.github.io/clojure/branch-1.1.x/clojure.test-api.html

https://groups.google.com/forum/#!topic/clojure/vCjso96wqps

1 个答案:

答案 0 :(得分:0)

恐怕没有简单的方法可以做到这一点。 您可以提供clojure.test/report :fail defmethod的自定义实现,并将结果存储在原子中,但是很难将结果扩展到外层。

如果您仅使用test-var就是可以的,但是请注意在这种情况下不会执行测试治具-参见test-vars source

(:use clojure.test)

(deftest failing
  (testing "fail me"
    (is (= 1 0))
    (is (= 2 1))
    (is (= 3 2))))

(def test-failures (atom []))

(defmethod report :fail [m]
  (swap! test-failures
         (fn [previous-failures current-failure]
           (conj previous-failures current-failure))
         {:test-var-str (testing-vars-str m)
          :expected (:expected m)
          :actual (:actual m)}))

(defmethod report :end-test-var [m]
  @test-failures)

(defn run-test-var [v]
  (reset! test-failures [])
  (test-var v))

;; in REPL:
(run-test-var #'failing)
;; =>
[{:test-var-str "(failing) (form-init4939336553149581727.clj:159)", :expected 1, :actual (0)}
 {:test-var-str "(failing) (form-init4939336553149581727.clj:160)", :expected 2, :actual (1)}
 {:test-var-str "(failing) (form-init4939336553149581727.clj:161)", :expected 3, :actual (2)}]

也有defmethod report :end-test-ns,但是这个不是很有用,因为test-ns function返回@*report-counters*