Execute testes com integração contínua#

Executar sua suíte de testes localmente é útil enquanto você desenvolve o código e também testa novos recursos ou alterações na base de código. No entanto, também é recomendável configurar a integração contínua (CI) para executar os testes online. A CI permite executar todos os testes na nuvem. Embora localmente talvez você só consiga executar testes em um sistema operacional específico, com a CI é possível definir testes para várias versões do Python e diferentes sistemas operacionais.

A CI também pode ser acionada por pull requests e pushes no repositório. Isso significa que cada pull request enviado por você, pela equipe de mantenedores ou por um contribuidor pode ser testado. No fim, os testes de CI garantem que seu código continue funcionando conforme o esperado, mesmo com as alterações feitas na base de código.

CI e pull requests#

A CI é inestimável quando pessoas de fora contribuem com seu software. Você pode configurá-la para ser executada em todos os pull requests enviados ao repositório. A CI pode tornar seu repositório mais acolhedor para novos contribuidores em potencial. Ela permite que os usuários contribuam com código, correções na documentação e muito mais sem precisar criar ambientes de desenvolvimento, executar testes e construir a documentação localmente.

Exemplo de GitHub Actions que executa testes#

A seguir, veja um exemplo de GitHub Actions que executa testes com nox no Windows, Mac e Linux e nas versões 3.9-3.11 do Python.

Para funcionar corretamente, esse arquivo deve estar localizado no diretório raiz do seu repositório no GitHub:

pyospackage/
├──.github/
   └── workflows/
       └── run-tests.yml # The name of this file can be whatever you wish
name: Pytest unit/integration

on:
  pull_request:
  push:
    branches:
      - main

# Use bash by default in all jobs
defaults:
  run:
    shell: bash

jobs:
  build-test:
    name: Test Run (${{ matrix.python-version }}, ${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: ["ubuntu-latest", "macos-latest", "windows-latest"]
        python-version: ["3.9", "3.10", "3.11"]

    steps:
      - uses: actions/checkout@v4
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          python -m pip install nox
      - name: List installed packages
        run: pip list
      - name: Run tests with pytest & nox
        run: |
          nox -s tests-${{ matrix.python-version }}
      # You only need to upload code coverage once to codecov unless you have a
      # more complex build that you need coverage for.
      - name: Upload coverage to Codecov
        if: ${{ matrix.os == 'ubuntu-latest' &&  matrix.python-version == '3.10'}}
        uses: codecov/codecov-action@v3