Testing er en integrert del av utviklingsprosessen. Og noen ganger må utviklere kjøre tester lokalt før de foretar endringer.
Hvis applikasjonen bruker Amazon Web Services, python библиотека moto perfekt for dette.
En fullstendig liste over ressursdekning kan sees
Det er en nepe på Github Hugo Picado -
Vel, det er lett nok å fikse.
Siden du starter må du spesifisere typen tjeneste (env variabel MOTO_SERVICE), må vi bare beskrive opprettelsen av ressursen.
La oss endre det litt start.sh:
I stedet for
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Sett inn:
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
Den endelige filen er:
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
Vi bygger et nytt bilde og skyver det inn i registeret vårt.
La oss deretter skrive et ressursinitialiseringsskript, for eksempel SWF-domene, bruker biblioteket for å jobbe med 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'
Logikken er denne:
- Når vi starter, monterer vi skriptet vårt /opt/init/bootstrap.py.
- Hvis filen er montert, vil den bli utført.
- Hvis det ikke er noen fil, starter den bare moto-serveren.
Og du kan håne en hel ressurs ved å starte én beholder:
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
La oss prøve det interaktivt:
Det fungerer!
Så vi kan lage docker-compose.yml, som vil spare tid på å teste endringer:
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 tilnærmingen brukes ikke bare på en utviklers bærbare datamaskin. Foreløpige tester med mocks etter montering vil bidra til å bli kvitt mulige problemer når du kjører på dev*-miljøer.
referanser:
Motocker repo -
Moto repo -
Boto3 Dokumenter -
Kilde: www.habr.com