.. image:: https://raw.githubusercontent.com/dbfixtures/pytest-dynamodb/master/logo.png :width: 100px :height: 100px
pytest-dynamodb
.. image:: https://img.shields.io/pypi/v/pytest-dynamodb.svg :target: https://pypi.python.org/pypi/pytest-dynamodb/ :alt: Latest PyPI version
.. image:: https://img.shields.io/pypi/wheel/pytest-dynamodb.svg :target: https://pypi.python.org/pypi/pytest-dynamodb/ :alt: Wheel Status
.. image:: https://img.shields.io/pypi/pyversions/pytest-dynamodb.svg :target: https://pypi.python.org/pypi/pytest-dynamodb/ :alt: Supported Python Versions
.. image:: https://img.shields.io/pypi/l/pytest-dynamodb.svg :target: https://pypi.python.org/pypi/pytest-dynamodb/ :alt: License
DynamoDB fixtures for pytest.
What is this?
pytest-dynamodb is a pytest plugin for tests that need a running DynamoDB
instance. It provides fixtures for both a managed local process and a
connection to an already running instance.
.. image:: https://raw.githubusercontent.com/dbfixtures/pytest-dynamodb/main/docs/images/architecture.svg :alt: Project Architecture Diagram :align: center
Quickstart: first test
- Install the plugin and your test dependencies.
- Download and unpack DynamoDB Local (see AWS docs):
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html
Place extracted files in
dynamodb_dir(default:/tmp/dynamodb), or choose another location and pass it via--dynamodb-dirwhen running tests. - Make sure Java is available in your environment (DynamoDB Local runs as a JAR).
- Write a test that uses the built-in
dynamodbfixture:
.. code-block:: python
import uuid
def test_can_put_and_get_item(dynamodb):
table = dynamodb.create_table(
TableName="Test",
KeySchema=[{"AttributeName": "id", "KeyType": "HASH"}],
AttributeDefinitions=[{"AttributeName": "id", "AttributeType": "S"}],
ProvisionedThroughput={"ReadCapacityUnits": 10, "WriteCapacityUnits": 10},
)
_id = str(uuid.uuid4())
table.put_item(Item={"id": _id, "test_key": "test_value"})
item = table.get_item(Key={"id": _id})
assert item["Item"]["test_key"] == "test_value"
5. Run tests:
.. code-block:: shell
pytest
For a full example, see tests/test_dynamodb.py.
How to use
The plugin contains three fixtures:
- dynamodb - function-scoped
DynamoDBServiceResourcefixture. - dynamodb_proc - session-scoped fixture that starts DynamoDB Local on first use and stops it at the end of the test session.
- dynamodb_noproc - session-scoped fixture that connects to an externally managed DynamoDB instance (for example, Docker).
When to use which fixture:
- Use
dynamodb(default) when tests should manage a local process automatically. - Use
dynamodb_noprocwhen DynamoDB is already running elsewhere and lifecycle is managed outside pytest.
Simply include one of these fixtures in your test fixture list.
You can also create additional client and process fixtures:
.. code-block:: python
from pytest_dynamodb import factories
dynamodb_my_proc = factories.dynamodb_proc(port=None, delay=True)
dynamodb_my = factories.dynamodb("dynamodb_my_proc")
.. note::
Each DynamoDB process fixture can be configured independently using fixture factory arguments.
.. code-block:: python
from pytest_dynamodb import factories
dynamodb_my_noproc = factories.dynamodb_noproc(host="dynamodb", port=8088)
dynamodb_my = factories.dynamodb("dynamodb_my_noproc")
.. note::
``dynamodb_noproc`` only provides connection details. Process lifecycle and data cleanup are managed by you.
Configuration
You can define settings in three ways:
Fixture factory argumentCommand line optionConfiguration option in pytest.ini
Precedence order:
- Fixture factory argument
- Command line option
pytest.inioption
.. list-table:: Configuration options :header-rows: 1
-
- DynamoDB option
- Fixture factory argument
- Command line option
- pytest.ini option
- Default
-
- Path to DynamoDB JAR directory
- dynamodb_dir
- --dynamodb-dir
- dynamodb_dir
- /tmp/dynamodb
-
- Host
- host
- --dynamodb-host
- dynamodb_host
- 127.0.0.1
-
- Port
- port
- --dynamodb-port
- dynamodb_port
- random
-
- AWS Access Key
- access_key
- --dynamodb-aws_access_key
- dynamodb_aws_access_key
- fakeMyKeyId
-
- AWS Secret Key
- secret_key
- --dynamodb-aws_secret_key
- dynamodb_aws_secret_key
- fakeSecretAccessKey
-
- AWS Region
- region
- --dynamodb-aws_region
- dynamodb_aws_region
- us-west-1
-
Introduce delays <https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html#:~:text=%2DdelayTransientStatuses>_- delay
- --dynamodb-delay
- dynamodb_delay
- false
Example usage:
-
Pass as fixture factory argument:
.. code-block:: python
from pytest_dynamodb import factories dynamodb_proc = factories.dynamodb_proc(port=8888) -
Use command line option:
.. code-block:: shell
pytest tests --dynamodb-port=8888 -
Set in
pytest.ini:.. code-block:: ini
[pytest] dynamodb_port = 8888
Known issues
- Parallel runs with a fixed
--dynamodb-portmay fail because workers contend for the same port.