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

40 投票
6 回答
53763 浏览
提问于 2025-04-16 07:11

(我在使用Python 2.6和nose。)

我正在为我的Python应用写测试。我想要一个测试能够打开一个新文件,关闭它,然后删除它。自然,我希望这个过程发生在一个临时目录里,因为我不想弄乱用户的文件系统。而且,这个方法需要在不同的操作系统上都能用。

我该怎么做呢?

6 个回答

11

与其直接使用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


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

34

顺便说一下,使用 py.test 你可以这样写:

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

每个测试函数如果使用 "tmpdir" 这个参数,就会得到一个干净的空目录。这个目录会被创建在 "/tmp/pytest-NUM" 下面(在 Linux 系统上是这个路径,Windows 系统的路径会不同),其中 NUM 会随着每次测试运行而增加。最后三个目录会被保留,方便你查看,旧的目录会自动删除。你还可以通过 py.test --basetemp=mytmpdir 来设置一个基础的临时目录。

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

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

不过把它转换成一个 "字符串" 路径也是可以的:

tmpdir = str(tmpdir)
22

可以看看标准库里的 tempfile 模块,这里面的内容应该能满足你的需求。

撰写回答