| Introduction |
| ============ |
| |
| `pyfakefs <https://github.com/pytest-dev/pyfakefs>`__ implements a fake file |
| system that mocks the Python file system modules. |
| Using pyfakefs, your tests operate on a fake file system in memory without touching the real disk. |
| The software under test requires no modification to work with pyfakefs. |
| |
| pyfakefs works with CPython 3.7 and above, on Linux, Windows and macOS, |
| and with PyPy3. |
| |
| pyfakefs works with `pytest <doc.pytest.org>`__ version 3.0.0 or above by |
| providing the `fs` fixture that enables the fake filesystem. |
| |
| Installation |
| ------------ |
| pyfakefs is available on `PyPI <https://pypi.python.org/pypi/pyfakefs/>`__. |
| The latest released version can be installed from PyPI: |
| |
| .. code:: bash |
| |
| pip install pyfakefs |
| |
| The latest main can be installed from the GitHub sources: |
| |
| .. code:: bash |
| |
| pip install git+https://github.com/pytest-dev/pyfakefs |
| |
| Features |
| -------- |
| - Code executed under pyfakefs works transparently on a memory-based file |
| system without the need of special commands. The same code that works on |
| the real filesystem will work on the fake filesystem if running under |
| pyfakefs. |
| |
| - pyfakefs provides direct support for `pytest` (via the `fs` fixture) |
| and `unittest` (via a `TestCase` base class), but can also be used with |
| other test frameworks. |
| |
| - Each pyfakefs test starts with an empty file system, but it is possible to |
| map files and directories from the real file system into the fake |
| filesystem if needed. |
| |
| - No files in the real file system are changed during the tests, even in the |
| case of writing to mapped real files. |
| |
| - pyfakefs keeps track of the filesystem size if configured. The file system |
| size can be configured arbitrarily. |
| |
| - it is possible to pause and resume using the fake filesystem, if the |
| real file system has to be used in a test step |
| |
| - pyfakefs defaults to the OS it is running on, but can also be configured |
| to test code running under another OS (Linux, macOS or Windows). |
| |
| - pyfakefs can be configured to behave as if running as a root or as a |
| non-root user, independently from the actual user. |
| |
| .. _limitations: |
| |
| Limitations |
| ----------- |
| - pyfakefs will not work with Python libraries (other than `os` and `io`) that |
| use C libraries to access the file system, because it cannot patch the |
| underlying C libraries' file access functions |
| |
| - pyfakefs patches most kinds of importing file system modules automatically, |
| but there are still some cases where this will not work. |
| See :ref:`customizing_patcher` for more information and ways to work around |
| this. |
| |
| - pyfakefs does not retain the MRO for file objects, so you cannot rely on |
| checks using `isinstance` for these objects (for example, to differentiate |
| between binary and textual file objects). |
| |
| - pyfakefs is only tested with CPython and the newest PyPy versions, other |
| Python implementations will probably not work |
| |
| - Differences in the behavior in different Linux distributions or different |
| macOS or Windows versions may not be reflected in the implementation, as |
| well as some OS-specific low-level file system behavior. The systems used |
| for automatic tests in GitHub Actions are |
| considered as reference systems. Additionally, the tests are run in Docker |
| containers with the latest CentOS, Debian, Fedora and Ubuntu images. |
| |
| - pyfakefs may not work correctly if file system functions are patched by |
| other means (e.g. using `unittest.mock.patch`) - see |
| :ref:`usage_with_mock_open` for more information |
| |
| - pyfakefs will not work correctly with |
| `behave <https://github.com/behave/behave>`__ due to the way it loads |
| the steps, if any filesystem modules are imported globally in the steps or |
| environment files; as a workaround, you may load them locally inside the |
| test steps (see `this issue <https://github.com/pytest-dev/pyfakefs/issues/703>`__) |
| |
| History |
| ------- |
| pyfakefs was initially developed at Google by |
| `Mike Bland <https://mike-bland.com/about.html>`__ as a modest |
| fake implementation of core Python modules. It was introduced to all of |
| Google in September 2006. Since then, it has been enhanced to extend its |
| functionality and usefulness. At last count, pyfakefs was used in over |
| 2,000 Python tests at Google. |
| |
| Google released pyfakefs to the public in 2011 as Google Code project |
| `pyfakefs <http://code.google.com/p/pyfakefs/>`__: |
| |
| * Fork `jmcgeheeiv-pyfakefs <http://code.google.com/p/jmcgeheeiv-pyfakefs/>`__ |
| added direct support for unittest and doctest as described in |
| :ref:`auto_patch` |
| * Fork `shiffdane-jmcgeheeiv-pyfakefs <http://code.google.com/p/shiffdane-jmcgeheeiv-pyfakefs/>`__ |
| added further corrections |
| |
| After the `shutdown of Google |
| Code <http://google-opensource.blogspot.com/2015/03/farewell-to-google-code.html>`__ |
| was announced, `John McGehee <https://github.com/jmcgeheeiv>`__ merged |
| all three Google Code projects together `on |
| GitHub <https://github.com/pytest-dev/pyfakefs>`__ where an enthusiastic |
| community actively maintains and extends pyfakefs. In 2022, the repository has |
| been transferred to `pytest-dev <https://github.com/pytest-dev>`__ to ensure |
| continuous maintenance. |