DynamoDB in examples, Example 1.3: DynamoDB local and testing
May be useful for:
- development without steady internet connection
- testing
- reduce ddb usage costs
See DynamoDB local documentation.
I use Makefile to run DynamoDB locally:
dynamodb:
java -Djava.library.path=./bin/DynamoDBLocal_lib -jar ./bin/DynamoDBLocal.jar -port 8010 -inMemory # -dbPath ./bin/db.bin
And usually I run it with inMemory key, that allows to have a clean database after restart.
You can download DynamoDB local binaries from DynamoDB local documentation page. I place binaries in ./bin folder of the project:
- project
- bin
- DynamoDBLocal.jar
- DynamoDBLocal_lib
- Makefile
To use DynamoDB local instead of amazon service, we need to set endpoint url to our DynamoDB local server url:
http://localhost:8010
Let's write a functional test for our previous example to see how it works:
import unittest
import uuid
from example_1 import DDBUserWallet
from unittest import mock
DDB_LOCAL_URL = 'http://localhost:8010'
class DDBUserWalletTestCase(unittest.TestCase):
@mock.patch('example_1.DDBUserWallet._get_endpoint_url')
def test_update_and_get(self, _get_endpoint_url_mock):
_get_endpoint_url_mock.return_value = DDB_LOCAL_URL
user_wallet = DDBUserWallet()
user_wallet.create_table()
user_id = uuid.uuid4()
for balance in [100, 123]:
user_wallet.update(user_id=user_id, balance=balance)
self.assertEqual(user_wallet.get(user_id=user_id)['balance'], balance)
if __name__ == '__main__':
unittest.main()
# (.env)nanvel-air:example_1_3 nanvel$ python example_1_3.py
# .
# ----------------------------------------------------------------------
# Ran 1 test in 0.323s
#
# OK
You also may use decorator like this instead @mock.patch:
import functools
from mock import patch
DDB_LOCAL_URL = 'http://localhost:8010'
def with_ddb_local(method):
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
return patch(
'example_1.DDBUserWallet._get_endpoint_url',
new=lambda x: DDB_LOCAL_URL)(
method)(self, *args, **kwargs)
return wrapper
Licensed under CC BY-SA 3.0