¿Cómo simular los servicios de AWS DynamoDB para pruebas unitarias?

En este artículo, comprenderemos cómo simular recursos de DynamoDB con la ayuda de ejemplos breves. Pero antes de esto, primero tenemos que entender por qué usamos la burla para fines de prueba. La burla es algo en lo que intentamos hacer una copia o réplica de algunos recursos que se requieren para fines de prueba. Suena confuso, ¿verdad? En términos simples, hacemos una copia de algo para que podamos probar todos y cada uno de los aspectos de cualquier cosa sin tener el temor de perder o actualizar algo importante.

Supongamos que tenemos una función que escribe los datos dados en la tabla de DynamoDB dada, como se muestra a continuación. Este es el método más simple que podemos tomar para ilustrar el funcionamiento de la simulación de AWS DynamoDB. En la función dada, utiliza recursos de DynamoDB para almacenar los datos. Entonces, aquí nos burlaremos de AWS DynamoDB con la ayuda del módulo Moto Python. Moto es muy fácil y conveniente de implementar. 

Python3

# store.py
  
def write(data, table_name):
   dynamodb = boto3.resource('dynamodb')
   table = dynamodb.Table(table_name)
   with table.batch_writer() as batch:
       batch.put_item(Item=data)

 

Para simular esta función, usaremos algunos pasos de la siguiente manera: 

  • Al principio, construya el esqueleto importando los módulos necesarios y decorando nuestro método de prueba con @mock_dynamodb2. Cree un nuevo archivo llamado test_write_into_table.py y agregue la siguiente línea:

Python3

import boto3
from moto import mock_dynamodb2
import store
   
@mock_dynamodb2
def test_write_into_table():
   "Test the write_into_table with a valid input data"

 

  • Ahora, dentro del método test_write_into_table() , cree un recurso de DynamoDB como el siguiente:
dynamodb = boto3.resource('dynamodb')
  • Vamos a crear una tabla de DynamoDB utilizando el recurso de DynamoDB como el código que se muestra a continuación. Allí creamos una tabla llamada ‘prueba’ con la clave principal ‘fecha’ de tipo string (‘S’).

Python3

table_name = 'test'
table = dynamodb.create_table(TableName=table_name,
       KeySchema=[{'AttributeName': 'date','KeyType': 'HASH'}],
       AttributeDefinitions=[{'AttributeName': 'date','AttributeType': 'S'}])

 

  • Aquí, crearemos datos de entrada para store.write(), que también actuarán como los datos esperados después de la lectura.
data = {'date' : '06-Nov-2020','organization' : 'GeeksforGeeks','articles' : 123456}
  • Para una mejor comprensión, tomamos datos únicos, pero uno puede tener más según el requisito. Después de escribir los datos anteriores en la tabla, la tabla se verá de la siguiente manera:
               fecha             organización           artículos
          06-nov-2020                     GeeksforGeeks                     123456          
  • En este punto, cuando se ejecuta store.write(), debe almacenar los datos de entrada dados en la tabla dada correspondiente.
store.write(data,table_name)
  • Leamos los datos pasando ‘fecha’ como clave principal. Tenga en cuenta que estamos obteniendo un diccionario con un par de claves, por lo que para obtener nuestros datos debemos buscar el valor de la clave ‘Elemento’.
response = table.get_item(Key={'date':data['date']})
actual_output = response['Item']
  • Afirmemos que el cuerpo de los datos es el mismo que almacenamos.
assert actual_output == data

Código fuente completo:

Python3

"""
Example of using moto to mock out DynamoDB table
"""
  
import boto3
from moto import mock_dynamodb2
import store
  
  
@mock_dynamodb2
def test_write_into_table():
    "Test the write_into_table with a valid input data"
    dynamodb = boto3.resource('dynamodb')
    table_name = 'test'
    table = dynamodb.create_table(TableName = table_name,
                                  KeySchema = [
                                  {'AttributeName': 'date', 'KeyType': 'HASH'}],
                                  AttributeDefinitions = [
                                  {'AttributeName': 'date', 'AttributeType': 'S'}])
    data = {'date': '06-Nov-2020',
            'organization': 'GeeksforGeeks', 'articles': 123456}
    store.write(data, table_name)
    response = table.get_item(Key={'date': data['date']})
    actual_output = response['Item']
    assert actual_output == data

Producción :

unit testing DynamoDB

Publicación traducida automáticamente

Artículo escrito por Rohit_prasad y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *