在测试期间,我们希望对unicode字符进行限定,有时候范围很宽,有时甚至更窄。我创建了一些特定的生成器:
// Generate a wide varying of Unicode strings with all legal characters (21-40 characters):
val latinUnicodeCharacter = Gen.choose('\u0041', '\u01B5').filter(Character.isDefined)
// Generate latin Unicode strings with all legal characters (21-40 characters):
val latinUnicodeGenerator: Gen[String] = Gen.chooseNum(21, 40).flatMap { n =>
Gen.sequence[String, Char](List.fill(n)(latinUnicodeCharacter))
}
// Generate latin unicode strings without whitespace (21-40 characters): !! COMES UP SHORT...
val latinUnicodeGeneratorNoWhitespace: Gen[String] = Gen.chooseNum(21, 40).flatMap { n =>
Gen.sequence[String, Char](List.fill(n)(latinUnicodeCharacter)).map(_.replaceAll("[\\p{Z}\\p{C}]", ""))
}
latinUnicodeCharacter
生成器从标准拉丁语(" A,"" B,"等)到最高阶拉丁字符(日耳曼语/北欧和其他人)。这对于测试名称等基于拉丁语的字符输入很有用。
latinUnicodeGenerator
创建长度为21-40个字符的字符串。这些字符串包括水平空格(不仅仅是空格字符,还有其他"水平空格")。
最后一个例子latinUnicodeGeneratorNoWhitespace
用于说电子邮件地址。我们想要拉丁字符,但我们不想要空格,控制代码等。 问题:因为我映射了最终结果String
并过滤掉了控制字符,String
缩小了,最终总长度减少了超过21个字符(有时)。
所以问题是:我如何实现latinUnicodeGeneratorNoWhitespace
但是在生成器内部以这样的方式执行它我总是得到21-40个字符串?
答案 0 :(得分:1)
您可以通过将一系列非空白字符,另一个空白字符组合在一起,然后从非空白字段或两者中选取一起来完成此操作:
import org.scalacheck.Gen
val myChars = ('A' to 'Z') ++ ('a' to 'z')
val ws = Seq(' ', '\t')
val myCharsGenNoWhitespace: Gen[String] = Gen.chooseNum(21, 40).flatMap { n =>
Gen.buildableOfN[String, Char](n, Gen.oneOf(myChars))
}
val myCharsGen: Gen[String] = Gen.chooseNum(21, 40).flatMap { n =>
Gen.buildableOfN[String, Char](n, Gen.oneOf(myChars ++ ws))
}
我建议您考虑一下您的测试内容,但是您对测试用例的限制越多,您检查程序对意外输入的行为方式就越少。