单元测试的Unicode测试字符串

Unicode test strings for unit tests

本文关键字:字符串 测试 Unicode 单元测试      更新时间:2023-10-16

我需要一些Utf32测试字符串来练习一些跨平台的字符串操作代码。我想要一套测试字符串,用于执行utf32<->utf16<->utf8编码,以验证BMP之外的字符可以从utf32转换,通过utf16代理,通过utf8,再转换回来。正确地

如果有问题的字符串不仅仅由随机字节组成,而且在它们编码的(各种)语言中都有意义,我总是觉得这会更优雅一些。

虽然这不是您所要求的,但我一直觉得这个测试文档很有用。

http://www.cl.cam.ac.uk/~mgk25/ucs/示例/UTF-8-test.txt

同一网站提供此

http://www.cl.cam.ac.uk/~mgk25/ucs/examples/quickbrown.txt

这相当于英语的"Quick brown fox"文本,它练习了各种语言中使用的所有字符。这个页面引用了维基百科上的一个更大的"穿山甲"列表,但显然在那里被删除了。它仍然在这里可用:

http://clagnut.com/blog/2380/

https://github.com/noct/cutf/tree/master/bin

包括以下文件:

UTF-8-demo.txt
big.txt
quickbrown.txt
utf8_invalid.txt

要真正测试格式之间所有可能的转换,而不是字符转换(即towupper()towlower()),您应该测试所有字符。下面的循环提供了所有这些:

for(wint_t c(0); c < 0x110000; ++c)
{
    if(c >= 0xD800 && c <= 0xDFFF)
    {
        continue;
    }
    // here 'c' is any one Unicode character in UTF-32
    ...
}

这样你就可以确保你不会错过任何东西(即100%完成测试。)这只有1112065个字符,所以用现代计算机会很快。


注意,对于编码之间的基本转换,我上面的循环已经足够了。然而,Unicode中还有其他功能,需要测试在一起使用时表现为不同的字符对。这在这里真的没有必要。

此外,我现在有一个单独的C++libutf8库,用于在UTF-32、UTF-16和UTF-8之间转换字符。测试使用如上所示的循环。测试还验证使用无效字符代码是否被正确捕获。

你可以通过谷歌搜索找到很多附带的数据(在SO…上,类似问题请参见右栏)

不过,我建议您将测试字符串构建为字节数组。这实际上并不是关于"什么数据",只是unicode得到了正确的处理。

例如,您需要确保不同规范化形式(即,即使不是规范化形式)的相同字符串比较起来仍然相等。

您需要检查字符串长度检测是否稳健(能够识别单字节、双字节、三字节和四字节字符)。您需要检查从开始到结束遍历字符串是否遵循相同的逻辑。针对unicode字符随机访问的更有针对性的测试。

我相信这些都是你知道的。我把它们拼出来只是为了提醒您,您需要完全满足边缘情况的测试数据,即Unicode固有的逻辑属性。

只有这样,您才能获得正确的测试数据。


超出这个范围(技术上正确的Unicode处理)是实际的本地化(排序、字符集转换等)

以下是有用的链接:

  • http://minaret.info/test/collate.msp
  • http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html

你可以试试这个(有一些俄语、希腊语、汉语等句子来测试Unicode):

http://www.madore.org/~david/misc/unitest/