代码之家  ›  专栏  ›  技术社区  ›  Ram Rachum

Python:如何在测试套件中创建临时文件?

  •  25
  • Ram Rachum  · 技术社区  · 14 年前

    (我使用的是Python2.6和 nose .)

    我正在为我的Python应用程序编写测试。我想要一个测试来打开一个新文件,关闭它,然后删除它。当然,我更喜欢在一个临时目录中进行,因为我不想破坏用户的文件系统。而且,它需要跨操作系统。

    我该怎么做?

    5 回复  |  直到 14 年前
        1
  •  17
  •   bgporter    14 年前

    tempfile 标准库中的模块——应该是您所需要的全部。

        2
  •  27
  •   hpk42    14 年前

    FWIW使用py.test可以编写:

    def test_function(tmpdir):
        # tmpdir is a unique-per-test-function invocation temporary directory
    

    使用“tmpdir”函数参数的每个测试函数都将得到一个干净的空目录,该目录创建为“/tmp/pytest NUM”(linux,win32有不同的路径)的子目录,其中NUM为每次测试运行增加。最后三个目录被保留以便于检查,而较旧的目录则被自动删除。您还可以使用 py.test --basetemp=mytmpdir .

    tmpdir对象是py.path.local对象,也可以像这样使用:

    sub = tmpdir.mkdir("sub")
    sub.join("testfile.txt").write("content")
    

    但也可以将其转换为“字符串”路径:

    tmpdir = str(tmpdir)
    
        3
  •  4
  •   n1k31t4    5 年前

    而不是使用 tempfile 我直接建议对它使用一个上下文管理器包装器-上下文管理器负责在所有情况下删除目录(成功/失败/异常),基本上没有样板文件。

    以下是它的使用方法:

    from tempfile import TempDir    # "tempfile" is a module in the standard library
    ...
    
    # in some test:
    with TempDir() as d:
        temp_file_name = os.path.join(d.name, 'your_temp_file.name')
        # create file...
        # ...
        # asserts...
    

    到目前为止,我一直在使用一个自己开发的版本(实现很短,不到20行),当我还需要在其他地方使用它时,所以我四处查看是否有一个可以安装的包,并且确实有: tempfile


    注意:上面的代码片段有点过时了。

        4
  •  2
  •   leszek.hanusz    6 年前

    要使用测试的自定义内容创建临时文件,可以使用此类:

    import os, tempfile
    
    class TestFileContent:                                                                                                  
        def __init__(self, content):                                                                                        
    
            self.file = tempfile.NamedTemporaryFile(mode='w', delete=False)                                                 
    
            with self.file as f:                                                                                            
                f.write(content)                                                                                            
    
        @property                                                                                                           
        def filename(self):                                                                                                 
            return self.file.name                                                                                           
    
        def __enter__(self):                                                                                                
            return self                                                                                                     
    
        def __exit__(self, type, value, traceback):                                                                         
            os.unlink(self.filename)                                                                                        
    

    这个类将创建一个临时文件,在其中写入内容,然后关闭该文件。 你把它放在 with 语句以确保在像这样使用后删除文件:

        with TestFileContent(
    '''Hello, world
    '''
        ) as test_file:
    
            # Here, a temporary file has been created in the file named test_file.filename with the specified content
            # This file will be deleted once you leave the with block
    
        5
  •  1
  •   Chris L. Barnes    5 年前

    对于将来遇到这种情况,但又出于某种原因拒绝使用pytest的人:

    我写的 tempcase ,提供 unittest.TestCase 使用方便的方法处理临时目录的子类。在您请求目录的路径之前,不会创建任何目录,并且这些目录的名称空间是项目、测试用例类、时间戳和测试方法。之后会自动清理。通过设置属性,可以禁用清除以检查输出。

    如果您正在逐步移植代码,还可以将decorator应用于各个测试用例。