How To Manage Temporary Files with Pytest tmp_path

What if multiple tests need to operate on the same directories?

The answer - Pytest’s tmp_path and tmp_path_factory fixtures.

The Problem With Using Real Directories in Testing

  • Real directories can accumulate data from previous tests or even unrelated processes, leading to data interference.

  • Tests that rely on real directories may leave behind residual files or artifacts, even after the test has been completed.

  • Real directories might have different paths and naming conventions across various operating systems.

  • When using real directories, you need to set up the directory structure, create files, and ensure proper cleanup at the beginning and end of each test.

  • Real I/O operations, like creating and deleting directories and files, can introduce performance overhead, especially when running a large number of tests.

Introducing Pytest tmp_path and tmp_path_factory Fixtures

Pytest offers a valuable solution to the challenges of managing temporary directories in testing through the tmp_path and tmp_path_factory fixtures.

The Pytest tmp_path fixture is a built-in feature that provides a temporary directory path for each test function.

One of the most significant advantages of using tmp_path is that it automates the creation and cleanup of temporary directories.

The test then checks if the file exists using temp_file.is_file().

Difference Between tmp_path and tmp_path_factory Fixtures

tmp_path is used for creating a single temporary directory per test function, whereas tmp_path_factory allows you to create and manage multiple temporary directories for different purposes within a test session.

Where does Pytest create tmp_path directories?

Pytest creates tmp_path directories in a temporary directory specific to the operating system on which the tests are run.

  • Linux/Unix: On Linux and Unix-based systems, pytest typically creates the tmp_path directory in the /tmp directory.

  • Windows: On Windows, pytest typically creates the tmp_path directory in the system’s temporary directory, which is usually located at C:\Users\<username>\AppData\Local\Temp.

Overriding the Default Base Temporary Directory

You can use the --basetemp command-line option followed by the desired directory path.

pytest --basetemp=mydir

How Many Test Runs Does Pytest keep in tmp_path

Pytest typically keeps up to 3 test runs (each run is a test session) in tmp_path by default.

This means that the temporary directories created for previous test runs are retained, but if there are more than three, the oldest ones are removed to maintain a maximum of three temporary directories.