perf: banco de teste pré-migrado nos testes de backend #43
Loading…
Reference in a new issue
No description provided.
Delete branch "feature/backend-test-fixture-speedup"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Segunda parte da investigação de velocidade da suíte de backend (a primeira, instrumentação de fases +
--durations=30, está na PR da branchci-speed-investigation).Causa raiz confirmada
_load_app(tmp_path, monkeypatch)era duplicado idêntico em 16 arquivos de teste e sempre apontava pra um SQLite vazio. O lifespan do FastAPI rodadatabase.init_db()(==alembic upgrade head) a cadaTestClient(app)— isso sozinho custava ~1.5s por teste (isolei essa medição diretamente, e bate com o--durations=30real da CI: praticamente todo teste do top 30 ficava entre 2.5s e 4.9s). Com ~110 dos 151 testes nesse caminho, essa replay de migration respondia por ~180 dos ~250s da suíte inteira. Controle: os 30 testes que nunca tocam_load_app(test_architecture.py,test_hubspot_client.py,test_scenario_status.py) rodam em 1.55s total.Mudança
Centraliza
_load_appembackend/tests/conftest.py(novo) e muda seu comportamento: agora aponta pra uma cópia de um banco já migrado atéhead, construído uma única vez por sessão de pytest, em vez de um banco vazio.database.init_db()continua rodando de verdade a cadaTestClient(app)via o lifespan demain.py— nada mudou lá — só que, como a cópia já está em head, vira uma checagem idempotente de ~50ms em vez de reaplicar as 18 migrations do zero.Isolamento entre testes continua total: cada teste ainda recebe seu próprio arquivo físico (cópia fresca), nunca compartilha conexão, transação ou estado com outro teste — não é rollback/savepoint compartilhado, é um arquivo novo por teste, só que pré-populado em vez de vazio.
_load_app_from_scratchpreserva o comportamento antigo (banco vazio, sem atalho nenhum) e é usado exclusivamente portest_alembic_initialization_is_idempotent_and_reaches_head— o único teste que existe especificamente pra provar que o Alembic aplica as migrations do zero. Esse continua rodando as migrations de verdade, sem nenhum atalho.Resultado
Suíte inteira (151 testes, nenhum removido) caiu de ~262s para ~67s localmente — quase 4x mais rápida — sem tirar cobertura nenhuma.
Verificação
pytest -q— 151 passed (mesma contagem de antes)pip check— okcompileall— okscripts/sqlite-restore-drill.py) — não tocado, continua rodandoinit_db()do jeito que sempre rodou