#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