Как измерить время, затрачиваемое на пространство имен, для запуска тестов clojure?
Есть ли способ обработать код и выяснить, сколько времени занимает каждое пространство имен, или единственный выход - использовать приборы?
Каков хороший подход для решения такой проблемы?
1 ответ
Ваше предложение об использовании run-tests
над списком пространств имен будет работать.
Вот функция, которую я написал, чтобы зациклить когда-либо пространства имен в repl, перезагрузить их все, а затем запустить тесты для каждого 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
измерить сроки проведения испытаний по НС.
После добавления вы увидите цветной (не показанный) вывод, как этот, чтобы указать медленный тест:
LONG TEST in foo-api.handlers.foo-test during :clojure.test/once-fixtures
Test took 12.300 seconds seconds to run