test.check 生成一定长度的字符串
test.check generate strings of a certain length
在使用 test.check 时,我需要一个特定长度字符串的生成器。 Phone 数字、邮政编码、社会安全号码都是此类数据的示例。虽然这些例子似乎只是数字,但我的问题是一般的字符串。
此函数将使用给定字母表中的字符生成给定长度的字符串(可选)。如果您不传递任何字母作为参数,将使用默认值,您当然可以更改。
(defn generate-string
([length]
(generate-string length
(map char (range 49 127))))
([length alphabet]
(apply str (take length (repeatedly #(rand-nth alphabet))))))
示例:
(generate-string 7 [\a \b \c])
"bacacbb"
(generate-string 10)
"mxqE<OKH3L"
给定 length
下面的生成器生成随机字符串:
(gen/fmap #(apply str %)
(gen/vector gen/char-alpha length))
(gen/vector gen/char-alpha length)
生成字符序列,然后 fmap
将它们转换为字符串:
(apply str [\a \b]) ;; => "ab"
如果需要自定义 alphabet
(比如 [\a \b \c]
),gen/char-alpha
可以替换为:
(gen/elements alphabet)
对于更复杂的生成器,例如格式化的 phone 数字,test.chuck 的 string-from-regex
可能是比手动组合官方生成器更好的选择。
您可以使用更原始的生成器来快速构建一个这样的生成器:
对于介于最小值和最大值之间的字母数字字符串:
(sgen/fmap str/join (sgen/vector (sgen/char-alphanumeric) min max))
对于恰好给定长度的字母数字字符串
(sgen/fmap str/join (sgen/vector (sgen/char-alphanumeric) length))
并且您可以根据需要的字符范围相应地修改 (sgen/char-alphanumeric)
,例如包含字母数字、下划线和短划线字符的 min/max 字符串,每个字符的频率不同出现:
(sgen/fmap str/join
(sgen/vector
(sgen/frequency [[99 (sgen/char-alphanumeric)]
[1 (sgen/elements #{"_" "-"})]])
min max))
在使用 test.check 时,我需要一个特定长度字符串的生成器。 Phone 数字、邮政编码、社会安全号码都是此类数据的示例。虽然这些例子似乎只是数字,但我的问题是一般的字符串。
此函数将使用给定字母表中的字符生成给定长度的字符串(可选)。如果您不传递任何字母作为参数,将使用默认值,您当然可以更改。
(defn generate-string
([length]
(generate-string length
(map char (range 49 127))))
([length alphabet]
(apply str (take length (repeatedly #(rand-nth alphabet))))))
示例:
(generate-string 7 [\a \b \c])
"bacacbb"
(generate-string 10)
"mxqE<OKH3L"
给定 length
下面的生成器生成随机字符串:
(gen/fmap #(apply str %)
(gen/vector gen/char-alpha length))
(gen/vector gen/char-alpha length)
生成字符序列,然后 fmap
将它们转换为字符串:
(apply str [\a \b]) ;; => "ab"
如果需要自定义 alphabet
(比如 [\a \b \c]
),gen/char-alpha
可以替换为:
(gen/elements alphabet)
对于更复杂的生成器,例如格式化的 phone 数字,test.chuck 的 string-from-regex
可能是比手动组合官方生成器更好的选择。
您可以使用更原始的生成器来快速构建一个这样的生成器:
对于介于最小值和最大值之间的字母数字字符串:
(sgen/fmap str/join (sgen/vector (sgen/char-alphanumeric) min max))
对于恰好给定长度的字母数字字符串
(sgen/fmap str/join (sgen/vector (sgen/char-alphanumeric) length))
并且您可以根据需要的字符范围相应地修改 (sgen/char-alphanumeric)
,例如包含字母数字、下划线和短划线字符的 min/max 字符串,每个字符的频率不同出现:
(sgen/fmap str/join
(sgen/vector
(sgen/frequency [[99 (sgen/char-alphanumeric)]
[1 (sgen/elements #{"_" "-"})]])
min max))