[英]Clojure.spec: how to spec data structures sensitive to random changes?
我正在嘗試使用clojure.spec進行交互式開發,並且函數參數的規范有一個問題,該問題不能改變太多。 例如,如果一個函數接收文件名作為參數,我可以編寫以下規范:
(s/def ::file-name string?)
(s/fdef test-fn :args (s/cat :x ::file-name))
如果我鍛煉它:
(s/exercise-fn `test-fn)
該功能將使用大量隨機文件名進行測試,這些文件名將無法讀取任何文件。 可以將文件名限制為一組有效和無效的文件名。 這對於測試來說很好,但是它將使規范特定於所選集。
這不僅是文件名,而且是任何復雜的數據結構,即使是很小的隨機更改也可能使其無用的問題。
我該怎么辦? 有相關技術或良好做法嗎?
這對於測試來說很好,但是它將使規范特定於所選集。
這是定制生成器有用的地方:
(s/def ::file-name
(s/with-gen string? #(gen/elements #{"good.txt" "bad.txt"})))
(s/fdef test-fn :args (s/cat :x ::file-name))
(當gen
為clojure.test.check.generators
或clojure.spec.gen.alpha
。)
現在您的規范的謂詞仍然是string?
但根據此規范生成的值將始終來自#{"good.txt" "bad.txt"}
。 您可以通過幾種方式來組合生成器 ,例如,您可以使生成器從大約50%的時間中使用字符串集,並為其余的50%生成純“隨機”字符串。
僅供參考, clojure.spec.test.alpha/check
還帶有一個opts
映射,可用於覆蓋/指定生成器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.