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

时间:2009-01-20 15:06:09

标签: java unit-testing junit

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

现在,出现了一些问题:

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

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

  

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

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

  

如何设置编码?

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

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

的构造函数中

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

您可以使用脚本语言对测试进行编码。

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."""

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

答案 4 :(得分:0)

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

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

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