Чем спецификация Clojure отличается от библиотек тестирования на основе свойств, таких как Haskell QuickCheck?

Другие языки имеют библиотеки тестирования на основе свойств, например, Haskell QuickCheck. Чем спецификация Clojure отличается от таких библиотек? Или это просто среда тестирования на основе свойств для Clojure?

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 spec определяет свойства, которые мы хотим от нашей функции: она берет одну строку, возвращает строку, а возвращаемая строка должна быть вдвое длиннее входных данных. Мы используем check чтобы убедиться, что эти свойства сохраняются для группы случайно сгенерированных входных данных.

Взгляните на обзор и руководство для более.

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