繁体   English   中英

如何在单元测试中处理大字符串?

[英]How to handle large strings in unit tests?

我有一个关于测试字符串的测试方法的问题。 每次,我都会在一个以字符串作为参数的方法上编写新的测试。

现在,出现了一些问题:

  • 如何使用\\ n,\\ r,\\ t,\\ t,umlauts等包含测试字符串?
  • 如何设置编码?
  • 我应该使用由FileInputStream打开的外部文件吗? (太多开销,imho)

那么......你有什么方法可以解决这个问题?

  • 如果你有很多,请将测试字符串保存在带字符串consts的单独类中
  • 除非必须,否则尽量不要将文件保留在磁盘上。 我同意你的说法 - 这会带来太多的开销(更不用说如果你开始得到I / O错误会发生什么)
  • 确保为不同的操作系统测试具有不同换行符( \\n\\r\\n\\r\\n\\r )的字符串

如何使用\\ n,\\ r,\\ t,\\ t,umlauts等包含测试字符串?

嗯......只需按照你想要的方式输入它? 你可以使用\\ n,\\ r和\\ t,umlauts stc。 in Java String literals; 如果您担心源代码文件的编码,可以使用Unicode转义序列 ,并且可以使用JDK附带的native2ascii工具生成它们。

如何设置编码?

一旦你有了一个Java字符串,就不用担心编码了 - 它们使用UTF-16,并且在字符串和字节数组之间进行转换时会出现任何编码问题(与C不同,Java使这些概念明显分开)

编辑:如果您的字符串太大而无法在源代码中使用,或者您真的担心换行符和空格的处理,那么将每个字符串保存在单独的文件中可能是最好的; 在这种情况下,必须在读取文件时指定编码(在InputStreamReader的构造函数中)

对于LARGE字符串,我会使用文件。 性能足够快,足以进行单元测试。 对于那个小小的权衡,你:

  1. 不必担心逃避角色
  2. 可以在源代码管理中区分内容
  3. 可以独立验证文档(即xml / html)

您可以使用脚本语言来编写测试代码。

JRubyGroovy支持HERE文档,这样可以更容易地定义跨越多行的大字符串

# In JRuby
mystring = <<EOS
This is a long string that
spans multiple lines.
EOS

# In Groovy
def mystring = """This is a long string that
spans multiple lines."""

这也将使您的测试代码更容易编写,因为这两种语言都有很多快捷方式可以帮助编写更简单的代码(但有些人可能会说这些代码不那么健壮,如果它只是单元测试代码那么无关紧要)。

如果您反复使用难以在文字字符串中表达的字符(例如"\\ ,字符不在[ -~] ),那么您可能需要考虑在使用字符串之前对字符串进行快速查找和替换。例如,如果您使用\\很多,那么您可能会使用一个函数来交换\\和/。您可以使用多字符序列来表示重音字符。

但是,最终找到与问题不成比例的解决方案存在明显的危险。 有时\\u####更容易。

如果您要使用非Java文件,我建议将它们作为资源( Class.getResourceAsStream / getResource )而不是作为松散文件打开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM