【问题标题】:Created unicode & unicode without whitespace generators in ScalaCheck在 ScalaCheck 中创建没有空格生成器的 unicode 和 unicode
【发布时间】:2015-05-22 20:46:14
【问题描述】:

在测试期间,我们想要限定 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 个字符串?

【问题讨论】:

    标签: scala unit-testing unicode scalacheck


    【解决方案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))
    }
    

    不过,我建议您考虑一下您真正测试的是什么——您对测试用例的限制越多,您检查程序在意外输入上的行为方式就越少。

    【讨论】:

    • 谢谢,这是一个很好的方法,我可以继续扩展。回答您的问题:我们正在测试电子邮件地址处理,电子邮件标准不需要空格。所以,基本上,我们想要 Unicode,但没有任何“水平空格”控制字符(几乎所有邮件服务器都不允许这样做)。
    • @Zac 很高兴它有帮助!如果有人已经为有效的电子邮件地址建立了Gen,我不会感到太惊讶——这可能值得一看。
    猜你喜欢
    • 2011-05-21
    • 2011-08-03
    • 2015-05-17
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2013-03-02
    相关资源
    最近更新 更多