如何在测试中使用临时目录和文件¶
tmp_path
fixture¶
您可以使用 tmp_path
fixture,它将为测试调用提供一个惟一的临时目录,在 base temporary directory 中创建。
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)
assert p.read_text() == 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-7.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)
assert p.read_text() == 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 =============================
tmp_path_factory
fixture¶
tmp_path_factory
是一个会话范围的 fixture,可用于从任何其他 fixture 或测试创建任意临时目录。
例如,假设您的测试套件需要磁盘上的一个大映像,该映像是程序生成的。您可以在每个会话中生成一次映像,以节省时间,而不是为每个测试计算相同的映像,并将其使用到自己的 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
fixtures¶
tmpdir
和 tmpdir_factory
fixture 类似于 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
了解细节。
默认的基本临时目录¶
临时目录默认创建为系统临时目录的子目录。基本名将是 pytest-NUM
,其中 NUM
将随着每次测试的运行而递增。此外,超过 3 个临时目录的条目将被删除。
当前不能更改条目的数量,但使用 --basetemp
选项将在每次运行前删除目录,这实际上意味着只保留最近运行的临时目录。
你可以像这样覆盖默认的临时目录设置:
pytest --basetemp=mydir
警告
mydir
的内容将被完全删除,所以请确保使用的目录仅用于此目的。
在使用 pytest-xdist
在本地机器上分发测试时,请注意为子进程自动配置 basetemp 目录,以便所有临时数据都位于每个测试运行的 basetemp 目录下。