使用复杂目录结构进行单元测试

时间:2010-02-19 15:58:52

标签: unit-testing tdd filesystems directory-structure

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

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

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

哇,这听起来像个野兽。我一直在考虑自己。

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

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

您还提到可以编写生成虚拟文件的方法,但复制数据结构会很麻烦。

Roy Osherove在单元测试艺术中说,在项目维护和版本化时,维护和编辑测试代码是一个好主意。

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

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

答案 2 :(得分:1)

这有Python的观点。您可能没有使用Python,但答案或多或少适用于大多数语言。

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

问题是“怎么模仿os.walk?” (或os.listdir或您正在使用的任何内容。)

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

    如何建立这个?

    编写一个“数据抓取器”,对实际数据执行os.walk,并创建一个可用于测试的大致旧的响应列表。

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

  3. 考虑一下

    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类似。

答案 3 :(得分:0)

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