我正在用Docker,Flask和Postgres编写一个应用程序。 我目前有一个用于开发的docker-compose.yml文件和一个用于测试的文件。主要目的是使用不同的数据库。
我还可以有一个包含2个数据库的docker compose文件,一个服务“后端”连接到一个数据库,一个“测试”连接到另一个数据库...
是否有建议的方法来管理dockerized flask + postgres应用程序中的pytest测试?
我的应用程序工厂
def create_app(testing=False):
app = Flask(__name__)
app.config.from_pyfile("config.py")
if testing:
app.config["TESTING"] = True
initialize_extensions(app)
app.register_blueprint(phaunos_api)
register_cli(app)
return app
基本测试模块
import pytest
from phaunos import create_app
from phaunos.models import db
from phaunos.phaunos.models import TagType
@pytest.fixture(scope='module')
def test_app():
app = create_app(testing=True)
with app.app_context():
yield app
@pytest.fixture(scope='module')
def test_db(test_app):
db.drop_all()
db.create_all()
yield db
db.session.remove()
db.drop_all()
def test_add_tagtype(test_db):
tt = TagType()
tt.name = "tagtype1"
db.session.add(tt)
db.session.commit()
assert len(TagType.query.all()) == 1
docker-compose.dev.yml
version: '3'
services:
db:
image: postgres
env_file:
- .db.dev.env
volumes:
- ./data-dev:/var/lib/postgresql/data
networks:
- db_nw
backend:
env_file:
- .backend.dev.env
- .db.dev.env
build:
context: backend
dockerfile: Dockerfile
volumes:
- ./backend:/app
depends_on:
- db
networks:
- db_nw
ports:
- "5000:5000"
entrypoint:
- backend/boot.dev.sh
networks:
db_nw:
driver: bridge
docker-compose.test.yml
version: '3'
services:
db:
image: postgres
env_file:
- .db.test.env
networks:
- db_nw
backend:
env_file:
- .backend.test.env
- .db.test.env
build:
context: backend
dockerfile: Dockerfile
depends_on:
- db
networks:
- db_nw
ports:
- "5000:5000"
entrypoint:
- ./boot.test.sh
networks:
db_nw:
driver: bridge
db.dev.env
POSTGRES_USER=some_user
POSTGRES_PASSWORD=some_pwd
POSTGRES_DB=db_dev
POSTGRES_SERVER=db
db.test.env
POSTGRES_USER=some_user
POSTGRES_PASSWORD=some_pwd
POSTGRES_DB=db_test
POSTGRES_SERVER=db
boot.dev.sh
#!/bin/sh
flask db init
flask db migrate
flask db upgrade
exec flask run --host=0.0.0.0
boot.test.sh
#!/bin/sh
flask db init
flask db migrate
flask db upgrade
exec pytest