Tests sind ein integraler Bestandteil des Entwicklungsprozesses. Und manchmal müssen Entwickler Tests lokal ausführen, bevor sie Änderungen vornehmen.
Wenn die Anwendung verwendet Amazon Web Services, python библиотека Motorrad perfekt dafür.
Eine vollständige Liste der Ressourcenabdeckung kann angezeigt werden
Auf Github gibt es eine Rübe Hugo Picado -
Nun, das lässt sich leicht beheben.
Da Sie beim Start die Art des Dienstes angeben müssen (env Variable MOTO_SERVICE), müssen wir nur die Erstellung der Ressource beschreiben.
Lass es uns ein wenig ändern start.sh:
Statt
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Einfügen:
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
wait
Die endgültige Datei ist:
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
wait
Wir erstellen ein neues Image und übertragen es in unsere Registrierung.
Als Nächstes schreiben wir beispielsweise ein Ressourceninitialisierungsskript SWF-Domäne, Verwendung der Bibliothek für die Arbeit mit 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 domain",
workflowExecutionRetentionPeriodInDays="10"
)
except ClientError as e:
print "Domain already exists: ", e.response.get("Error", {}).get("Code")
response = client.list_domains(
registrationStatus='REGISTERED',
maximumPageSize=123,
reverseOrder=True|False
)
print 'Ready'
Die Logik ist folgende:
- Zu Beginn mounten wir unser Skript /opt/init/bootstrap.py.
- Wenn die Datei gemountet ist, wird sie ausgeführt.
- Wenn keine Datei vorhanden ist, wird einfach der nackte Moto-Server gestartet.
Und Sie können eine ganze Ressource verspotten, indem Sie einen Container 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
Probieren wir es interaktiv aus:
Es funktioniert!
So können wir docker-compose.yml erstellen, was Zeit beim Testen von Änderungen spart:
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
Tatsächlich kann dieser Ansatz nicht nur auf dem Laptop eines Entwicklers verwendet werden. Vorläufige Tests mit Mocks nach dem Zusammenbau helfen dabei, mögliche Probleme bei der Ausführung in Entwicklungsumgebungen zu beseitigen.
Links:
Motocker-Repo -
Moto-Repo -
Boto3-Dokumente -
Source: habr.com