O que é pytest?
Pytest é uma das bibliotecas mais populares para testes em Python, projetada para facilitar a escrita de testes simples e escaláveis. Com uma sintaxe intuitiva e recursos poderosos, pytest permite que desenvolvedores e testadores criem testes unitários, funcionais e de integração de maneira eficiente. A biblioteca suporta uma ampla gama de plugins, o que a torna altamente extensível e adaptável às necessidades específicas de cada projeto. Além disso, pytest é compatível com outros frameworks de teste, como unittest e nose, permitindo a migração suave de projetos existentes.
Instalação do pytest
Para começar a usar pytest, a primeira etapa é instalá-lo em seu ambiente de desenvolvimento. A instalação pode ser realizada facilmente através do gerenciador de pacotes pip. Basta abrir o terminal e executar o comando `pip install pytest`. Após a instalação, você pode verificar se o pytest foi instalado corretamente executando `pytest –version`, que deve retornar a versão instalada. É recomendável criar um ambiente virtual para isolar as dependências do seu projeto, garantindo que as versões das bibliotecas não conflitem com outras aplicações.
Estrutura de um teste com pytest
Os testes em pytest são geralmente organizados em arquivos que começam ou terminam com “test”. Por exemplo, um arquivo de teste pode ser nomeado como `test_exemplo.py`. Dentro desse arquivo, você pode definir funções de teste que também devem começar com a palavra “test”. Essa convenção permite que o pytest identifique automaticamente quais funções são testes e as execute quando você rodar o comando `pytest` no terminal. A estrutura básica de um teste é simples: você define uma função, realiza uma operação e usa asserções para verificar se o resultado é o esperado.
Escrevendo seu primeiro teste
Para ilustrar como usar pytest no Python, vamos escrever um teste simples. Suponha que você tenha uma função chamada `soma(a, b)` que retorna a soma de dois números. Você pode criar um arquivo `test_soma.py` e incluir o seguinte código:
“`python
def soma(a, b):
return a + b
def test_soma():
assert soma(2, 3) == 5
assert soma(-1, 1) == 0
assert soma(0, 0) == 0
“`
Neste exemplo, a função `test_soma` contém três asserções que verificam se a função `soma` retorna os resultados corretos para diferentes entradas. Ao executar `pytest` no terminal, o pytest irá automaticamente detectar e executar o teste, informando se ele passou ou falhou.
Usando fixtures em pytest
As fixtures são uma das características mais poderosas do pytest, permitindo que você configure e limpe o estado antes e depois dos testes. Elas são úteis para preparar dados ou estados que serão reutilizados em vários testes. Para definir uma fixture, você utiliza o decorador `@pytest.fixture`. Por exemplo:
“`python
import pytest
@pytest.fixture
def dados():
return [1, 2, 3]
def test_soma_lista(dados):
assert soma(sum(dados), 3) == 9
“`
Neste caso, a fixture `dados` fornece uma lista que é usada no teste `test_soma_lista`. O pytest garante que a fixture seja executada antes do teste e que seu resultado seja passado como argumento para a função de teste.
Executando testes com pytest
Executar testes com pytest é um processo simples e direto. Após escrever seus testes, você pode rodá-los no terminal com o comando `pytest`. O pytest irá automaticamente descobrir todos os arquivos de teste e funções de teste, executando-os e exibindo um resumo dos resultados. Você pode também adicionar opções ao comando, como `-v` para um modo verboso que fornece mais detalhes sobre cada teste, ou `-k` para executar apenas testes que correspondam a um determinado nome.
Testes parametrizados em pytest
Os testes parametrizados permitem que você execute a mesma função de teste com diferentes conjuntos de dados, o que é extremamente útil para validar o comportamento de funções com várias entradas. Para isso, você pode usar o decorador `@pytest.mark.parametrize`. Veja um exemplo:
“`python
import pytest
@pytest.mark.parametrize(“a, b, esperado”, [
(1, 2, 3),
(2, 3, 5),
(0, 0, 0),
])
def test_soma_parametrizada(a, b, esperado):
assert soma(a, b) == esperado
“`
Neste exemplo, o teste `test_soma_parametrizada` será executado três vezes, uma para cada conjunto de parâmetros fornecido. Isso não só economiza tempo, mas também torna os testes mais organizados e fáceis de manter.
Integrando pytest com CI/CD
A integração do pytest em pipelines de CI/CD é uma prática recomendada que garante que seus testes sejam executados automaticamente sempre que houver alterações no código. Ferramentas como GitHub Actions, Travis CI e Jenkins podem ser configuradas para rodar pytest como parte do processo de build. Isso ajuda a identificar rapidamente falhas introduzidas por novas alterações, garantindo que o código mantenha sua qualidade e funcionalidade ao longo do tempo.
Depuração de testes com pytest
Quando um teste falha, é crucial entender o motivo da falha. O pytest fornece mensagens de erro detalhadas que ajudam na depuração. Você pode usar a opção `-s` para ver a saída de print statements durante a execução do teste, o que pode ser útil para rastrear o fluxo de execução e identificar problemas. Além disso, o pytest suporta o uso de ferramentas de depuração como o pdb, permitindo que você insira pontos de interrupção e examine o estado do programa durante a execução dos testes.