function
: executada em todas as funções de teste;class
: executada uma vez por classe de teste;module
: executada uma vez por módulo;package
: executada uma vez por pacote;session
: executava uma vez por execução dos testes;Para resolver o problema com a lentidão dos testes, iremos criar uma fixture para iniciar o container do banco de dados com o escopo session
.
Para criar um única imagem docker, podemos iniciar ela de forma isolada na aplicação
@pytest.fixture(scope='session')
def engine():
with PostgresContainer('postgres:16', driver='psycopg') as postgres:
yield create_async_engine(postgres.get_connection_url())
@pytest_asyncio.fixture
async def session(engine):
async with engine.begin() as conn:
await conn.run_sync(table_registry.metadata.create_all)
async with AsyncSession(engine, expire_on_commit=False) as session:
yield session
async with engine.begin() as conn:
await conn.run_sync(table_registry.metadata.drop_all)
Agora a session faz tudo que precisa fazer, mas sem a responsabilidade do iniciar a conexão
Criando a imagem do nosso projeto
FROM python:3.13-slim
ENV POETRY_VIRTUALENVS_CREATE=false
WORKDIR app/
COPY . .
RUN pip install poetry
RUN poetry config installer.max-workers 10
RUN poetry install --no-interaction --no-ansi --without dev
EXPOSE 8000
CMD poetry run uvicorn --host 0.0.0.0 fast_zero.app:app
# Criar a imagem
docker build -t "fast_zero" .
# Iniciar a imagem
docker run -it --name fastzeroapp -p 8000:8000 fast_zero:latest
Podemos acessar para ver nossa aplicação http://127.0.0.1:8000/docs
Docker compose
A ideia do docker compose é criar um único arquivo yaml
que reúna todos os containers necessários para executar a aplicação.
Dessa forma podemos gerenciar todos os os containers com um único comando o docker compose
.
services:
fastzero_database:
image: postgres
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: app_user
POSTGRES_DB: app_db
POSTGRES_PASSWORD: app_password
ports:
- "5432:5432"
volumes:
pgdata:
fastzero_app:
image: fastzero_app
build: .
ports:
- "8000:8000"
depends_on:
- fastzero_database
environment:
DATABASE_URL: postgresql+psycopg://app_user:app_password@fastzero_database:5432/app_db
docker compose up
Não ... migrações ...
A ideia do entrypoint é alterar o comando CMD
para executar um script bash.
#!/bin/sh
# Executa as migrações do banco de dados
poetry run alembic upgrade head
# Inicia a aplicação
poetry run uvicorn --host 0.0.0.0 --port 8000 fast_zero.app:app
Assim que o container for inciado, ele executará esse script.
fastzero_app:
image: fastzero_app
entrypoint: ./entrypoint.sh
build: .
docker-compose up --build
git add .
git commit -m "Dockerizando nossa aplicação e inserindo o PostgreSQL"
Na próxima aula vamos conversar sobre como criar estruturas de testes que rodam no github, via integração contínua. Uma boa introdução para o assunto é essa live de python:
mermaid.js