如何在测试中使用临时目录和文件¶
tmp_path
固定装置¶
您可以使用 tmp_path
固定装置,它将为每个测试函数提供一个唯一的临时目录。
tmp_path
是 pathlib.Path
对象。以下是一个示例测试用法
# content of test_tmp_path.py
CONTENT = "content"
def test_create_file(tmp_path):
d = tmp_path / "sub"
d.mkdir()
p = d / "hello.txt"
p.write_text(CONTENT, encoding="utf-8")
assert p.read_text(encoding="utf-8") == CONTENT
assert len(list(tmp_path.iterdir())) == 1
assert 0
运行此代码将导致通过测试,除了最后一行 assert 0
,我们使用它来查看值
$ pytest test_tmp_path.py
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-8.x.y, pluggy-1.x.y
rootdir: /home/sweet/project
collected 1 item
test_tmp_path.py F [100%]
================================= FAILURES =================================
_____________________________ test_create_file _____________________________
tmp_path = PosixPath('PYTEST_TMPDIR/test_create_file0')
def test_create_file(tmp_path):
d = tmp_path / "sub"
d.mkdir()
p = d / "hello.txt"
p.write_text(CONTENT, encoding="utf-8")
assert p.read_text(encoding="utf-8") == CONTENT
assert len(list(tmp_path.iterdir())) == 1
> assert 0
E assert 0
test_tmp_path.py:11: AssertionError
========================= short test summary info ==========================
FAILED test_tmp_path.py::test_create_file - assert 0
============================ 1 failed in 0.12s =============================
默认情况下,pytest
为最近 3 次 pytest
调用保留临时目录。通过将基本临时目录配置为对每次并发运行都是唯一的,可以支持同一测试函数的并发调用。有关详细信息,请参阅 临时目录位置和保留。
tmp_path_factory
固定装置¶
tmp_path_factory
是一个会话作用域固定装置,可用于从任何其他固定装置或测试创建任意临时目录。
例如,假设您的测试套件需要磁盘上的一个大图像,该图像通过程序生成。您可以按会话生成一次图像以节省时间,而不是为每个使用该图像的测试在自己的 tmp_path
中计算同一个图像
# contents of conftest.py
import pytest
@pytest.fixture(scope="session")
def image_file(tmp_path_factory):
img = compute_expensive_image()
fn = tmp_path_factory.mktemp("data") / "img.png"
img.save(fn)
return fn
# contents of test_image.py
def test_histogram(image_file):
img = load_image(image_file)
# compute and test histogram
有关详细信息,请参阅 tmp_path_factory API。
tmpdir
和 tmpdir_factory
固定装置¶
tmpdir
和 tmpdir_factory
固定装置类似于 tmp_path
和 tmp_path_factory
,但使用/返回旧版 py.path.local 对象,而不是标准 pathlib.Path
对象。
注意
现在,最好使用 tmp_path
和 tmp_path_factory
。
为了帮助实现旧代码库的现代化,可以使用禁用 legacypath 插件的 pytest
pytest -p no:legacypath
这将触发使用旧版路径的测试中的错误。它还可以作为配置文件中 addopts
参数的一部分永久设置。
有关详细信息,请参见 tmpdir
tmpdir_factory
API。
临时目录位置和保留¶
默认情况下,临时目录创建为系统临时目录的子目录。基本名称将为 pytest-NUM
,其中 NUM
将随着每次测试运行而递增。默认情况下,将删除超过 3 个临时目录的条目。此行为可以通过 tmp_path_retention_count
和 tmp_path_retention_policy
进行配置。
使用 --basetemp
选项将在每次运行之前删除目录,实际上意味着只保留最近一次运行的临时目录。
您可以按如下方式覆盖默认临时目录设置
pytest --basetemp=mydir
警告
将彻底删除 mydir
的内容,因此请确保仅将目录用于此目的。
在使用 pytest-xdist
在本地计算机上分发测试时,会小心为子进程自动配置 basetemp
目录,以便所有临时数据都位于单个每次测试运行的临时目录下。