What if your tests could handle files safely without any messy cleanup or errors?
Why tmp_path and tmp_path_factory in PyTest? - Purpose & Use Cases
Imagine you are testing a program that creates and modifies files. You try to do this manually by creating folders and files on your computer before each test, then deleting them after. It feels like a lot of work and you worry about accidentally deleting important files or leaving junk behind.
Doing file setup and cleanup by hand is slow and easy to mess up. You might forget to delete files, causing clutter. Or tests might interfere with each other if they use the same file names. This makes your tests unreliable and your computer messy.
pytest's tmp_path and tmp_path_factory give you fresh temporary folders automatically for each test. They handle creation and cleanup safely, so you never worry about leftover files or conflicts. Your tests stay clean and isolated.
import os import shutil def test_file(): os.mkdir('temp') with open('temp/data.txt', 'w') as f: f.write('hello') # test code shutil.rmtree('temp')
def test_file(tmp_path): file = tmp_path / 'data.txt' file.write_text('hello') # test code
You can write safe, fast tests that use real files without worrying about cleanup or conflicts.
Testing a photo app that saves images: each test gets its own folder to save pictures, so tests don't overwrite each other's files or leave junk behind.
Automatic temporary folders: pytest creates and cleans them for you.
Isolated tests: Each test gets a fresh space to avoid conflicts.
Less manual work: No need to write setup or cleanup code for files.
Practice
tmp_path fixture in pytest?Solution
Step 1: Understand the role of
Thetmp_pathtmp_pathfixture gives each test a fresh temporary directory to use.Step 2: Compare with other options
It does not create multiple directories per test (that'stmp_path_factory), nor does it store files permanently or mock file calls.Final Answer:
To provide a unique temporary directory for each test function -> Option AQuick Check:
tmp_path= unique temp folder per test [OK]
- Confusing tmp_path with tmp_path_factory
- Thinking tmp_path stores files permanently
- Assuming tmp_path mocks file system calls
tmp_path_factory to create a new temporary directory named 'data' inside a test?Solution
Step 1: Recall the correct method name
The method to create a new temporary directory withtmp_path_factoryismktemp().Step 2: Verify method usage
Callingtmp_path_factory.mktemp('data')creates a temp directory named 'data'. Other options are not valid pytest methods.Final Answer:
new_dir = tmp_path_factory.mktemp('data') -> Option DQuick Check:
mktemp()creates temp dirs [OK]
- Using incorrect method names like create_temp or tempdir
- Trying to call make_directory which doesn't exist
- Confusing tmp_path and tmp_path_factory usage
def test_create_file(tmp_path):
file = tmp_path / 'test.txt'
file.write_text('hello')
content = file.read_text()
assert content == 'hello'
Solution
Step 1: Analyze file creation and writing
The code creates a file 'test.txt' in the temporary directory and writes the string 'hello' to it.Step 2: Check reading and assertion
Reading the file withread_text()returns the string 'hello', which matches the assertion.Final Answer:
Test passes because the file content matches 'hello' -> Option CQuick Check:
write_text/read_text with tmp_path works [OK]
- Assuming read_text returns bytes instead of string
- Thinking file is not created automatically
- Expecting exceptions from valid path operations
tmp_path_factory:
def test_dir_creation(tmp_path_factory):
dir1 = tmp_path_factory.mktemp('dir')
dir2 = tmp_path_factory.mktemp('dir')
assert dir1 != dir2
Solution
Step 1: Understand mktemp behavior
Each call tomktemp('dir')creates a unique temporary directory, even if the name is the same.Step 2: Check assertion validity
The assertion compares the two directory paths and expects them to be different, which is true.Final Answer:
No error; test passes because mktemp creates unique dirs -> Option BQuick Check:
mktemp creates unique dirs even with same name [OK]
- Thinking mktemp fails on duplicate names
- Confusing fixture names or usage
- Assuming assert compares contents, not paths
Solution
Step 1: Identify fixture roles
tmp_pathprovides a fresh temp directory unique to each test.tmp_path_factorycan create directories shared or reused across tests.Step 2: Match requirements to fixtures
For a shared directory across tests, usetmp_path_factory. For unique per-test directories, usetmp_path.Final Answer:
Use tmp_path_factory to create the shared directory and tmp_path for the unique per-test directory -> Option AQuick Check:
tmp_path unique per test, tmp_path_factory for shared [OK]
- Using tmp_path for shared directories
- Using tmp_path_factory only for unique per-test dirs
- Mixing up fixture purposes
Ready to prove it?
Pass the test and this pattern moves unknown
