Подтвердить что ты не робот

Сильные стороны структур тестирования Clojure?

Какой из них вы предпочитаете и почему? Каковы плюсы и минусы каждого? В каком сценарии каждый затмевает остальных?

Я особенно заинтересован в средстве по сравнению с clojure.test, но не стесняюсь приводить и другие рамки тестирования Clojure.

См. также Лучшая структура тестирования модулей для Clojure? (ответы на этот вопрос не содержали подробной информации о "почему" ).

4b9b3361

Ответ 1

Я не пробовал их всех, но мне нравится простой старый clojure.test по следующим причинам:

  • Он уже существует в Clojure API: никаких дополнительных зависимостей.
  • Интегрируется хорошо с Maven. Я использую Eclipse с clojure -maven-plugin, чтобы гарантировать, что оба теста Clojure и Java будут запускаться автоматически при каждом создании.
  • Простой: 99% того, что мне нужно для тестирования, - это просто написать хорошо структурированный набор утверждений, clojure.test делает это довольно простым.

Пример кода:

(testing "Arithmetic"
  (testing "with positive integers"
    (is (= 4 (+ 2 2)))
    (is (= 7 (+ 3 4))))
  (testing "with negative integers"
    (is (= -4 (+ -2 -2)))
    (is (= -1 (+ 3 -4)))))

Ответ 2

Я предпочитаю Midje. Midje предоставляет путь миграции от clojure.test к более гибкому, читабельному, абстрактному и грациозному стилю тестирования.

Midje поддерживает стили TDD сверху вниз, а также восходящие TDD-стили, а также издевается над ним, и некоторые мощные функции, такие как шашки, метаконстанты, табличные факты.

Midje wiki

Вот простой пример:

(fact "Midje can do simple stubbing"
  (+ (a) 2) => 5
  (provided 
    (a) => 3))

Ответ 3

Я предпочитаю expectations или clojure.test с humane-test-output. Оба параметра дают наиболее читаемые ошибки и обеспечивают довольно минимальный синтаксис.

clojure.test example

Учитывая следующий тест, вы получите следующий результат ниже.

(deftest map-comparisons
  (is (= {:sheep 1} {:cheese 1 :sheep 1})))

По умолчанию clojure.test output

FAIL in (map-comparisons) (map_test.clj:5)
expected: (= {:sheep 1} {:cheese 1, :sheep 1})
  actual: (not (= {:sheep 1} {:cheese 1, :sheep 1}))

Пример вывода clojure.test с гуманным тестовым выходом

FAIL in (map-comparisons) (map_test.clj:5)
expected: {:sheep 1}
  actual: {:cheese 1, :sheep 1}
    diff: + {:cheese 1}

пример ожиданий

Тест выглядит следующим образом:

(expect {:sheep 1} {:sheep 1, :cheese 1})

вывод ожиданий

failure in (map_expectations.clj:6) : example.map-expectations
(expect {:sheep 1} {:sheep 1, :cheese 1})

           expected: {:sheep 1}
                was: {:cheese 1, :sheep 1}

           in expected, not actual: null
           in actual, not expected: {:cheese 1}

Я сделал более подробное сравнение вывода четырех основных Clojure тестовых библиотек и которые можно найти здесь.