tmp_path and tmp_path_factory in PyTest - Build an Automation Script
import pytest def test_tmp_path_and_tmp_path_factory(tmp_path, tmp_path_factory): # Using tmp_path fixture test_file = tmp_path / "testfile.txt" test_file.write_text("Hello pytest!") # Assert file exists assert test_file.exists(), f"File {test_file} should exist" # Assert file content content = test_file.read_text() assert content == "Hello pytest!", f"File content should be 'Hello pytest!' but got '{content}'" # Using tmp_path_factory fixture custom_dir = tmp_path_factory.mktemp("myprefix") factory_file = custom_dir / "factoryfile.txt" factory_file.write_text("Factory test content") # Assert file exists assert factory_file.exists(), f"File {factory_file} should exist" # Assert file content factory_content = factory_file.read_text() assert factory_content == "Factory test content", f"File content should be 'Factory test content' but got '{factory_content}'"
This test function uses two pytest fixtures: tmp_path and tmp_path_factory.
First, tmp_path provides a temporary directory unique to this test. We create a file testfile.txt inside it and write text. We then check if the file exists and if its content matches what we wrote.
Next, tmp_path_factory is used to create another temporary directory with a custom prefix myprefix. Inside this directory, we create another file factoryfile.txt and write different content. We verify the file's existence and content similarly.
Using pathlib's Path methods makes file handling easy and readable. Assertions ensure the test fails if files are missing or contents are wrong. Pytest automatically cleans up these temporary directories after the test finishes, so no manual cleanup is needed.
Now add data-driven testing to create multiple files with different names and contents using tmp_path
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
