Introdução
O teste de unidade é uma parte essencial da construção de software robusto e sustentável. Ao escrever testes para unidades individuais de código, você garante que suas funções se comportem conforme o esperado e pode detectar bugs no início do processo de desenvolvimento. Neste guia, apresentaremos o pytest, uma poderosa estrutura de testes para Python, e demonstraremos como escrever testes, adotar práticas de desenvolvimento orientado a testes (TDD) e incorporar exemplos reais ao seu fluxo de trabalho.
Por que testes unitários e TDD?
Os testes ajudam a detectar erros antecipadamente e dão a você a confiança necessária para refatorar o código sem quebrar a funcionalidade. O desenvolvimento orientado por testes (TDD) vai além, escrevendo testes antes do próprio código, orientando seu design e garantindo uma base de código robusta.
Introdução ao pytest
Instalando o pytest
Para começar, instale o pytest usando o pip:
pip install pytest
Escrevendo seu primeiro teste
Vamos criar uma função simples e escrever um teste para ela. Suponha que temos uma função add
:
def add(a, b):
return a + b
Agora, crie um teste para essa função:
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
Para executar o teste, execute pytest
no seu terminal.
Desenvolvimento orientado a testes (TDD) com pytest
O TDD envolve escrever testes antes de escrever o código. Aqui está um fluxo de trabalho simples:
- Escreva um teste que defina o comportamento desejado de uma função.
- Execute o teste para ver se ele falha.
- Escreva o código mínimo necessário para passar no teste.
- Refactorize o código, se necessário, e repita.
Exemplo: fluxo de trabalho TDD
Suponha que precisamos de uma função multiply
que multiplica dois números. Começamos escrevendo um teste:
def test_multiply():
assert multiply(3, 4) == 12
assert multiply(-2, 5) == -10
Execute o pytest e você verá que o teste falhou porque multiply
não está definido. Agora, implemente a função:
def multiply(a, b):
return a * b
Execute o pytest novamente para garantir que o teste seja aprovado.
Recursos avançados do pytest
Testes parametrizados
O pytest permite que você execute uma função de teste com diferentes conjuntos de entradas usando o decorador @pytest.mark.parametrize
.
#| label: parameterized-tests, code-fold: true
import pytest
@pytest.mark.parametrize("a,b,expected", [
2, 3, 6),
(5, 5, 25),
(-1, 8, -8),
(
])def test_multiply_param(a, b, expected):
assert multiply(a, b) == expected
Fixtures no pytest
Os fixtures em pytest
permitem que você configure dados ou estados antes de executar testes e limpar depois.
import pytest
@pytest.fixture
def sample_data():
return [1, 2, 3, 4, 5]
def test_sum(sample_data):
assert sum(sample_data) == 15
Melhores práticas para testes unitários
- Escreva testes para cada função:
Certifique-se de que cada unidade do seu código tenha testes correspondentes. - Mantenha os testes independentes:
Os testes não devem depender uns dos outros; cada teste deve configurar seu próprio contexto. - Use nomes descritivos para os testes:
Nomeie claramente suas funções de teste para que as falhas sejam fáceis de diagnosticar. - Aproveite os fixtures e a parametrização:
Use esses recursos para escrever testes mais limpos e eficientes. - Executar testes com frequência:
Integre testes ao seu processo de desenvolvimento para detectar problemas antecipadamente.
Conclusão
Ao adotar o pytest e as práticas de TDD, você pode construir um conjunto de testes robusto que melhora a qualidade e a confiabilidade do código. Este guia apresentou os fundamentos da escrita de testes, criação de fixtures, parametrização de testes e seguimento de fluxos de trabalho TDD em Python. Com essas ferramentas, você estará mais bem equipado para manter e dimensionar seus projetos.
Leitura adicional
- Automação em Python: agendamento e automação de tarefas
- Criação de APIs REST com FastAPI: uma estrutura Python moderna
Bons testes e divirta-se criando aplicativos Python confiáveis com o pytest!
Explore mais artigos
Aqui estão mais artigos da mesma categoria para ajudá-lo a se aprofundar no tópico.
Reuso
Citação
@online{kassambara2024,
author = {Kassambara, Alboukadel},
title = {Teste de unidade em Python com pytest: um guia completo},
date = {2024-02-08},
url = {https://www.datanovia.com/pt/learn/programming/python/tools/pytest-unit-testing.html},
langid = {pt}
}