Testes Unitários em Python com unittest e pytest

Se você está desenvolvendo projetos em Python, cedo ou tarde vai se deparar com a necessidade de testar seu código. Testes são fundamentais para garantir que suas funções e classes funcionem como esperado, evitando erros em produção e facilitando a manutenção.

Neste artigo, vamos explorar os testes unitários em Python, abordando tanto o módulo nativo unittest quanto a biblioteca popular pytest.


🔹 1. O que são testes unitários?

Testes unitários são scripts que verificam se pequenas partes do seu código (geralmente funções ou métodos) estão funcionando corretamente.

Exemplo prático:

  • Função para somar números → precisa ser testada com valores positivos, negativos, zero.

  • Função para dividir → precisa ser testada para divisão por zero.

Isso garante que, mesmo após alterações no código, a funcionalidade permaneça correta.


🔹 2. Criando um exemplo simples de função

Vamos criar um arquivo calculadora.py com algumas funções que usaremos nos testes:

# calculadora.py

def somar(a, b):
    return a + b

def subtrair(a, b):
    return a - b

def multiplicar(a, b):
    return a * b

def dividir(a, b):
    if b == 0:
        raise ValueError("Divisão por zero não é permitida")
    return a / b

🔹 3. Testando com unittest

O Python já vem com o módulo unittest integrado, inspirado no JUnit (Java).

Crie o arquivo test_calculadora_unittest.py:

import unittest
from calculadora import somar, subtrair, multiplicar, dividir

class TestCalculadora(unittest.TestCase):

    def test_somar(self):
        self.assertEqual(somar(2, 3), 5)
        self.assertEqual(somar(-1, 1), 0)

    def test_subtrair(self):
        self.assertEqual(subtrair(10, 5), 5)
        self.assertEqual(subtrair(0, 3), -3)

    def test_multiplicar(self):
        self.assertEqual(multiplicar(4, 5), 20)
        self.assertEqual(multiplicar(0, 5), 0)

    def test_dividir(self):
        self.assertEqual(dividir(10, 2), 5)
        with self.assertRaises(ValueError):  # espera erro
            dividir(10, 0)

if __name__ == "__main__":
    unittest.main()

Executando os testes:

No terminal, rode:

python -m unittest test_calculadora_unittest.py

Saída esperada:

....
----------------------------------------------------------------------
Ran 4 tests in 0.001s

OK

✅ Quatro testes rodaram sem falhas.


🔹 4. Testando com pytest

pytest é uma biblioteca mais moderna e simples de usar que o unittest.

Instalação:

pip install pytest

Crie o arquivo test_calculadora_pytest.py:

import pytest
from calculadora import somar, subtrair, multiplicar, dividir

def test_somar():
    assert somar(2, 3) == 5
    assert somar(-1, 1) == 0

def test_subtrair():
    assert subtrair(10, 5) == 5
    assert subtrair(0, 3) == -3

def test_multiplicar():
    assert multiplicar(4, 5) == 20
    assert multiplicar(0, 5) == 0

def test_dividir():
    assert dividir(10, 2) == 5
    with pytest.raises(ValueError):
        dividir(10, 0)

Executando os testes:

pytest -v

Saída esperada:

============================= test session starts =============================
collected 4 items

test_calculadora_pytest.py::test_somar PASSED                            [ 25%]
test_calculadora_pytest.py::test_subtrair PASSED                         [ 50%]
test_calculadora_pytest.py::test_multiplicar PASSED                      [ 75%]
test_calculadora_pytest.py::test_dividir PASSED                          [100%]

🔹 5. Diferenças entre unittest e pytest

Recursounittest (nativo)pytest (externo)
InstalaçãoJá vem com Pythonpip install pytest
SintaxeVerbosa (classes, métodos)Simples (funções, asserts)
Parametrização de testesMais complexaFácil com @pytest.mark.parametrize
Integração com pluginsLimitadaMuitos plugins disponíveis

👉 Resumindo:

  • unittest é útil se você quer zero dependências externas.

  • pytest é mais prático, poderoso e usado no mercado.


🔹 6. Testes Parametrizados com pytest

Uma das vantagens do pytest é a facilidade em testar múltiplos cenários:

import pytest
from calculadora import somar

@pytest.mark.parametrize("a, b, esperado", [
    (2, 3, 5),
    (10, -5, 5),
    (0, 0, 0)
])
def test_somar_parametrizado(a, b, esperado):
    assert somar(a, b) == esperado

Aqui, três cenários diferentes são testados automaticamente.


🔹 7. Boas práticas em testes unitários

✔️ Nomeie arquivos de teste como test_nomearquivo.py.
✔️ Use nomes descritivos para funções de teste.
✔️ Cada teste deve ser independente.
✔️ Escreva testes para casos comuns e casos de erro.
✔️ Execute os testes frequentemente durante o desenvolvimento.


🔹 8. Conclusão

Os testes unitários em Python são fundamentais para garantir que seu código funcione corretamente e se mantenha estável com o tempo.

  • Com unittest, você tem uma solução robusta já embutida no Python.

  • Com pytest, você ganha simplicidade, legibilidade e recursos extras.

👉 Minha sugestão: comece com pytest, pois ele é amplamente adotado no mercado e torna os testes mais fáceis de escrever e manter.

Comentários

Postagens mais visitadas deste blog

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Python para Computação Quântica: Introdução com Qiskit

Manipulação de Arquivos no C#: Como Ler, Escrever e Trabalhar com Arquivos de Forma Simples