Testen is een essentieel onderdeel van het ontwikkelingsproces. Soms moeten ontwikkelaars tests lokaal uitvoeren, voordat ze wijzigingen committen.
Als de applicatie gebruikmaakt van Amazon Web Services, python bibliotheek moto is hier perfect voor.

De volledige lijst met ondersteunde resources kan bekeken worden .
Op Github is er een repository Hugo Picado — . Een kant-en-klaar beeld, start en gebruik het. Het enige punt is dat er na de start nog geen AWS resources zijn aangemaakt.
Nou, dat is vrij eenvoudig op te lossen.
Aangezien we bij het starten het type service moeten opgeven (env variabele MOTO_SERVICE), moeten we het aanmaken van de resource beschrijven.
Laten we start.sh:
In plaats van
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Toevoegen:
if [ -f /opt/init/bootstrap.py ]; then
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Script voor initialisatie uitvoeren." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait
Het eindresultaat is dan:
start.sh
#!/bin/sh
# validate required input
if [ -z "$MOTO_SERVICE" ]; then
echo "Please define AWS service to run with Moto Server (e.g. s3, ec2, etc)"
exit 1
fi
# setting defaults for optional input
if [ -z "$MOTO_HOST" ]; then
MOTO_HOST="0.0.0.0"
fi
if [ -z "$MOTO_PORT" ]; then
MOTO_PORT="5000"
fi
echo "Starting service $MOTO_SERVICE at $MOTO_HOST:$MOTO_PORT"
if [ -f /opt/init/bootstrap.py ]; then
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Executing bootstrap script." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
# Prevent container from exiting when bootstrap.py finishing
waitWe bouwen een nieuw beeld en pushen dit naar onze registry.
Vervolgens schrijven we een script voor het initialiseren van de resource, bijvoorbeeld SWF domein, met gebruik van de bibliotheek voor de interactie met AWS — boto3:
bootstrap_swf.py
import boto3
from botocore.exceptions import ClientError
import os
os.environ["AWS_ACCESS_KEY_ID"] = "fake"
os.environ["AWS_SECRET_ACCESS_KEY"] = "fake"
client = boto3.client('swf', region_name='us-west-2', endpoint_url='http://localhost:5000')
try:
client.register_domain(
name='test-swf-mock-domain',
description="Test SWF domein",
workflowExecutionRetentionPeriodInDays="10"
)
except ClientError as e:
print "Domein bestaat al: ", e.response.get("Error", {}).get("Code")
response = client.list_domains(
registrationStatus='REGISTERED',
maximumPageSize=123,
reverseOrder=True|False
)
print 'Klaar'
De logica is als volgt:
- We monteren ons script bij de start in /opt/init/bootstrap.py.
- Als het bestand is gemonteerd, wordt het uitgevoerd.
- Als het bestand niet bestaat, zal alleen de kale moto-server worden gestart.
En we kunnen een hele resource mocken door slechts één container te starten:
docker run --name swf -d
-e MOTO_SERVICE=swf
-e MOTO_HOST=0.0.0.0
-e MOTO_PORT=5000
-p 5001:5000
-v /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
-i awesome-repo.com/moto-server:latest
Laten we het in interactieve modus proberen:

Werkt!
Zo kunnen we een docker-compose.yml maken, die tijd bespaart bij het testen van wijzigingen:
docker-compose.yml
versie: '3'
diensten:
s3:
afbeelding: picadoh/motocker
omgeving:
- MOTO_SERVICE=s3
- MOTO_HOST=10.0.1.2
poorten:
- "5002:5000"
netwerken:
motonet:
ipv4_adres: 10.0.1.2
volumes:
- /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
swf:
afbeelding: picadoh/motocker
omgeving:
- MOTO_SERVICE=swf
- MOTO_HOST=10.0.1.3
poorten:
- "5001:5000"
netwerken:
motonet:
ipv4_adres: 10.0.1.3
volumes:
- /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
ec2:
afbeelding: picadoh/motocker
omgeving:
- MOTO_SERVICE=ec2
- MOTO_HOST=10.0.1.4
poorten:
- "5003:5000"
netwerken:
motonet:
ipv4_adres: 10.0.1.4
volumes:
- /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
netwerken:
motonet:
driver: brug
ipam:
config:
- subnet: 10.0.0.0/16
Eigenlijk is deze aanpak niet alleen voor de laptop van de ontwikkelaar. Voorlopige tests met mocks na de bouw helpen mogelijke problemen bij de executie in dev* omgevingen te voorkomen.
Links:
Motocker repo —
Moto repo —
Boto3 Docs —
Bron: habr.com
