【问题标题】:How to handle large strings in unit tests?如何在单元测试中处理大字符串?
【发布时间】:2009-01-20 15:06:09
【问题描述】:

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

现在,出现了一些问题:

  • 如何在测试字符串中包含 \n、\r、\t、变音符号等?
  • 如何设置编码?
  • 我应该使用由 FileInputStream 打开的外部文件吗? (太多开销,恕我直言)

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

【问题讨论】:

    标签: java unit-testing junit


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

    【讨论】:

    • 所以你建议在单元测试中使用字符串文字?即使它们很长(例如 200 行?)
    • 这是为了方便。如果您认为它们足够长,可以放入外部文件,并开始在测试中处理 I/O,那么就这样做。否则,是的,将它们保留在测试中,但要很好地组织它们。
    【解决方案2】:

    如何在测试字符串中包含\n、\r、\t、变音符号等?

    嗯...按您想要的方式输入?您可以使用 \n、\r 和 \t、变音符号 stc。在 Java 字符串文字中;如果担心源代码文件的编码,可以使用Unicode escape sequences,也可以使用JDK自带的native2ascii工具生成。

    如何设置编码?

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

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

    【讨论】:

      【解决方案3】:

      对于大字符串,我会使用文件。对于单元测试,性能足够快。为了这个小小的权衡,你:

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

      【讨论】:

        【解决方案4】:

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

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

        这也将使您的测试代码更容易编写,因为这两种语言都有许多有助于编写更简单代码的快捷方式(但有些人可能会说不太健壮,如果只是单元测试代码,这并不重要)。

        【讨论】:

        • 我不明白你的想法。为什么我应该编写一个java类的测试?
        • 不是脚本,而是用 Groovy/JRuby 编写实际测试。不确定 JRuby,但您在 Groovy 中具有 java 互操作性,因此可以使用 Groovy 测试您的类。
        【解决方案5】:

        如果您反复使用文字字符串中难以表达的字符(例如"\[ -~] 中没有的字符),那么您可能需要考虑在使用它之前的字符串。例如,如果您经常使用 \,那么您可能会编写一个函数来交换 \ 和 /。您可以使用多字符序列来表示重音字符。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-30
          • 2020-09-14
          • 1970-01-01
          • 2021-06-19
          • 1970-01-01
          • 2019-07-07
          • 2018-09-14
          • 2018-02-25
          相关资源
          最近更新 更多