Тест Clojure с несколькими утверждениями и отчетами
Я сталкиваюсь с некоторыми проблемами при составлении отчетов о сбоях с использованием инфраструктуры тестирования clojure.test.
Теперь я понимаю, что могу переопределить некоторые функции для разных отчетов, чтобы они распечатывались на консоли или там, где я хочу их печатать. Я также понимаю, что могу сохранить этот вывод в файл.
Моя проблема заключается в следующем... когда я объявляю deftest, как в этом примере:
(deftest test1
(is (= 1 1)
(is (= 2 1))
Этот тест будет запущен, и если я сделаю что-то вроде (run-tests)
или же (test-var #'test1)
он вернет ноль, но напечатает ошибки.
Я решил переопределить метод: fail для создания отчетов, потому что мне нужна карта сбоев, подобная этой: {"expected" (:expected m), "actual" (:actual m)}
и эта своего рода работает, если бы я просто использовал функцию отчетности.
Проблема в том, что когда вы запускаете тесты через платформу Clojure.test, вызывается много макросов, и они ведут себя не совсем так, как я хочу.
Моя конечная цель: запустить тесты и, если есть какие-то сбои, вместо их печати сохранить их на карту и вернуть мне карту. Если они все пройдут, мне все равно, что это мне вернет.
Это вообще возможно? Я не хочу прекращать тестирование, если какой-то тест не пройден, я просто хочу, чтобы он где-то был записан, предпочтительно карта.
Источники:
Тест Clojure с множественными утверждениями
https://clojure.github.io/clojure/branch-1.1.x/clojure.test-api.html
1 ответ
Боюсь, нет простого способа сделать это. Вы можете предоставить индивидуальную реализацию clojure.test/report :fail
defmethod и сохранить результат в атоме, но трудно распространить результат на внешние слои.
Если вы просто используете test-var
тогда это выполнимо, но обратите внимание, что тестовые приборы в этом случае не выполняются - см. test-vars
источник:
(:use clojure.test)
(deftest failing
(testing "fail me"
(is (= 1 0))
(is (= 2 1))
(is (= 3 2))))
(def test-failures (atom []))
(defmethod report :fail [m]
(swap! test-failures
(fn [previous-failures current-failure]
(conj previous-failures current-failure))
{:test-var-str (testing-vars-str m)
:expected (:expected m)
:actual (:actual m)}))
(defmethod report :end-test-var [m]
@test-failures)
(defn run-test-var [v]
(reset! test-failures [])
(test-var v))
;; in REPL:
(run-test-var #'failing)
;; =>
[{:test-var-str "(failing) (form-init4939336553149581727.clj:159)", :expected 1, :actual (0)}
{:test-var-str "(failing) (form-init4939336553149581727.clj:160)", :expected 2, :actual (1)}
{:test-var-str "(failing) (form-init4939336553149581727.clj:161)", :expected 3, :actual (2)}]
Есть также defmethod report :end-test-ns
но этот не очень полезен, потому что test-ns
функция возвращает @*report-counters*
,