如何使用test.check编写生成纯字母字符串的自定义生成器
test.check 自定义纯字母字符串生成器实现方案
推荐实现(性能最优)
直接基于内置的单字符字母生成器gen/char-alpha拼接实现,无过滤开销,稳定性最高:
(require '[clojure.test.check.generators :as gen] '[clojure.string :as str]) ;; 生成任意长度的纯字母字符串 (def string-alpha (gen/fmap str/join (gen/vector gen/char-alpha))) ;; 如果需要限定字符串长度范围,比如2-15位,修改gen/vector参数即可 (def string-alpha-2-15 (gen/fmap str/join (gen/vector gen/char-alpha 2 15)))
说明:
gen/char-alpha是test.check内置生成器,仅输出大小写英文字母,不含数字、符号gen/vector将单字符生成器封装为指定长度范围的字符序列生成器,不传长度参数时默认生成0到20个元素的序列gen/fmap对生成的字符序列执行str/join操作,拼接为最终字符串
备选实现(过滤法,不推荐长字符串场景)
如果想基于现有gen/string-alphanumeric实现,也可以通过正则过滤掉包含数字的结果,仅适合生成短字符串场景,长字符串容易触发生成重试上限报错:
(def string-alpha ;; 第三个参数为最大重试次数,默认10次,这里调整为100降低报错概率 (gen/such-that #(not (re-find #"\d" %)) gen/string-alphanumeric 100))
内容的提问来源于stack exchange,提问作者triplej
相关产品推荐
相关产品推荐

