具有多个断言和报告的 Clojure 测试

问题描述 投票:0回答:1

我在使用 clojure.test 测试框架报告失败时遇到了一些问题。

现在,我明白我可以覆盖不同报告的某些功能,以便将其打印到控制台或我想要打印到的任何地方。我还知道我可以将此输出保存到文件中。

我的问题如下......当我声明像这样的例子时:

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

此测试将运行,如果我执行类似

(run-tests)
(test-var #'test1)
的操作,它将 return nil 但 print 失败。

我决定重写 :fail 报告方法,因为我想要的是这样的失败图:

{"expected" (:expected m), "actual" (:actual m)}
,如果我只使用报告功能,这种方法就可以了。

问题是,当您通过 Clojure.test 框架运行测试时,会调用许多宏,但它的行为并不完全符合我想要的方式。

我的最终目标是:运行测试,如果有任何失败,不要打印它们,而是将它们保存到地图中并将地图返回给我。如果它们都通过了,那么我不在乎它会给我带来什么。

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


来源:

使用多个断言进行 Clojure 测试

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

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

testing clojure frameworks clojure.test
1个回答
1
投票

恐怕没有简单的方法可以做到这一点。 您可以提供

clojure.test/report :fail
defmethod 的自定义实现并将结果存储在原子中,但很难将结果传播到外层。

如果您只使用

test-var
那么它是可行的,但请注意,在这种情况下不会执行测试装置 - 请参阅
test-vars

(: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
函数
返回
@*report-counters*

© www.soinside.com 2019 - 2024. All rights reserved.