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

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


person dilvan    schedule 18.10.2017    source источник
comment
Также посмотрите, что такое спецификация stackoverflow.com/a/38518300/1327651.   -  person nha    schedule 19.10.2017


Ответы (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, чтобы убедиться, что эти свойства сохраняются для группы случайно сгенерированных входных данных.

Взгляните на обзор и руководство для получения дополнительной информации.

person Taylor Wood    schedule 18.10.2017
comment
Что отличает спецификацию от test.check? Только ее способность автоматически создавать генераторы тестов? Это также то, что отличает спецификацию от QuickCheck? Не могли бы вы привести несколько примеров использования спецификаций вне тестирования? - person dilvan; 19.10.2017
comment
Нет причин сравнивать clojure.spec с test.check или любой другой библиотекой тестирования на основе свойств; он имеет множество применений и целей помимо тестирования, ядром которого является написание спецификаций для структур данных. Связанный обзор отлично объясняет это, а связанное руководство содержит множество примеров использования спецификаций вне тестирования. - person Taylor Wood; 19.10.2017
comment
Когда вы говорите о спецификациях для структур данных, вы имеете в виду их использование человеком? Или есть что-то, что программа может с ним сделать (помимо тестирования)? - person dilvan; 19.10.2017
comment
В руководстве я нашел примеры спецификации, тестирования, объяснения результатов тестирования (нарушения спецификации) и генераторов. В вопросе что такое спецификация я нашел Conform значение, которое дает вам проанализированную и деструктурированную версию значения вне тестирования. - person dilvan; 19.10.2017
comment
Да, спецификации читаются как человеком, так и машиной. Например, программа может использовать спецификацию, чтобы утверждать, что некоторые данные (возможно, введенные пользователем) соответствуют спецификации. Основываясь на этом, существуют библиотеки, такие как Expound, которые могут отображать проблемы со спецификациями в более удобном для человека формате. Затем есть Phrase, которая предназначена для превращения проблем со спецификациями в удобные для конечных пользователей сообщения. - person Taylor Wood; 19.10.2017
comment
В двух словах, цель спецификации — создать спецификации, которые можно использовать для тестирования и для потребления человеком (есть инструменты, чтобы сделать их более понятными для человека). По сравнению с другими инструментами (QuickCheck и т. д.) спецификация является более выразительной, позволяя использовать описания вместо текстовых спецификаций. Я правильно понял? - person dilvan; 20.10.2017