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.

graph TD; A[Identificar falha] --> B{Consegue reproduzir?}; B -->|Sim| C[Reproduzido]; B -->|Não| D[Coletar informações]; C --> E[Isolar código]; E --> F[Instrumentação com prints/logging]; F --> G[Pedir ajuda se necessário]

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.

Software testing
TestingCup – Polish Championship in Software Testing, Katowice, May 2016
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.

Questão 1

Ao depurar, qual é o objetivo principal?

Questão 2

Para tornar a falha reproduzível de forma confiável, qual prática é recomendada?

Questão 3

Em termos de instrumentação, qual afirmação é correta para depurar de forma eficaz?

Questão 4

Como as stack traces e mensagens de erro auxiliam na localização do problema?

Questão 5

Qual prática facilita a documentação e a prevenção de regressões durante a depuração?