【问题标题】:How to output successful tests from `lein test`?如何从`lein test`输出成功的测试?
【发布时间】:2018-01-08 16:18:07
【问题描述】:

使用 clojure.test,在运行 lein test 时,默认设置只打印断言的数量,例如“运行 12 个包含 19 个断言的测试”,失败测试的详细信息,以及测试的命名空间。我也想要成功测试的输出,这样我就可以看到实际运行了哪些测试。 JS 中的 Mocha 等框架默认具有此行为。

例如,如果以下测试通过:

(deftest aTest
  (testing "Simple test"
      (is (= 1 1))))

我想要这样的输出(格式是任意的):

Testing <namespace>
    Passed: aTest -> Simple test

理想情况下,通过的测试也将采用颜色编码。

我查看了一些库,包括 lein-test-refresh 和 humane-test-output,但没有看到我需要什么。另一个选项看起来像重写 clojure.test 中的报告函数,但如果可能的话,我想避免这种情况。

【问题讨论】:

    标签: unit-testing clojure clojure-testing


    【解决方案1】:

    我想你必须自己写。如果您想了解如何将现有的 deftest 用于自定义宏的示例,这里是一个示例 from the Tupelo library,它会根据行号自动为 deftest 组选择一个“名称”:

    (defmacro dotest [& body]
      (let [test-name-sym (symbol (str "dotest-line-" (:line (meta &form))))]
      `(clojure.test/deftest ~test-name-sym ~@body)))
    
    (dotest
      (is (= 5 (+ 2 3))))  ; works!
    

    您可以添加 println瞧!

    【讨论】:

      【解决方案2】:

      我记得,Eftest library 在运行测试时提供了漂亮的彩色输出,你可以看看。

      此外,标准的clojure.test 框架支持添加您自己的报告。检查Test report 库以获取参考。

      很可能,当从您的编辑器或 IDE 运行测试时,它可以提供彩色输出。这是我的 Cider 驱动的 Emacs 屏幕截图和失败报告:

      【讨论】:

        【解决方案3】:

        我已经多次搜索这个问题的答案,所以这里有一个完整的解决方案,基于@ivan-grishaev 的提示,使用Test Report

        测试报告与clojure.test 挂钩,以提供自定义报告器,然后在通过测试运行发生的每个事件时运行这些报告器。这些事件作为称为“消息”的映射传递。最小的例子只是将clojure.pprint/pprint 应用于消息,但这只能让你到目前为止。这里有更多代码让您了解如何编写自定义报告器。 indenting-reporter 缩进测试命名空间deftests 和testing vars,并列出它们与测试结果无关。

        在你的项目中创建一个这样的文件:

        (ns my.own.test-reporter
          (:require [clojure.pprint :refer [pprint]]
                    [clojure.test :as ct]
                    [clojure.core.match :refer [match]]))
        
        (defn simple-reporter [msg]
          (pprint msg))
        
        (defn indenting-reporter [msg]
          (match (:type msg)
                 :begin-test-ns (println (str "Testing " (:ns msg) "\n"))
                 :begin-test-var (println (str "  " (-> msg :var meta :name)))
                 :pass (do (println (str "    " (-> msg :context first) " :pass"))
                           (ct/inc-report-counter :pass))
                 :fail (do (println (str "    " (-> msg :context first) " :fail"))
                           (ct/inc-report-counter :fail))
                 :error (do (println (str "    " (-> msg :context first) " :error"))
                            (ct/inc-report-counter :error))
                 :end-test-ns (println)
                 :end-test-var ()
                 :summary (pprint msg)
                 :else (pprint msg)))
        

        然后在您的project.clj:test 个人资料中使用它:

        :injections [(require '[my.own.test-reporter :as tr])]
        :test-report {:reporters [tr/indenting-reporter]}
        

        您现在可以继续为输出添加颜色。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-06
          • 1970-01-01
          • 1970-01-01
          • 2019-04-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多