【问题标题】:File reading and testable code文件读取和可测试代码
【发布时间】:2009-06-18 06:16:49
【问题描述】:

我有一段 java 代码,它从文件中读取字符串并从字符串中创建一个映射。由于此代码依赖于文件,因此单元测试很笨拙。如何设计这样的部分以使代码可以进行单元测试?

我能想到的一种方法是,本文不采用文件作为参数,而是采用输入流。在实际场景中,传递文件输入流,而单元测试传递从字符串创建的输入流。但是,这对我来说似乎是一种过度杀戮。有没有更好的办法?

【问题讨论】:

  • 3 个重要问题:您的测试数据文件有多大?编写一个好的测试用例需要多少个不同的测试数据文件?您可以轻松地即时生成测试数据,还是需要我手动准备?
  • 1.测试数据文件不大。可能包含大约 100 个字。 2. 我的测试只需要一个文件。 3. 是的,数据必须手动准备,不能即时生成。

标签: java unit-testing


【解决方案1】:

如果您对文件所做的所有操作都是读取它,则不提供从InputStream 读取的函数是设计错误。因此,修改函数以采用InputStream,并提供采用File 的包装器。使用ByteArrayInputStream 或 StringInputStream 来测试就可以了。

【讨论】:

    【解决方案2】:

    这样看:无论您如何重组代码,测试数据都必须来自 some 文件。我看到 2 个变体:

    1. 数据在 .java 单元测试源代码文件之一中就地编码。它仅适用于小型测试数据集。正如您所描述的,您需要重构代码以获取输入流并拥有另一个与文件一起使用的包装器。

    2. 测试数据文件。你必须创建一个 项目范围的约定在哪里保存测试 数据文件。他们的位置可能是 相对于jave项目 位置,或在共同测试下 数据文件根。无论如何,它有帮助 有一个实用方法 返回给定“逻辑”文件名的完整测试数据文件路径。

    在您的情况下(仅一个测试,一百个单词),第一个解决方案似乎就足够了。是的,您需要稍微重构一下代码。第二种解决方案更通用,我个人觉得它更实用和适用。

    如果它适用于数据文件,有些人会说这不是单元测试。好吧,这是“单元测试”的定义问题,并且完全无关紧要。如果您需要测试您的代码,只需为您的项目找到最佳/最方便的方法

    【讨论】:

      【解决方案3】:

      在这种情况下,我曾经为测试用例创建所需的文件,并在单元测试中使用它们。我为这些文件(测试数据)设置了一个专用文件夹,并设置了测试用例以获取适合测试用例的文件。

      【讨论】:

      • 是的,我也会创建单独的测试资源文件供我的测试使用。
      【解决方案4】:

      我建议使用专门用于测试的数据集(在本例中为文件)。否则我会使用模拟来模拟对外部资源的访问。 无论如何,我倾向于尽可能扩大自动测试的覆盖范围。

      【讨论】:

        猜你喜欢
        • 2019-06-02
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多