Testen ist ein wichtiger Teil des Entwicklungsprozesses. Und manchmal müssen Entwickler Tests lokal ausführen, bevor sie Änderungen vornehmen können.
Wenn Ihre Anwendung
Amazon Web Services verwendet , ist
Python Library
Moto die perfekte Lösung dafür.

Die vollständige Liste der Implementierungsabdeckung finden Sie
hier .
Ich habe das Repo von
Hugo Picado auf Github gefunden -
Moto-Server . Bereit, das Bild zu starten und zu verwenden. Die einzige Nuance ist, dass nach dem Start keine
AWS- Ressourcen erstellt werden.
Nun, es ist ziemlich einfach, das Problem zu beheben.
Während wir die
env- Variable
MOTO_SERVICE definieren
müssen , um den Ressourcentyp beim Start anzugeben, müssen wir nur noch die Ressourcenerstellung definieren.
Update
start.sh :
Ersetzen
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
mit
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 Datei sollte wie folgt aussehen:
Erstellen Sie ein neues Image und übertragen Sie es in Ihre Registrierung.
Lassen Sie uns außerdem ein Skript zur Ressourceninitialisierung erstellen und die Bibliothek für die Arbeit mit AWS - boto3 verwenden. ZB
SWF-Domain :
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'
Logischerweise:
- Hängen Sie unser Bootstrap-Skript in /opt/init/bootstrap.py ein
- Wenn die Datei gemountet ist, wird sie ausgeführt
- Wenn nicht, wird der einzige Moto-Server gestartet
Wir können also die gesamte Ressource verspotten, indem wir nur einen Container ausführen:
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
Versuchen wir es im interaktiven Modus:

Es funktioniert!
Auf diese Weise können wir docker-compose.yml erstellen, um Zeit beim Testen von Änderungen zu sparen:
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
Übrigens können wir diesen Ansatz nicht nur auf dem Laptop des Entwicklers anwenden. Vorläufige Tests mit Mocks nach dem Build helfen uns, mögliche Probleme in den dev * -Umgebungen zu beseitigen.
Links:
Motocker Repo -
github.com/picadoh/motockerMoto repo -
github.com/spulec/motoBoto3 Docs -
boto3.amazonaws.com/v1/documentation/api/latest/index.html