Тест 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

https://groups.google.com/forum/

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*,

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