首页 > 解决方案 > 在 dockerized flask + postgres 应用程序中管理 pytest 测试的任何推荐方法?

问题描述

我正在用 Docker、Flask 和 Postgres 编写一个应用程序。我目前有一个用于开发的 docker-compose.yml 文件和一个用于测试的文件。主要目标是使用不同的数据库。

我还可以让一个 docker compose 文件包含 2 个数据库,一个服务“后端”连接到一个数据库,一个“测试”连接到另一个数据库......

有没有推荐的方法来管理 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

引导开发文件

#!/bin/sh
flask db init
flask db migrate
flask db upgrade
exec flask run --host=0.0.0.0

引导测试.sh

#!/bin/sh
flask db init
flask db migrate
flask db upgrade
exec pytest

标签: postgresqldockerflaskpytest

解决方案


推荐阅读