Definindo um pipeline
O Pipeline de testes será
- Garantir que o ambiente está em execução com o docker compose
- Garantir que existe um banco de dados
dundie_test
e que este banco está vazio. - Executar as migrations com alembic e garantir que funcionou
- Executar os testes com Pytest
- Apagar o banco de dados de testes
Vamos adicionar um comando reset_db
no cli
edite dundie/cli.py
# imports
from .db import engine, SQLModel
# Final
@main.command()
def reset_db(
force: bool = typer.Option(
False, "--force", "-f", help="Run with no confirmation"
)
):
"""Resets the database tables"""
force = force or typer.confirm("Are you sure?")
if force:
SQLModel.metadata.drop_all(engine)
O comando acima poderá ser executado com a flag -f
que irá pualr a etapa de confirmação.
Em um ambiente de CI geralmente usamos Github Actions
ou Jenkins
para executar
esses passos, em nosso caso vamos usar um script em bash para executar essas tarefas,
no treinamento Python Automation que também faz parte do pacote Python Expert será
abordado como automatizar esses processos usando os principais serviços de CI.
Confira o conteúdo do arquivo test.sh
na raiz do repositório.
#!/usr/bin/bash
# Start environment with docker compose
DUNDIE_DB=dundie_test docker compose up -d
# wait 5 seconds
sleep 5
# Ensure database is clean
docker compose exec api dundie reset-db -f
docker compose exec api alembic stamp base
# run migrations
docker compose exec api alembic upgrade head
# run tests
docker compose exec api pytest -v -l --tb=short --maxfail=1 tests/
# Stop environment
docker compose down
- definimos um banco de dados diferente usando a variável
DUNDIE_DB
- iniciamos o ambiente com o docker compose
- esperamos 5 segundos para garantir que o banco de dados está pronto
- resetamos o banco de dados
- executamos as migrations para garantir que temos todas as tabelas e dados
- executamos os testes usando pytest
- finalizamos o ambiente
Em caso de falha nos testes o ambiente não será parado, permitindo assim o debugging com o ambiente em execução.
O próximo passo é configurar o nosso test-runner, o pytest -->