如何测量每个命名空间 运行 clojure 测试所用的时间?

How do I measure time taken per namepace to run clojure tests?

有没有办法检测代码并找出每个命名空间需要多少时间,或者唯一的方法是使用固定装置?

解决此类问题的好方法是什么?

您关于在命名空间列表上使用 run-tests 的建议会奏效。

这是我编写的一个函数,用于循环 repl 中的所有名称空间,重新加载它们,然后 运行 测试每个 ns。您可以根据自己的目的修改代码。您必须添加代码来捕获 starting/ending 时间并打印每个 ns 的经过时间。

正如文档字符串所说,此代码假定命名空间设置如下:

    myproj.myfeat      ; main namespace
tst.myproj.myfeat      ; testing namespace

因此,只需根据设置的需要删除或修改带有 (symbol (str "tst." curr-ns)) 的部分。您可能希望使用 all-ns 获取所有名称空间的列表,然后删除或忽略非测试名称空间。祝你好运!

(defn ^:deprecated ^:no-doc test-all
  "Convenience fn to reload a namespace & the corresponding test namespace from disk and
  execute tests in the REPL.  Assumes canonical project test file organization with
  parallel src/... & test/tst/... directories, where a 'tst.' prefix is added to all src
  namespaces to generate the cooresponding test namespace.  Example:

    (test-all 'tupelo.core 'tupelo.csv)

  This will reload tupelo.core, tst.tupelo.core, tupelo.csv, tst.tupelo.csv and
  then execute clojure.test/run-tests on both of the test namespaces."
  [& ns-list]
  (let [test-ns-list (for [curr-ns ns-list]
                       (let [curr-ns-test (symbol (str "tst." curr-ns))]
                         (println (str "testing " curr-ns " & " curr-ns-test))
                         (require curr-ns curr-ns-test :reload)
                         curr-ns-test))
        ]
    (println "-----------------------------------------------------------------------------")
    (apply clojure.test/run-tests test-ns-list)
    (println "-----------------------------------------------------------------------------")
    (newline)
    ))

您可以使用 eftest:test-warn-time 来测量每个 NS 的测试时间。

添加后,您会看到像这样的彩色(未显示)输出,表示测试速度较慢:

LONG TEST in foo-api.handlers.foo-test during :clojure.test/once-fixtures
Test took 12.300 seconds seconds to run