Другие языки имеют библиотеки тестирования на основе свойств, такие как Haskell QuickCheck. Чем Clojure spec отличается от таких библиотек? Или это просто среда тестирования на основе свойств для Clojure?
Чем спецификация Clojure отличается от библиотек тестирования на основе свойств, таких как Haskell QuickCheck?
Ответы (1)
Аналогом Clojure для QuickCheck будет test.check. Clojure.spec использует test.check для генеративного тестирования, но spec можно использовать не только для тестирования.
Test.check предоставляет инструменты для генеративного тестирования и тестирования на основе свойств. Clojure.spec позволяет вам писать спецификации для данных и может автоматически создавать генераторы из этих спецификаций. Используя только test.check, вам нужно будет создавать нетривиальные генераторы вручную. С помощью clojure.spec генераторы могут (за некоторыми исключениями) быть производными от вашей спецификации.
(s/def ::my-spec string?) ;; a trivial spec, any string will do
(sgen/sample (s/gen ::my-spec)) ;; create a generator from spec and get samples
;;=> ("" "P" "B" "" "qV" "im4P" "Zf" "" "rL24" "wAV7z")
Эти генераторы можно использовать для создания входных данных для функций, свойства которых вы хотите протестировать. Вы можете написать тесты на основе свойств, используя только test.check, а также вы можете написать некоторые тесты на основе свойств для функций, используя clojure.spec. Вот пример функции, которая принимает строку и возвращает «удвоенную» строку:
(defn doubler [s] (str s s))
(s/fdef doubler
:args (s/cat :s string?)
:ret string?
:fn (fn [{:keys [args ret]}]
(= (* 2 (count (:s args))) (count ret))))
(stest/check `doubler)
Спецификация s/fdef
определяет свойства, которые мы хотим получить от нашей функции: она принимает одну строку, возвращает строку, а возвращаемая строка должна быть в два раза длиннее входной. Мы используем check
, чтобы убедиться, что эти свойства сохраняются для группы случайно сгенерированных входных данных.
Взгляните на обзор и руководство для получения дополнительной информации.