Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mdomke/pytest-mongodb
pytest plugin for mocking MongoDB with fixtures
https://github.com/mdomke/pytest-mongodb
mocking mongodb pytest python
Last synced: 6 days ago
JSON representation
pytest plugin for mocking MongoDB with fixtures
- Host: GitHub
- URL: https://github.com/mdomke/pytest-mongodb
- Owner: mdomke
- License: mit
- Created: 2015-06-09T11:21:53.000Z (over 9 years ago)
- Default Branch: main
- Last Pushed: 2024-02-13T21:21:12.000Z (11 months ago)
- Last Synced: 2024-12-24T06:08:05.428Z (13 days ago)
- Topics: mocking, mongodb, pytest, python
- Language: Python
- Homepage:
- Size: 99.6 KB
- Stars: 66
- Watchers: 3
- Forks: 19
- Open Issues: 5
-
Metadata Files:
- Readme: README.rst
- License: LICENSE
Awesome Lists containing this project
README
.. image:: https://img.shields.io/pypi/v/pytest-mongodb.svg?style=flat-square
:target: https://pypi.python.org/pypi/pytest-mongodb
.. image:: https://img.shields.io/github/actions/workflow/status/mdomke/pytest-mongodb/lint-and-test.yml?branch=main&style=flat-square
:target: https://github.com/mdomke/pytest-mongodb/actions?query=workflow%3Alint-and-test
.. image:: https://img.shields.io/pypi/l/pytest-mongodb.svg?style=flat-square
:target: https://pypi.python.org/pypi/pytest-mongodb
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square
:target: https://black.readthedocs.io/en/stable/index.htmlWhat is this?
=============This is a pytest_ plugin, that enables you to test your code that relies on a database connection to
a MongoDB and expects certain data to be present. It allows you to specify fixtures for database
collections in JSON/BSON or YAML format. Under the hood we use the mongomock_ library, that you
should consult for documentation on how to use MongoDB mock objects. If suitable you can also use a
real MongoDB server.**Note**: This project has been renamed from ``humongous`` to ``pytest-mongodb`` in order to conform
to the pytest plugin naming convention and to be easier to find on the Python package index. See the
`migration section `_ for more information.Configuration
-------------If you don't want to put your database fixtures on the top-level directory of your package you have
to specify a directory where ``pytest-mongodb`` looks for your data definitions.To do so put a line like the following under the ``pytest`` section of your ``pytest.ini``-file put
a.. code-block:: ini
[pytest]
mongodb_fixture_dir =
tests/unit/fixtures``pytest-mongodb`` would then look for files ending in ``.yaml`` or ``.json`` in that directory.
If you want only a subset of the available fixtures to be loaded, you can use the ``mongodb_fixtures``
config option. It takes a list of collection file-names without the file-extension. E.g.:.. code-block:: ini
[pytest]
mongodb_fixtures =
players
championshipsIn this case only the collections "players" and "championships" will be loaded.
You can also choose to use a real MongoDB server for your tests. In that case you might also want to
configure the hostname and/or the credentials if you don't want to stick with the default (localhost
and no credentials). Use the following configuration values in your ``pytest.ini`` to adapt the
settings to your needs:.. code-block:: ini
[pytest]
mongodb_engine = pymongo
mongodb_host = mongodb://user:[email protected]
mongodb_dbname = mydbnameFor Mac users, who installed mongodb using homebrew, you can configure the executable to be picked up from `/usr/local/bin/mongod` instead of `/usr/local/bin/mongod` by using `mongo_exec = /usr/local/bin/mongod` in the `pytest.ini` file.
Basic usage
-----------After you configured ``pytest-mongodb`` so that it can find your fixtures you're ready to specify
some data. Regardless of the markup language you choose, the data is provided as a list of documents
(dicts). The collection that these documents are being inserted into is given by the filename of
your fixture-file. E.g.: If you had a file named ``players.yaml`` with the following content:.. code-block:: yaml
- name: Mario
surname: Götze
position: striker- name: Manuel
surname: Neuer
position: keeperyou'd end up with a collection ``players`` that has the above player definitions inserted. If your
fixture file is in JSON/BSON format you can also use BSON specific types like ``$oid``, ``$date``,
etc.You get ahold of the database in your test-function by using the ``mongodb`` fixture like so:
.. code-block:: python
def test_players(mongodb):
assert 'players' in mongodb.list_collection_names()
manuel = mongodb.players.find_one({'name': 'Manuel'})
assert manuel['surname'] == 'Neuer'For further information refer to the mongomock_ documentation.
If you want to skip specific tests if the engine is ie. a mongomock engine you could do that like
so:.. code-block:: python
from pytest_mongodb.plugin import mongo_engine
from pytest import mark@mark.skipif(mongo_engine() == 'mongomock', reason="mongomock does not support that")
def test_players(mongodb):
assert 'players' in mongodb.list_collection_names()
manuel = mongodb.players.find_one({'name': 'Manuel'})
assert manuel['surname'] == 'Neuer'Migration from humongous
------------------------In the course of migrating the package name from ``humongous`` to ``pytest-mongodb`` most
configuration values which previously were prefixed with ``humongous_`` have been renamed to a
``mongodb_``-prefixed counterpart. The only notable exception is the ``humongous_basedir`` config
value, which now is named ``mongodb_fixture_dir``. Additionally the commandline options have been
unified, in a way that multi-word option names are now consistently separated with dashes instead of
underscores... _mongomock: https://github.com/vmalloc/mongomock
.. _pytest: https://docs.pytest.org/en/latest/