Сильные стороны структур тестирования Clojure?
Какой из них вы предпочитаете и почему? Каковы плюсы и минусы каждого? В каком сценарии каждый затмевает остальных?
Я особенно заинтересован в средстве по сравнению с clojure.test, но не стесняюсь приводить и другие рамки тестирования Clojure.
См. также Лучшая структура тестирования модулей для Clojure? (ответы на этот вопрос не содержали подробной информации о "почему" ).
Ответы
Ответ 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 тестовых библиотек и которые можно найти здесь.