pytest tmpdir fixture介绍(tmpdir_factory)(自动在测试开始前创建一个临时目录,并在测试结束后删除该目录)
示例代码:
import pytest@pytest.fixture
def tmp_dir(tmpdir): # 使用内置的 tmpdir fixturereturn tmpdir.mkdir("test_data")def test_tmp_dir(tmp_dir):file = tmp_dir.join("test.txt")file.write("Hello")assert file.read() == "Hello"
参考文章:pytest介绍(python测试框架)(@pytest.mark.parametrize、@pytest.fixtures)
文章目录
- **代码解析**
- 1. **导入 pytest 模块**
- 2. **定义自定义 fixture:`tmp_dir`**
- 3. **测试函数:`test_tmp_dir`**
- **调用流程**
- **如何运行代码**
- **关键概念总结**
- **扩展示例**
这段代码使用了
pytest
的内置
tmpdir
fixture 来创建临时目录,并验证其功能。下面是对代码的逐行解释和调用流程的说明:
代码解析
1. 导入 pytest 模块
import pytest
- 导入
pytest
模块,这是使用pytest
测试框架的基础。
2. 定义自定义 fixture:tmp_dir
@pytest.fixture
def tmp_dir(tmpdir): # 使用内置的 tmpdir fixturereturn tmpdir.mkdir("test_data")
- 作用:创建一个临时目录
test_data
,并将其返回给测试函数使用。 - 关键点:
tmpdir
是pytest
提供的内置 fixture,它会自动在测试开始前创建一个临时目录,并在测试结束后删除该目录。tmpdir.mkdir("test_data")
在临时目录下创建一个名为test_data
的子目录。- 返回值
tmp_dir
是一个py.path.local
对象,表示test_data
目录。
3. 测试函数:test_tmp_dir
def test_tmp_dir(tmp_dir):file = tmp_dir.join("test.txt")file.write("Hello")assert file.read() == "Hello"
- 作用:在临时目录
test_data
中创建一个文件test.txt
,写入内容并验证内容是否正确。 - 关键点:
tmp_dir
是上一步定义的 fixture,它会自动传入当前测试函数。tmp_dir.join("test.txt")
在test_data
目录下创建一个文件test.txt
。file.write("Hello")
向文件写入字符串"Hello"
。assert file.read() == "Hello"
验证文件内容是否匹配预期值。
调用流程
-
运行测试时:
pytest
会自动发现以test_
开头的测试函数(如test_tmp_dir
)。- 执行
test_tmp_dir
时,pytest
会先调用tmp_dir
fixture。
-
tmp_dir
fixture 的执行:pytest
自动调用内置的tmpdir
fixture(无需手动调用)。tmpdir.mkdir("test_data")
创建临时目录test_data
。- 返回
test_data
目录对象给test_tmp_dir
函数。
-
测试函数的执行:
test_tmp_dir
使用tmp_dir
参数(即test_data
目录)。- 创建文件
test.txt
并写入内容,最后验证内容是否正确。
-
测试结束后的清理:
- 测试完成后,
pytest
会自动删除临时目录test_data
及其所有子目录和文件(包括test.txt
)。
- 测试完成后,
如何运行代码
-
保存代码到文件:
将代码保存为test_tmp.py
。 -
运行测试:
在终端中执行以下命令:pytest test_tmp.py -v
-v
表示输出详细的测试信息。- 如果测试通过,你会看到类似
test_tmp.py::test_tmp_dir PASSED
的输出。
-
验证临时目录的自动清理:
- 测试运行时,
pytest
会生成一个临时目录(路径类似/tmp/pytest-of-<username>/.../test_data
)。 - 测试结束后,该目录及其内容会被自动删除,无需手动清理。
- 测试运行时,
关键概念总结
-
tmpdir
fixture:- 自动创建临时目录,测试结束后自动删除。
- 可用于存放测试过程中需要的临时文件。
-
Fixture 的作用:
- 将测试的准备工作(如创建临时目录)与测试逻辑分离,提高代码的可读性和可维护性。
-
断言验证:
- 使用
assert
验证文件内容是否符合预期,确保测试的正确性。
- 使用
扩展示例
如果你需要更复杂的临时文件管理,可以结合 tmpdir_factory
(会话级临时目录)或 tempfile
模块。例如:
import pytest
import tempfile@pytest.fixture
def session_tmp_dir(tmpdir_factory):return tmpdir_factory.mktemp("session_data")def test_session_tmp_dir(session_tmp_dir):file = session_tmp_dir.join("session_file.txt")file.write("Session Data")assert file.read() == "Session Data"
tmpdir_factory
的作用范围是整个测试会话(session
),适合需要跨多个测试共享的临时目录。