Как мне измерить время, затрачиваемое на пространство имен для запуска тестов clojure?

#unit-testing #clojure #tdd #clojure.test

#модульное тестирование #clojure #tdd #clojure.test

Вопрос:

Есть ли способ обработать код и выяснить, сколько времени занимает каждое пространство имен, или единственный способ — использовать приспособления?

Какой хороший подход для решения такой проблемы?

Комментарии:

1. Зачем вам это нужно? Для сравнительного анализа? Обычно для этого требуются некоторые подготовительные шаги , а не простой запуск.

2. @OlegTheCat Я предполагаю, что это не для повторного запуска тестов производительности вашего производственного кода, а для понимания того, какие тесты медленные, чтобы вы могли их улучшить.

3. Хорошо, тогда в чем проблема с приспособлениями? AFAIK, :once fixture переносит все тесты в конкретное пространство имен. Таким образом, можно получить временные метки до и после запуска и вычислить разницу.

4. @OlegTheCat У меня 145 пространств имен, и я действительно не хочу сидеть и помещать код в приспособления. Было интересно, будет ли хорошим решением использование тестов выполнения над списком пространств имен?

Ответ №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 amp; the corresponding test namespace from disk and
  execute tests in the REPL.  Assumes canonical project test file organization with
  parallel src/... amp; 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."
  [amp; 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 " amp; " curr-ns-test))
                         (require curr-ns curr-ns-test :reload)
                         curr-ns-test))
        ]
    (println "-----------------------------------------------------------------------------")
    (apply clojure.test/run-tests test-ns-list)
    (println "-----------------------------------------------------------------------------")
    (newline)
    ))
  

Ответ №2:

Вы можете использовать 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