Testning er en uundgåelig del af udviklingsprocessen. Og nogle gange har udviklere brug for at køre tests lokalt, før de forpligter ændringer.
Hvis applikationen bruger Amazon Web Services, python biblioteket moto er perfekt til dette.

Du kan se den komplette liste over dækning af ressourcer .
Der er en repo på Github Hugo Picado — . En klar image, start og brug. Det eneste er, at efter starten er der ingen AWS ressourcer oprettet der endnu.
Nå, det er ret nemt at rette.
Da det er nødvendigt at angive servicetypen ved opstart (env variabel MOTO_SERVICE), er vi tilbage til at beskrive oprettelsen af ressourcen.
Lad os ændre lidt på start.sh:
I stedet for
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Indsæt:
if [ -f /opt/init/bootstrap.py ]; then
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Kører bootstrap script." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
vent
Den endelige fil bliver:
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
waitBygger et nyt image og skubber til dit registry.
Dernæst skriver vi et initialiseringsscript for ressourcen, f.eks. SWF domæne, ved at bruge biblioteket til 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 domæne",
workflowExecutionRetentionPeriodInDays="10"
)
except ClientError as e:
print "Domænet eksisterer allerede: ", e.response.get("Error", {}).get("Code")
response = client.list_domains(
registrationStatus='REGISTERED',
maximumPageSize=123,
reverseOrder=True|False
)
print 'Klar'
Logikken er sådan:
- Vi monterer vores script ved opstart i /opt/init/bootstrap.py.
- Hvis filen er monteret — vil den blive eksekveret.
- Hvis filen ikke findes — vil det bare starte en ren moto-server.
Og vi kan simulerer en hel ressource ved at starte en container:
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
Lad os prøve i interaktiv tilstand:

Det virker!
Dermed kan vi lave en docker-compose.yml, der vil hjælpe med at spare tid på at teste ændringer:
docker-compose.yml
version: '3'
services:
s3:
image: picadoh/motocker
environment:
- MOTO_SERVICE=s3
- MOTO_HOST=10.0.1.2
ports:
- "5002:5000"
networks:
motonet:
ipv4_address: 10.0.1.2
volumes:
- /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
swf:
image: picadoh/motocker
environment:
- MOTO_SERVICE=swf
- MOTO_HOST=10.0.1.3
ports:
- "5001:5000"
networks:
motonet:
ipv4_address: 10.0.1.3
volumes:
- /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
ec2:
image: picadoh/motocker
environment:
- MOTO_SERVICE=ec2
- MOTO_HOST=10.0.1.4
ports:
- "5003:5000"
networks:
motonet:
ipv4_address: 10.0.1.4
volumes:
- /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
networks:
motonet:
driver: bridge
ipam:
config:
- subnet: 10.0.0.0/16
Faktisk kan denne tilgang ikke kun bruges på udviklerens laptop. Forudgående tests med mocks efter bygningen vil hjælpe med at undgå mulige problemer, når de køres i dev* miljøer.
Links:
Motocker repo —
Moto repo —
Boto3 Docs —
Kilde: habr.com
