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

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

问题描述:

其他语言有基于属性的测试库,如Haskell QuickCheckClojure spec与这些库有什么不同?或者它只是一个基于财产的测试框架ClojureClojure规范与基于属性的测试库(如Haskell QuickCheck)有何区别?

+2

另请参阅“什么是规格”https://*.com/a/38518300/1327651 – nha

用于QuickCheck的Clojure的模拟将是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来确保这些属性适用于一堆随机生成的输入。

查看overviewguide了解更多信息。

+0

从[test.check](https://github.com/clojure/test.check)区分spec是什么只有它能够自动创建测试生成器?这也是从QuickCheck中区分出的规格吗?您能否介绍一些测试以外的规格使用示例? – dilvan

+1

没有理由将* clojure.spec与test.check或任何其他基于属性的测试库进行比较;它具有超出测试的许多用途和用途,其核心是为数据结构编写*规范*。链接的概述很好地解释了这一点,链接的指南有很多测试以外的规范使用的例子。 –

+0

当你说数据结构的规范,你的意思是人类消费?或者有什么程序可以用它来做(除了测试)? – dilvan