3

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

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

4

2 回答 2

1

run-tests在命名空间列表上使用的建议将起作用。

这是我编写的一个函数,用于循环 repl 中的任何命名空间,重新加载它们,然后为每个 ns 运行测试。您可以根据自己的目的修改代码。您必须添加代码来捕获开始/结束时间并打印每个 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)
    ))
于 2016-10-19T13:37:53.337 回答
1

您可以使用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
于 2019-08-09T18:26:49.197 回答