Submódulo 2: Depuração prática: estratégias, ferramentas e técnicas
Site: | Lumina |
Curso: | Python para Iniciantes: Lógica e Programação |
Livro: | Submódulo 2: Depuração prática: estratégias, ferramentas e técnicas |
Impresso por: | Usuário visitante |
Data: | quarta-feira, 17 set. 2025, 21:06 |
Descrição
Este submódulo apresenta um checklist prático para identificar, reproduzir e resolver problemas com rapidez. Você aprenderá a reproduzir falhas de forma reprodutível, isolar a seção do código responsável, usar instrumentação simples (prints e logging) antes de recorrer a depuradores como o pdb, interpretar mensagens de erro e stack traces, e aplicar técnicas de depuração aliadas a testes básicos para evitar regressões. Ao final, você terá diretrizes claras para documentar hipóteses, evidências e melhorias, facilitando futuras evoluções do código e a comunicação com equipes de desenvolvimento e transformação de carreira.
Visão geral da depuração ágil
Visão geral da depuração ágil
Vamos tratar a depuração como um hábito de engenharia de software que aumenta a confiabilidade do código. Assim como revisamos um fluxo de produção para entender onde algo pode estar inadequado, a depuração envolve entender o problema antes de corrigi-lo. (1) O PDB, o depurador do Python, é uma ferramenta poderosa para inspecionar o estado do código durante a execução. (2) Além disso, registrar informações com o logging ajuda a rastrear o que aconteceu sem interromper a execução. (3) Mensagens de erro e stack traces fornecem pistas valiosas para chegar à raiz do problema. Pense na depuração como uma investigação: começamos pela evidência, testamos hipóteses e registramos cada passo para não perder o rumo. > Vamos ver como isso se traduz em práticas reais. Imagine que você está migrando de um projeto de dados para desenvolvimento de uma API simples. Primeiro, você precisa entender onde o problema ocorre, não apenas qual é o erro, e isso requer reproduzir a falha com dados controlados. (4) Em equipes que seguem DevOps, a depuração frequente de failures em ambientes de integração contínua reduz o tempo entre detectar e corrigir um problema. (5) A prática constante de depuração também alimenta o seu portfólio, pois você mostra não apenas o código funcionando, mas o raciocínio de diagnóstico por trás dele.
Checklist prático de depuração
Checklist prático de depuração
Neste slide, vamos aplicar um fluxo simples para tornar a depuração mais rápida e confiável. Lembra que a ideia é reproduzir, isolar e confirmar hipóteses? (1) Primeiro, tente reproduzir o problema com dados mínimos e controlados, removendo ruídos da entrada. (2) Em seguida, isole a seção de código suspeita: com reduções graduais, você pode determinar onde a falha ocorre. (3) Use instrumentação de forma não intrusiva: prints para observação rápida ou logger para registrar eventos de forma persistente (sem interromper o fluxo). (4) Se a falha exigir inspeção detalhada, utilize o depurador interactivo como o pdb para percorrer o código linha a linha. (5) Crie casos de teste mínimos que reprovariam a falha para validar que a correção não gere regressões (3). (6) Registre as hipóteses, resultados esperados e evidências de depuração para facilitar futuras alterações.
# Exemplo: redução de dados para reproduzir uma falha
def acessa(arr, idx):
return arr[idx]
arr = [1,2,3]
print(acessa(arr, 5)) # IndexError
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>
🎯 Exercícios
🎯 Exercícios: Depuração prática: estratégias, ferramentas e técnicas
Teste seus conhecimentos com estas questões de múltipla escolha. Cada questão tem apenas uma resposta correta.
Ao depurar, qual é o objetivo principal?
Para tornar a falha reproduzível de forma confiável, qual prática é recomendada?
Em termos de instrumentação, qual afirmação é correta para depurar de forma eficaz?
Como as stack traces e mensagens de erro auxiliam na localização do problema?
Qual prática facilita a documentação e a prevenção de regressões durante a depuração?