Как измерить время, затрачиваемое на пространство имен, для запуска тестов 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
Другие вопросы по тегам