Clojure规范与基于属性的测试库有何不同,例如Haskell QuickCheck?

dil*_*van 3 testing clojure property-based-testing clojure.spec

其他语言有基于属性的测试库,如Haskell QuickCheck.如何Clojure的规格从这样的库有什么不同?或者它只是Clojure的基于属性的测试框架?

Tay*_*ood 8

Clojure的QuickCheck模拟器将是test.check.Clojure.spec依赖于test.check进行生成测试,但规范不仅仅用于测试.

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")
Run Code Online (Sandbox Code Playgroud)

这些生成器可用于为要测试其属性的函数生成输入数据.您可以使用test.check编写基于属性的测试,也可以使用clojure.spec为函数编写一些基于属性的测试.这是一个函数的示例,它接受一个字符串并返回"doubled"字符串:

(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)
Run Code Online (Sandbox Code Playgroud)

s/fdef规范定义的特性,我们从我们的功能想:它接受一个字符串,返回一个字符串,返回的字符串应该是只要输入两次.我们check用来确保这些属性适用于一堆随机生成的输入.

请查看概述指南以获取更多信息.