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

Testing Clojure规范与基于属性的测试库(如Haskell QuickCheck)有何不同?,testing,clojure,clojure.spec,property-based-testing,Testing,Clojure,Clojure.spec,Property Based Testing,其他语言有基于属性的测试库,如。与这些库有什么不同?或者它只是一个基于属性的测试框架?Clojure的QuickCheck模拟将是。Clojure.spec依赖于test.check进行生成性测试,但spec的用途远远不止于测试 Test.check为生成性和基于属性的测试提供了工具。spec允许您为数据编写规范,并可以根据这些规范自动创建生成器。单独使用test.check,您需要手动创建非平凡的生成器。使用clojure.spec,可以(除某些例外)从您的规范派生生成器 (s/def ::m

其他语言有基于属性的测试库,如。与这些库有什么不同?或者它只是一个基于属性的测试框架?

Clojure的QuickCheck模拟将是。Clojure.spec依赖于test.check进行生成性测试,但spec的用途远远不止于测试

Test.check为生成性和基于属性的测试提供了工具。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为函数编写一些基于属性的测试。下面是一个函数示例,该函数接受字符串并返回“加倍”字符串:

s/fdef
规范定义了我们想要从函数中获得的属性:它接受一个字符串,返回一个字符串,返回的字符串应该是输入的两倍长。我们使用
check
确保这些属性适用于一组随机生成的输入


查看和了解更多信息。

规范的区别在于它能够自动创建测试生成器?这也是spec和QuickCheck的区别吗?您能给出一些规范在测试之外使用的例子吗?没有理由将clojure.spec与test.check或任何其他基于属性的测试库进行比较;除了测试之外,它还有许多用途和目的,其核心是为数据结构编写规范。链接的概述很好地解释了这一点,并且链接的指南中有很多关于测试之外的规范使用的例子。当你说数据结构规范时,你是指人类消费吗?或者程序可以用它做些什么(除了测试)?是的,规范是人机可读的。例如,程序可以使用spec来断言某些数据(可能是用户输入)是否符合规范。在此基础上,还有类似的库可以以更易于理解的格式呈现规范问题。然后是将规范问题转化为最终用户友好的消息。简言之,规范的目标是创建可用于测试和人类消费的规范(有一些工具使其更易于人类阅读)。与其他工具(QuickCheck等)相比,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)