Submódulo 2: Depuração prática: estratégias, ferramentas e técnicas
Instrumentação, testes e prevenção de regressões
Instrumentação, testes e prevenção de regressões
Nesta etapa, comparamos duas formas de observar o que acontece no código: prints simples e logging estruturado. Prints são úteis para experimentação rápida, mas podem poluir a saída e não ficam registrados ao longo do tempo (1). Já o logging oferece níveis (INFO, WARNING, ERROR), formatos consistentes e a possibilidade de direcionar logs para arquivos ou sistemas de monitoramento (2). Para evitar impactos de desempenho, configure handlers adequados e evite excesso de logs em produção (3). Em termos de qualidade de software, criar testes simples ajuda a evitar regressões: um pequeno conjunto de asserts pode confirmar que alterações não quebrem funcionalidades já existentes (4). Além disso, quando usamos depuração, tente manter o código de depuração mínimo para não ocultar falhas e remova ou reduza logs desnecessários após a correção (5). (3) O pdb continua sendo útil como recurso complementar para inspeção de estados específicos quando o logging não é suficiente. (4) Documente o raciocínio de depuração, incluindo hipóteses, evidências e decisões, para facilitar futuras evoluções do código.

import logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
def dividir(a,b):
logging.info("Entrando dividir com a=%s, b=%s", a, b)
return a / b
try:
dividir(10, 0)
except Exception as e:
logging.exception("Erro durante divisão: %s", e)
import unittest
def dividir(a,b):
return a/b
class TestDividir(unittest.TestCase):
def test_dividir_por_zero(self):
with self.assertRaises(ZeroDivisi>