pytest-mongodb icon indicating copy to clipboard operation
pytest-mongodb copied to clipboard

pytest plugin for mocking MongoDB with fixtures

.. image:: https://img.shields.io/pypi/v/pytest-mongodb.svg :target: https://pypi.python.org/pypi/pytest-mongodb .. image:: https://travis-ci.org/mdomke/pytest-mongodb.svg?branch=master :target: https://travis-ci.org/mdomke/pytest-mongodb .. image:: https://img.shields.io/pypi/l/pytest-mongodb.svg :target: https://pypi.python.org/pypi/pytest-mongodb

What 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 <Migration from humongous_>_ 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
  championships

In 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 = mydbname

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: keeper

you'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/