【问题标题】:How to test file system operations如何测试文件系统操作
【发布时间】:2011-02-20 21:55:14
【问题描述】:

我有一个同步两个文件夹的方法,如下所示:

void Synchronize(string folderAPath, string folderBPath)
{
    //Code to synchronize the folders
}

测试文件是否正确同步的最佳方法是什么,或者一般来说,测试文件系统的测试方法是什么?有没有办法设置虚拟文件夹?

【问题讨论】:

标签: c# .net unit-testing testing


【解决方案1】:

正如@BrokenGlass 已经建议的那样,将实际的 API 隐藏在可模拟的接口后面可以让您对逻辑进行单元测试。仅当其中有大量逻辑来证明使接口单元可测试所需的额外复杂性时,我才会这样做。测试代码在真实情况下是否真的有效,在真实文件系统上无论如何都需要集成测试,所以在简单的情况下可以跳过单元测试,以更有效地使用有限的资源。

【讨论】:

  • +1 同意 - 有时设置“真实”单元测试的努力是不值得的,这完全取决于场景 - 实用主义对我来说是赢家。
  • +1 在我们当前的重构中,我正在删除数百行(可能有错误的)抽象代码,并用直接的系统调用替换许多令人困惑的 IoC 间接。去年它一直在膨胀我们的代码库,用于对大约 25 行真实代码进行单元测试。在当时看来是个好主意。
【解决方案2】:

您可以定义一个接口IFileSystem,它提供与文件相关的方法并将其传递给您的Synchronize 方法。对于真正的系统,您使用真正的文件 I/O 实现接口,对于您的测试,您可以通过一个仅根据您预先设置的测试数据在内存中运行的实现,但不接触真正的文件系统。

顺便说一句,imo使用依赖于文件系统的测试并没有错,特别是如果很难伪造被测方法所期望的数据 - 虽然这些测试可以被认为是“集成”类型的测试,与单元测试相反,它们仍然提供价值。

【讨论】:

    【解决方案3】:

    您别无选择,只能编写一个包装器。

    编辑:更新了链接,它是 NuGet!
    看看这个:http://weblogs.asp.net/bleroy/archive/2010/11/19/fluentpath-1-0.aspx

    编辑
    呃,刚刚看到我链接的库没有额外的抽象层来启用测试。 但是,嘿,它是开源的 ;)

    【讨论】:

    • 确实可以选择。请看我的回答。
    • 好吧,我在每晚运行的集成测试中看到了重点。但是,您是否会在每次更改或每次构建后在本地启动虚拟机?
    • 没有。我们为每个需要文件系统测试的开发系统设置了一个虚拟机。使用众所周知的起始状态设置快照。作为测试脚本的一部分,应用快照并运行测试。这是一个无痛的过程,并且完全自动化。
    【解决方案4】:

    我看不出测试文件系统操作的意义。只需打开文件,这样您就可以通过打开不同的文件来测试不同的数据。

    【讨论】:

      【解决方案5】:

      我过去在Hyper-V 上使用过虚拟机并取得了巨大的成功。您可以使用snapshots 创建一个已知状态,并根据需要多次返回以进行测试。其他虚拟机技术也可能会起作用。

      我们为每个需要文件系统测试的开发系统设置了一个虚拟机。已设置快照以及众所周知的起始状态。作为测试脚本的一部分,应用快照并运行测试。这是一个无痛的过程,并且完全自动化。

      根据我们的经验,该解决方案已被证明优于模拟文件系统等“虚假”方法,因为它为我们提供了文件系统的真实、混乱、不可预测的行为。空间不足、权限问题、RAID 故障、重解析点问题等难以模拟。

      【讨论】:

      • @Henk Holterman:谁说的?我们已经使用它进行单元测试超过 3 年了。您能否解释一下为什么您认为这不是一个选择?此外,OP 没有提到 unit 测试。
      • 标签包括[单元测试]。当然,您可以在 VM 上使用单元测试工具,但它不再是真正的单元测试了。尽管如此,我仍然认为这是对问题的合理(务实)答案。
      • @downvoter:想解释一下你的反对意见吗?如果您不发表评论,您将无济于事。谢谢。
      • @Henk Holterman:当然是单元测试。就像测试一个需要在数据库中插入记录的单元需要一个数据库基础设施一样。您能否指出我们的方法违反的单元测试定义?
      • 只要称之为集成测试,我们就会达成一致。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多