Тестовете са неразривно свързани с процеса на разработка. Понякога разработчиците трябва да стартират тестовете локално, преди да комитнат промените.
Ако приложението използва Amazon Web Services, python библиотека moto перфектно подхожда за това.

Пълният списък с покрити ресурси може да се види .
На Github има репозиторий Hugo Picado — . Готовият образ, стартирайте и използвайте. Единственият нюанс е, че след стартирането, все още няма AWS ресурси там.
Това е лесно да се поправи.
Тъй като при стартирането е необходимо да се зададе типът услуга (env променлива MOTO_SERVICE), остава само да опишем създаването на ресурса.
Леко ще променим start.sh:
Вместо
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Вмъкваме:
if [ -f /opt/init/bootstrap.py ]; then
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT & (sleep 5 && echo "Изпълнява скрипт за стартиране." && python /opt/init/bootstrap.py)
else
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
fi
wait
Крайният файл изглежда така:
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Създаваме нов образ и го качваме в своя регистър.
Следващата стъпка е да напишем скрипт за инициализация на ресурса, например SWF домейн, използвайки библиотеката за работа с 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="Тестов SWF домейн",
workflowExecutionRetentionPeriodInDays="10"
)
except ClientError as e:
print "Домейнът вече съществува: ", e.response.get("Error", {}).get("Code")
response = client.list_domains(
registrationStatus='REGISTERED',
maximumPageSize=123,
reverseOrder=True|False
)
print 'Готов'
Логиката е следната:
- При стартиране монтираме нашия скрипт в /opt/init/bootstrap.py.
- Ако файлът е монтиран — той ще бъде изпълнен.
- Ако файла няма — просто ще се стартира чист moto-server.
И можете да мокнете целия ресурс, стартирайки само един контейнер:
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
Тестваме в интерактивен режим:

Работи!
По този начин можем да създадем docker-compose.yml, който ще спести време при тестването на промените:
docker-compose.yml
версия: '3'
услуги:
s3:
изображение: picadoh/motocker
среда:
- MOTO_SERVICE=s3
- MOTO_HOST=10.0.1.2
портове:
- "5002:5000"
мрежи:
motonet:
ipv4_address: 10.0.1.2
обеми:
- /tmp/bootstrap_s3.py:/opt/init/bootstrap.py
swf:
изображение: picadoh/motocker
среда:
- MOTO_SERVICE=swf
- MOTO_HOST=10.0.1.3
портове:
- "5001:5000"
мрежи:
motonet:
ipv4_address: 10.0.1.3
обеми:
- /tmp/bootstrap_swf.py:/opt/init/bootstrap.py
ec2:
изображение: picadoh/motocker
среда:
- MOTO_SERVICE=ec2
- MOTO_HOST=10.0.1.4
портове:
- "5003:5000"
мрежи:
motonet:
ipv4_address: 10.0.1.4
обеми:
- /tmp/bootstrap_ec2.py:/opt/init/bootstrap.py
мрежи:
motonet:
драйвер: мост
ipam:
конфигурация:
- подсет: 10.0.0.0/16
Наистина, не само на лаптопа на разработчика може да се използва такъв подход. Предварителните тестове с мока след изграждането ще помогнат за избягване на потенциални проблеми при стартиране в dev* среди.
Линкове:
Motocker хранилище —
Moto хранилище —
Boto3 Документация —
Източник: habr.com
