具有多个断言和报告的 Clojure 测试
Clojure Test with Multiple Assertions and Reporting
我正在 运行 解决使用 clojure.test 测试框架报告失败的一些问题。
现在,我知道我可以为不同的报告覆盖一些功能,以便它打印到控制台或我想要打印到的任何地方。我也明白我可以将这个输出保存到一个文件中。
我的问题如下...当我像这个例子一样声明 deftest 时:
(deftest test1
(is (= 1 1)
(is (= 2 1))
这个测试将 运行 如果我做类似 (run-tests)
或 (test-var #'test1)
它会 return 零但是 打印失败。
我决定重写报告的 :fail 方法,因为我想要的是像这样的失败地图:{"expected" (:expected m), "actual" (:actual m)}
如果我只使用报告功能,这种方法有点管用。
问题是,当您 运行 通过 Clojure.test 框架进行测试时,会调用许多宏,但它的行为并不完全符合我的要求。
我的最终目标是:运行进行测试,如果有任何失败,不要将它们打印出来,而是将它们保存到地图上,然后 return 地图给我。如果他们都通过了,那么我不在乎 return 对我来说是什么。
这可能吗?我不想在某个测试失败时停止测试,我只想将其记录在某个地方,最好是地图。
来源:
https://clojure.github.io/clojure/branch-1.1.x/clojure.test-api.html
恐怕没有简单的方法可以做到这一点。
您可以提供 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
functionreturns@*report-counters*
.
我正在 运行 解决使用 clojure.test 测试框架报告失败的一些问题。
现在,我知道我可以为不同的报告覆盖一些功能,以便它打印到控制台或我想要打印到的任何地方。我也明白我可以将这个输出保存到一个文件中。
我的问题如下...当我像这个例子一样声明 deftest 时:
(deftest test1
(is (= 1 1)
(is (= 2 1))
这个测试将 运行 如果我做类似 (run-tests)
或 (test-var #'test1)
它会 return 零但是 打印失败。
我决定重写报告的 :fail 方法,因为我想要的是像这样的失败地图:{"expected" (:expected m), "actual" (:actual m)}
如果我只使用报告功能,这种方法有点管用。
问题是,当您 运行 通过 Clojure.test 框架进行测试时,会调用许多宏,但它的行为并不完全符合我的要求。
我的最终目标是:运行进行测试,如果有任何失败,不要将它们打印出来,而是将它们保存到地图上,然后 return 地图给我。如果他们都通过了,那么我不在乎 return 对我来说是什么。
这可能吗?我不想在某个测试失败时停止测试,我只想将其记录在某个地方,最好是地图。
来源:
https://clojure.github.io/clojure/branch-1.1.x/clojure.test-api.html
恐怕没有简单的方法可以做到这一点。
您可以提供 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
functionreturns@*report-counters*
.