2017-10-18 45 views

回答

7

用於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

相關問題