Execute testes com Nox#
O Nox é uma ferramenta de automação baseada em Python para executar testes em várias versões do Python e gerenciar ambientes de teste isolados. Se você prefere configuração controlada por Python em vez de TOML ou precisa de fluxos de automação complexos, o Nox é uma excelente opção.
For more information about Nox, see the official Nox documentation or the Scientific Python guide to testing.
Por que usar Nox?#
O Nox é uma ótima ferramenta de automação porque:
É baseado em Python, o que facilita o uso se você já conhece a linguagem
Cria ambientes isolados para executar fluxos de trabalho
É compatível com automações complexas e personalizadas, além dos testes padrão
É flexível e poderoso para cenários elaborados de build e teste
O nox simplifica a criação e o gerenciamento de ambientes de teste. Com o nox, você pode configurar ambientes virtuais e executar testes em diferentes versões do Python usando o gerenciador de ambientes de sua preferência com um único comando.
Configure o Nox#
Para começar a usar o Nox, crie um arquivo noxfile.py na raiz do diretório do projeto. Depois, defina comandos usando funções Python.
Nota
Instalações do Nox
Quando você instala e usa o Nox para executar testes em diferentes versões do Python, ele cria e gerencia ambientes venv individuais para cada versão do Python especificada na função do Nox. Cada ambiente é gerenciado separadamente.
O Nox também pode ser usado em outras tarefas de desenvolvimento, como construir a documentação, criar a distribuição do pacote e testar instalações tanto em ambientes relacionados ao PyPI (por exemplo, venv e virtualenv) quanto no conda (por exemplo, conda-forge).
Ambientes de teste#
Por padrão, o nox usa o gerenciador de ambientes venv, integrado ao Python. Um ambiente virtual (venv) é um ambiente Python autocontido que permite isolar e gerenciar as dependências de diferentes projetos Python. Ele ajuda a garantir que bibliotecas e pacotes específicos de cada projeto não interfiram uns nos outros, promovendo um ambiente de desenvolvimento limpo e organizado.
Nox com ambientes venv#
A seguir, veja um exemplo de configuração do Nox para executar testes usando venv, o gerenciador de ambientes integrado à instalação básica do Python.
Observe que o exemplo a seguir pressupõe que você configurou o pyproject.toml para declarar as dependências de teste usando project.optional-dependencies:
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "pyosPackage"
version = "0.1.0"
dependencies = [
"geopandas",
"xarray",
]
[project.optional-dependencies]
tests = ["pytest", "pytest-cov"]
Com essa configuração, você pode usar session.install(".[tests]") para instalar suas dependências de teste. Observe que, a seguir, uma única sessão do Nox permite executar seus testes em 4 ambientes Python diferentes (Python 3.9, 3.10, 3.11 e 3.12).
Nota
Para executar essa configuração, você precisará ter python3.9, python3.10, python3.11 e python3.12 instalados no computador. Caso contrário, o nox pulará a execução dos testes nas versões que estiverem ausentes.
# This code would live in a noxfile.py file located at the root of your
# project directory
import nox
@nox.session(python=["3.9", "3.10", "3.11", "3.12"])
def test(session):
# Install dependencies
session.install(".[tests]")
# Run tests
session.run("pytest")
Acima, você cria uma sessão do Nox na forma de uma função com o decorador @nox.session. Observe que, no decorador, você declara as versões do Python que deseja executar.
Para executar o exemplo acima, use o comando a seguir e especifique a sessão com --session (às vezes abreviado como -s). A função acima se chama test; portanto, o nome da sessão é test:
nox --session test
Nox com conda / mamba#
A seguir, veja um exemplo de configuração do Nox para usar mamba (ou conda) como gerenciador de ambientes. Ao contrário do venv, o conda pode instalar automaticamente as várias versões do Python necessárias. Se você usar conda/mamba, não precisará instalar as quatro versões do Python, como ocorre com o venv.
Nota
Para o conda funcionar com o nox, verifique se o conda ou o mamba está instalado no seu computador.
# This code should live in your noxfile.py file
import nox
# The syntax below allows you to use mamba / conda as your environment
# manager. If you use this approach, you don't have to worry about installing
# different versions of Python
@nox.session(venv_backend='mamba', python=["3.9", "3.10", "3.11", "3.12"])
def test_mamba(session):
"""Nox function that installs dev requirements and runs tests on Python
3.9 through 3.12.
"""
# Install dev requirements
session.conda_install(".[tests]")
# Run tests using any parameters that you need
session.run("pytest")
Para executar a sessão acima, use:
nox --session test_mamba
Hatch vs Nox#
Se estiver tentando escolher entre o Hatch e o Nox, consulte a comparação e as recomendações na página principal sobre testes.
Em resumo#
Escolha o Hatch se você já o usa para empacotamento e quer manter tudo em um só lugar
Escolha o Nox se você precisa de máxima flexibilidade, prefere uma configuração controlada por Python ou precisa de fluxos de automação complexos
Próximos passos#
Agora que você sabe executar testes localmente com o Nox, pode aprender a executar testes automaticamente com integração contínua ou a executar testes com Hatch.