Как вывести успешные тесты из `lein test`?

Использование clojure.test, при запуске lein testв настройках по умолчанию выводится только количество утверждений, например "Выполнено 12 тестов, содержащих 19 подтверждений", сведения о неудачных тестах и ​​проверенные пространства имен. Я хотел бы также получить результаты успешных тестов, чтобы я мог видеть, какие тесты были на самом деле запущены. Фреймворки, такие как Mocha в JS, имеют такое поведение по умолчанию.

Например, если прошел следующий тест:

(deftest aTest
  (testing "Simple test"
      (is (= 1 1))))

Я хотел бы вывод, как (форматирование произвольно):

Testing <namespace>
    Passed: aTest -> Simple test

В идеале, пройденный тест также должен иметь цветовую кодировку.

Я просмотрел несколько библиотек, в том числе lein-test-refresh и humane-test-output, но не увидел, что мне нужно. Другой вариант выглядит как переписать функцию отчета в clojure.test, но я хотел бы избежать этого, если это возможно.

3 ответа

Я несколько раз искал ответ на этот вопрос, поэтому вот полное решение, основанное на подсказке @ivan-grishaev с использованием протокола испытаний:

Протокол испытаний подключается clojure.test предоставлять настраиваемых репортеров, которые затем запускаются при каждом событии, происходящем во время тестового прогона. Эти события передаются в виде карт, называемых "сообщениями". Минимальный пример только применимclojure.pprint/pprint к сообщениям, но это только дает вам так далеко. Вот немного больше кода, чтобы вы почувствовали, как писать нестандартные репортеры. indenting-reporter отступы тестируют пространства имен, deftestс и testing vars, и перечисляет их все независимо от результата теста.

Создайте такой файл в своем проекте:

(ns my.own.test-reporter
  (:require [clojure.pprint :refer [pprint]]
            [clojure.test :as ct]
            [clojure.core.match :refer [match]]))

(defn simple-reporter [msg]
  (pprint msg))

(defn indenting-reporter [msg]
  (match (:type msg)
         :begin-test-ns (println (str "Testing " (:ns msg) "\n"))
         :begin-test-var (println (str "  " (-> msg :var meta :name)))
         :pass (do (println (str "    " (-> msg :context first) " :pass"))
                   (ct/inc-report-counter :pass))
         :fail (do (println (str "    " (-> msg :context first) " :fail"))
                   (ct/inc-report-counter :fail))
         :error (do (println (str "    " (-> msg :context first) " :error"))
                    (ct/inc-report-counter :error))
         :end-test-ns (println)
         :end-test-var ()
         :summary (pprint msg)
         :else (pprint msg)))

а затем использовать его в :test профиль вашего project.clj:

:injections [(require '[my.own.test-reporter :as tr])]
:test-report {:reporters [tr/indenting-reporter]}

Теперь вы можете добавить цвет к выводам.

Я думаю, тебе придется написать это самому. Если вы хотите, чтобы пример того, как использовать существующие deftest в пользовательский макрос, вот пример из библиотеки Tupelo, который автоматически выбирает "имя" для группы deftest на основе номера строки:

(defmacro dotest [& body]
  (let [test-name-sym (symbol (str "dotest-line-" (:line (meta &form))))]
  `(clojure.test/deftest ~test-name-sym ~@body)))

(dotest
  (is (= 5 (+ 2 3))))  ; works!

Вы можете просто добавить в println и вуаля!

Я помню, библиотека Eftest обеспечивает хороший цветной вывод при запуске тестов, вы можете посмотреть.

Также стандарт clojure.test Framework поддерживает добавление ваших собственных отчетов. Проверьте справочную библиотеку отчетов для справки.

Возможно, при запуске тестов из вашего редактора или IDE, он может обеспечить цветной вывод. Вот мой скриншот Emacs на базе Cider с отчетом об ошибках:

Другие вопросы по тегам