Testning Àr en vÀsentlig del av utvecklingsprocessen. Ibland behöver utvecklare köra tester lokalt före de gör en commit av Àndringar.
Om applikationen anvÀnder Amazon Web Services, python biblioteket moto Àr perfekt för detta.

Du kan se hela listan över resursövervakning .
Det finns ett repo pĂ„ Github Hugo Picado â . En fĂ€rdig bild, starta och anvĂ€nd. Det enda som krĂ€vs Ă€r att efter uppstarten, inga AWS resurser har skapats dĂ€r Ă€nnu.
NÄvÀl, det Àr ganska lÀtt att lösa.
Eftersom det Àr nödvÀndigt att ange typen av tjÀnst (env variabeln MOTO_SERVICE), mÄste vi beskriva skapandet av resursen.
LÄt oss Àndra lite pÄ start.sh:
IstÀllet för
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
SĂ€tt in:
if [ -f /opt/init/bootstrap.py ]; then
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Kör bootstrap-skriptet." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait
Den slutgiltiga filen blir:
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
waitVi bygger en ny bild och pushar till vÄrt registry.
DĂ€refter skriver vi ett skript för att initiera resursen, till exempel SWF-domĂ€n, med hjĂ€lp av biblioteket för att arbeta 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-domÀn",
workflowExecutionRetentionPeriodInDays="10"
)
except ClientError as e:
print "DomÀnen finns redan: ", e.response.get("Error", {}).get("Code")
response = client.list_domains(
registrationStatus='REGISTERED',
maximumPageSize=123,
reverseOrder=True|False
)
print 'Klar'
Logiken Àr följande:
- Vi monterar vÄrt skript vid uppstart i /opt/init/bootstrap.py.
- Om filen Ă€r monterad â kommer den att köras.
- Om filen inte finns â kommer bara en ren moto-server att starta.
Och vi kan mocks en hel resurs genom att starta en enda 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
LÄt oss prova i interaktivt lÀge:

Det fungerar!
SÄ, vi kan skapa en docker-compose.yml, som hjÀlper till att spara tid pÄ att testa Àndringar:
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
Egentligen kan man inte bara anvÀnda en sÄdan metod pÄ utvecklarens bÀrbara dator. Förhandsprov med mocks efter bygget hjÀlper till att bli av med möjliga problem vid körning i dev* miljöer.
LĂ€nkar:
Motocker repo â
Moto repo â
Boto3 Docs â
KĂ€lla: habr.com
