2008-12-18 207 views
21

我刚开始进行了大量的代码编写测试。有一堆依赖于文件系统的类,也就是它们读取CSV文件,读/写配置文件等等。最佳做法/集成测试

目前的测试文件被存储在项目(这是一个Maven2的项目)的测试目录,但由于多种原因该目录不总是存在的,所以测试失败。

你知道在单元/集成测试与文件系统的依赖应对最佳做法?

编辑:我不是在寻找上述具体问题的答案。那只是一个例子。我宁愿一般建议如何处理依赖于文件系统/数据库等

回答

0

通常情况下,文件系统测试是不是非常关键的:文件系统被很好地理解,易于设置,并保持稳定。此外,访问通常非常快,所以本身没有理由避开或嘲笑测试。

我建议你找出为什么目录不存在,并确保它。例如,检查setUp()中是否存在文件或目录,并在检查失败时复制这些文件。这只会发生一次,所以对性能的影响很小。

1

有针对需要从文件中读取测试代码两种选择:

  1. 保持与源控制单元测试(例如,在测试数据文件夹)的文件,所以任何人谁得到最新的并且运行测试总是将相关文件放在与测试二进制文件相关的已知文件夹中。这可能是“最佳做法”。

  2. 如果有问题的文件是巨大的,你可能不想让他们在源代码控制。在这种情况下,可以从所有开发人员和构建计算机访问的网络共享可能是合理的折衷方案。

很明显,写得最好的类首先不会对文件系统产生严重的依赖关系。

24

第一个应该尝试保持单元测试远离文件系统 - 请参阅Set of Unit Testing Rules。如果可能的话,你的代码使用Streams,这些Streams是单元测试的缓冲区(即内存),生产代码中的FileStream。

如果这不可行,您可以让您的单元测试生成他们所需的文件。这使得测试易于阅读,因为一切都在一个文件中。这也可能会阻止权限问题。

你可以mock单元测试中的文件系统/数据库/网络访问。

您可以将依赖于数据库或文件系统的单元测试视为集成测试。

2

依赖于文件系统有两种形式在这里:

  • 文件,你的测试取决于;如果您需要文件来运行测试,那么您可以在测试中生成它们并将它们放入/tmp目录中。
  • 您的代码依赖于的文件:配置文件或输入文件。

在此第二种情况下,它往往是可能重新结构的代码,以除去上的文件相关,这可能不是可能的(例如java.io.File的可与java.io.InputStreamjava.io.OutputStream等代替)当然。

你可能还需要处理文件系统中的'非确定性'(我有一个工作的恶魔在NFS上调试一次)。在这种情况下,您应该将文件系统封装在一个精简的界面中。

简单地说,这是需要一个文件并转发呼叫到该文件只是辅助方法:

InputStream getInputStream(File file) throws IOException { 
    return new FileInputStream(file); 
} 

然后,您可以取代它,使用它可以直接抛出该异常的模拟,或返回一个ByteArrayInputStream,或其他。

对于URL和URI也是如此。

0

给出与结构上与单元测试名称相似的名称的测试文件。

在JUnit中,例如,我会使用:

File reportFile = new File("tests/output/" + getClass().getSimpleName() + "/" + getName() + ".report.html");