其他语言有属性测试库,比如Haskell QuickCheck。Clojure spec与这些库有何不同?还是它只是一个针对Clojure的属性测试框架?
其他语言有属性测试库,比如Haskell QuickCheck。Clojure spec与这些库有何不同?还是它只是一个针对Clojure的属性测试框架?
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")
(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)
< p > s/fdef
规范定义了我们从函数中希望得到的属性:它接受一个字符串,返回一个字符串,而且返回的字符串应该是输入的两倍长。我们使用 check
来确保这些属性对一堆随机生成的输入都成立。