test.check generate strings of a certain length
在使用 test.check 时,我需要一个生成器来生成一定长度的字符串。电话号码、邮政编码、社会安全号码都是此类数据的示例。尽管这些示例似乎只是数字,但我的问题是一般的字符串。
给定
1 2 | (gen/fmap #(apply str %) (gen/vector gen/char-alpha length)) |
1 | (apply str [\\a \\b]) ;; =>"ab" |
如果需要自定义
1 | (gen/elements alphabet) |
对于更复杂的生成器,例如格式化的电话号码,test.chuck 的
您可以使用更原始的生成器来快速构建一个这样的生成器:
对于介于 min 和 max 之间的字母数字字符串:
1 | (sgen/fmap str/join (sgen/vector (sgen/char-alphanumeric) min max)) |
对于给定长度的字母数字字符串
1 | (sgen/fmap str/join (sgen/vector (sgen/char-alphanumeric) length)) |
并且您可以根据您的字符范围需要修改
1 2 3 4 5 | (sgen/fmap str/join (sgen/vector (sgen/frequency [[99 (sgen/char-alphanumeric)] [1 (sgen/elements #{"_""-"})]]) min max)) |
此函数将使用给定字母表中的字符生成给定长度的字符串(可选)。如果您不传递任何字母作为参数,则将使用默认值,您当然可以更改。
1 2 3 4 5 6 | (defn generate-string ([length] (generate-string length (map char (range 49 127)))) ([length alphabet] (apply str (take length (repeatedly #(rand-nth alphabet)))))) |
示例:
1 2 3 4 5 | (generate-string 7 [\\a \\b \\c]) "bacacbb" (generate-string 10) "mxqE<OKH3L" |