验证组件是否可以保存/检索UTF8编码字符串的最小测试是什么

six*_*ude 5 java string encoding utf-8

我是集成测试组件.该组件允许您保存和获取字符串.

我想验证组件是否正确处理UTF-8字符.验证这一点需要的最低测试是什么?

我认为做这样的事情是一个好的开始:

// This is the ? character
String toSave = "\u263A";
int id = 123;

// Saves to Database
myComponent.save( id, toSave );

// Retrieve from Database
String fromComponent = myComponent.retrieve( id );

// Verify they are same 
org.junit.Assert.assertEquals( toSave, fromComponent );
Run Code Online (Sandbox Code Playgroud)

我过去犯过的一个错误就是我已经确定了String toSave = "è".我的测试通过了,因为字符串已正确保存到数据库并从数据库中正确检索.不幸的是,该应用程序实际上并没有正常工作,因为该应用程序使用的是ISO 8859-1编码.这意味着è工作,但其他像☺的人没有.

重述问题:验证我是否可以持久保存UTF-8编码字符串的最低测试(或测试)是什么?

Mik*_*kis 1

如果您的组件只能存储和检索字符串,那么您所需要做的就是确保在 java 的 Unicode 字符串与组件存储的 UTF-8 字符串之间的转换中不会丢失任何内容。

这将涉及检查每个UTF-8 代码点 length中的至少一个字符。所以,我建议检查:

  • US-ASCII 集中的一个字符(1 字节长的代码点),然后

  • 来自希腊语的一个字符(2 字节长的代码点)和

  • 中文中的一个字符(3 个字节长的代码点。)

  • 理论上,您还需要检查表情符号(4 字节长的代码点),尽管这些不能用 java 的 Unicode 字符串表示,所以它是有争议的。

一种有用的额外测试是尝试将上述每种情况中的至少一个字符组合在一起的字符串,以确保不同代码点长度的字符可以在同一字符串中共存。

(如果您的组件除了存储和检索字符串之外还执行其他操作,例如搜索字符串,那么事情可能会变得更加复杂,但在我看来,您特意避免询问这一点。)

我确实相信黑盒测试是唯一有意义的测试,因此我不建议使用会暴露组件内部知识的方法来污染组件的接口。但是,您可以执行以下两件事来提高组件的可测试性而不破坏其接口:

  1. 向接口引入可能有助于测试的附加功能,而无需公开有关内部实现的任何信息,并且不需要测试代码必须了解组件的内部实现。

  2. 在组件的构造函数中引入对测试有用的功能。构造组件的代码准确地知道它正在构造什么组件,因此它非常熟悉组件的性质,因此可以在那里传递特定于实现的东西。

您可以使用上述任何技术执行的操作的一个示例是人为地严格限制允许内部表示占用的字节数,以便您可以确保您计划存储的某个字符串适合。因此,您可以将内部大小限制为不超过 9 个字节,然后确保包含 3 个中文字符的 java unicode 字符串得到正确存储和检索。