diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index aac1f81..17ce58f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,6 +14,10 @@ permissions: jobs: test: runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ['3.12', '3.13'] steps: - name: Checkout código @@ -22,7 +26,7 @@ jobs: - name: Configurar Python uses: actions/setup-python@v7 with: - python-version: '3.12' + python-version: ${{ matrix.python-version }} cache: 'pip' - name: Instalar dependências @@ -45,8 +49,10 @@ jobs: - name: Rodar testes run: pytest + # Cobertura, relatório HTML e Pages só precisam de uma versão do Python + # gerando o artifact — rodar pras duas duplicaria o upload à toa. - name: Enviar cobertura para o Codecov - if: always() + if: always() && matrix.python-version == '3.12' uses: codecov/codecov-action@v7 with: files: reports/coverage.xml @@ -54,7 +60,7 @@ jobs: fail_ci_if_error: false - name: Publicar relatório HTML - if: always() + if: always() && matrix.python-version == '3.12' uses: actions/upload-artifact@v7 with: name: pytest-report @@ -62,13 +68,13 @@ jobs: retention-days: 15 - name: Preparar página do GitHub Pages - if: github.ref == 'refs/heads/master' && github.event_name == 'push' + if: matrix.python-version == '3.12' && github.ref == 'refs/heads/master' && github.event_name == 'push' run: | mkdir -p pages cp reports/report.html pages/index.html - name: Empacotar artifact do GitHub Pages - if: github.ref == 'refs/heads/master' && github.event_name == 'push' + if: matrix.python-version == '3.12' && github.ref == 'refs/heads/master' && github.event_name == 'push' uses: actions/upload-pages-artifact@v5 with: path: pages diff --git a/README.md b/README.md index 6400368..a0b97bf 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,7 @@ Autenticação: `POST /auth` com `{ "username": "admin", "password": "password12 - Cobertura de código (`pytest-cov`) de `api/` e `models/` em cada execução, acompanhada no [Codecov](https://codecov.io/gh/ThomasTDS/qa-api-python). - Limpeza automática: a fixture `context` remove o booking criado no cenário (via token próprio de limpeza) ao final de cada teste, evitando acúmulo de dados na API pública. - Retry automático (`pytest-rerunfailures`, `--reruns 1`): um cenário que falha roda uma segunda vez antes de ser reportado como falha, amortecendo instabilidade transitória da API pública de demonstração. -- Integração contínua via GitHub Actions: os testes rodam automaticamente a cada push e pull request para `master`, e também diariamente às 06:00 UTC (ver [.github/workflows/tests.yml](.github/workflows/tests.yml)) para detectar quebras causadas pela própria API pública, com o relatório HTML publicado como artifact do workflow. +- Integração contínua via GitHub Actions: os testes rodam automaticamente a cada push e pull request para `master`, em Python 3.12 e 3.13, e também diariamente às 06:00 UTC (ver [.github/workflows/tests.yml](.github/workflows/tests.yml)) para detectar quebras causadas pela própria API pública, com o relatório HTML publicado como artifact do workflow. - Dependências atualizadas automaticamente pelo Dependabot (pip e GitHub Actions, semanal — ver [.github/dependabot.yml](.github/dependabot.yml)). PRs de patch/minor com CI verde são mergeados automaticamente ([.github/workflows/dependabot-auto-merge.yml](.github/workflows/dependabot-auto-merge.yml)); bumps de major exigem revisão manual. - Auditoria de vulnerabilidades conhecidas nas dependências instaladas a cada execução do CI, via [`pip-audit`](https://github.com/pypa/pip-audit); encontrar uma vulnerabilidade quebra o build. - Rastreabilidade de QA: matriz de test cases em [docs/test-cases.md](docs/test-cases.md), com tags `@TC-XXX` em cada `Scenario` e um subconjunto `@smoke` (`pytest -m smoke`) cobrindo os fluxos ponta-a-ponta mais críticos. Bugs reais encontrados são documentados como GitHub Issues usando o template em [.github/ISSUE_TEMPLATE/bug_report.md](.github/ISSUE_TEMPLATE/bug_report.md). @@ -145,11 +145,11 @@ Autenticação: `POST /auth` com `{ "username": "admin", "password": "password12 ### Fluxo de Trabalho -A branch `master` é protegida: toda mudança passa por Pull Request, e o merge só é liberado depois que o check de CI (`test`) passa. Fluxo padrão: +A branch `master` é protegida: toda mudança passa por Pull Request, e o merge só é liberado depois que os checks de CI (`test (3.12)` e `test (3.13)`) passarem. Fluxo padrão: ``` git checkout -b minha-branch # editar, rodar pytest localmente git push -u origin minha-branch -# abrir PR no GitHub, aguardar o check "test" passar, fazer merge +# abrir PR no GitHub, aguardar os checks passarem, fazer merge ```