Kiểm thử là một phần không thể thiếu trong quá trình phát triển. Và đôi khi các nhà phát triển cần chạy thử nghiệm cục bộ trước khi thực hiện các thay đổi.
Nếu ứng dụng sử dụng Amazon Web Services, mãng xà thư viện moto hoàn hảo cho việc này.

Một danh sách đầy đủ phạm vi tài nguyên có thể được xem .
Có một củ cải trên Github Hugo Picado - . Hình ảnh sẵn sàng, khởi chạy và sử dụng. Sắc thái duy nhất là sau khi ra mắt, không AWS tài nguyên vẫn chưa được tạo ra ở đó.
Chà, điều đó đủ dễ để sửa chữa.
Vì khi bắt đầu bạn cần chỉ định loại dịch vụ (env Biến đổi MOTO_SERVICE), chúng ta chỉ cần mô tả việc tạo ra tài nguyên.
Hãy thay đổi nó một chút bắt đầu.sh:
Thay vì
moto_server $MOTO_SERVICE -H $MOTO_HOST -p $MOTO_PORT
Chèn:
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
Tệp cuối cùng là:
bắt đầu.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
waitChúng tôi xây dựng một hình ảnh mới và đẩy nó vào sổ đăng ký của chúng tôi.
Tiếp theo, hãy viết một tập lệnh khởi tạo tài nguyên, ví dụ miền SWF, sử dụng thư viện để làm việc với 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'
Logic là thế này:
- Khi bắt đầu, chúng tôi gắn tập lệnh của mình vào /opt/init/bootstrap.py.
- Nếu tập tin được gắn kết, nó sẽ được thực thi.
- Nếu không có tệp, máy chủ moto đơn giản sẽ khởi động.
Và, bạn có thể mô phỏng toàn bộ tài nguyên bằng cách khởi chạy một vùng chứa:
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
Hãy thử tương tác:

Nó hoạt động!
Vì vậy, chúng ta có thể tạo docker-compose.yml, điều này sẽ tiết kiệm thời gian kiểm tra các thay đổi:
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
Trên thực tế, phương pháp này không chỉ có thể được sử dụng trên máy tính xách tay của nhà phát triển. Các thử nghiệm sơ bộ với mô hình sau khi lắp ráp sẽ giúp loại bỏ các vấn đề có thể xảy ra khi chạy trên môi trường dev*.
Links:
Kho lưu trữ Motocker -
Kho lưu trữ Moto -
Tài liệu Boto3 -
Nguồn: www.habr.com
