3

我正在尝试将测试驱动开发用于必须从磁盘读取大量数据的应用程序。问题是数据在文件系统中以某种复杂的目录结构组织(不是我的错)。我正在测试的方法需要查看多个不同目录中存在大量文件才能完成这些方法。

我试图避免的解决方案只是在硬盘驱动器上有一个已知文件夹,其中包含所有数据。这种方法很糟糕有几个原因,一个原因是如果我们想在另一台计算机上运行单元测试,我们必须向它复制大量数据。

我还可以在 setup 方法中生成虚拟文件,并在 teardown 方法中清理它们。这样做的问题是编写代码来复制现有目录结构并将大量虚拟文件转储到这些目录中会很痛苦。

我了解如何对文件 I/O 操作进行单元测试,但是如何对这种场景进行单元测试呢?

编辑:我不需要实际阅读文件。应用程序需要分析目录结构并确定其中存在哪些文件。这是一个包含大量文件的大量子目录。

4

4 回答 4

4

我将定义一组模仿文件系统的接口,例如IDirectoryand IFile,然后使用Test Doubles在内存中创建目录结构的表示。

这将允许您根据自己的内容对该结构进行单元测试(并改变)。

为此,您还需要使用真正的 BCL 类来实现这些接口的具体实现。

这使您可以独立地改变数据结构和数据访问。

于 2010-02-19T16:06:50.450 回答
1

哇,这听起来像野兽。我一直在尝试测试自己。

听起来您问题的主要焦点是“如何设置大量文件,以便我可以测试检查所述文件是否存在的方法?”

您提到了几种可能的解决方案。你说你不想简单地在硬盘上放一个文件夹,里面装满了测试数据,因为你不想经历将数据复制到另一台计算机的过程,这是可以理解的。

您还提到您可以编写方法来生成虚拟文件,但是复制数据结构会很痛苦。

Roy Osherove 在The Art of Unit Testing中说,在维护和版本化项目时维护和版本化测试代码是一个好主意。

我认为为了保持一致性,创建一些虚拟数据并将其与您的测试代码一起放置在某种源代码控制存储库中是有意义的。这样,您可以简化将虚拟数据复制到另一台计算机的过程,而不必担心跟踪哪些虚拟数据在哪台机器上。那会很痛苦!

我的解决方案:放置虚拟数据是源代码控制。

于 2010-02-19T16:10:43.697 回答
1

这有一个 Python 视角。你可能不在 Python 中工作,但答案或多或少适用于大多数语言。

使用任何外部资源(例如os模块)进行单元测试时,您必须模拟外部资源。

问题是“如何模拟出来os.walk?” (或os.listdir或任何你正在使用的东西。)

  1. 编写该函数的模拟版本。 os.walk例如。每个模拟版本都会返回一个目录和文件列表,以便您可以练习您的应用程序。

    如何建造这个?

    编写一个“数据采集器”,用于os.walk处理真实数据并创建一个可用于测试的大而旧的平面响应列表。

  2. 创建一个模拟目录结构。“编写代码来复制现有目录结构会很痛苦”通常不是真的。模拟的目录结构只是一个简单的名称列表。根本没有疼痛。

考虑这个

def setUp( self ):
    structure= [ 
        "/path/to/file/file.x", 
        "/path/to/another/file/file.y", 
        "/some/other/path/file.z",...
    ]
    for p in structure:
        path, file = os.path.split( p )
        try:
            os.makedirs( path )
        except OSError:
            pass
        with open( p, "w" ) as f:
            f.write( "Dummy Data" )

这就是setUp. tearDown类似。

于 2010-02-19T16:14:55.813 回答
0

一种可能的解决方案是从您的设置方法部署的 tar 文件创建虚拟文件和目录结构。

于 2010-02-19T16:11:41.193 回答