Módulo 5: Qualidade e
Testes
Tipagem, Documentação e Assertividade
CA DE R N O PR ÁTI CO DE ESTU D OS ( PY TH O N 3 )
1. Type Hints (Tipagem de
Confiabilidade)
Mesmo que as fundações do Python o descrevam como dinâmico
(onde variáveis e retornos podem flutuar), os modernos Type Hints
(dicas) permitem formalizar visualmente os tipos exigidos para
inputs e o que vai ser devolvido. Editores com auto-complete os
adoram e linters detectam ameaças.
def calcular_media_ponderada(pesos: list[float]) -> float:
# A clareza desta assinatura previne desastres
return sum(pesos) / len(pesos)
2. Estruturas Avançadas de Tipos
A impressionante biblioteca interna 'typing' fornece recursos
flexíveis para assinaturas que transcendem dados simples.
Envolvimentos lógicos como Optional (indicador para quando a
função perfeitamente aceita que lhe injetem algo ou um vazio
None) e Callable.
from typing import Optional, Any
def caçar_usuario_sistema(codigo_id: int) -> Optional[dict]:
# Avisamos expressamente: Se não for achado no db, é None
pass
3. Os Contratos Docstrings (PEP
257)
A comunidade entende que função não documentada é terreno
nebuloso para qualquer engenheiro que vá inspecionar depois. A
Docstring deve ser o farol. Ela detalha em uma multi-string,
aninhada logo após a assinatura inicial, absolutamente tudo que diz
respeito ao que é, e ao que se pede.
def subtracao_precisa(minuendo, subtraendo):
'''
Realiza o cálculo síncrono de diferença.
Args:
minuendo: Base inteira principal.
subtraendo: Desconto a ser aplicado.
Returns:
O saldo algébrico limpo.
'''
return minuendo - subtraendo
4. A Filosofia SOLID em Funções
(Clean Code)
A lendária letra 'S' do manifesto designa o formidável Princípio da
Responsabilidade Única. A instrução determina: um trecho ou
função de código jamais deve fazer e responsabilizar-se por duas
coisas não atreladas ao mesmo tempo, senão a testabilidade é
corroída brutalmente.
# Padrão Tóxico: checar_pagamento_e_despachar_emails_e_logs()
# Padrão Vencedor e Seguro: isolar checar_pagamento(), após sucess
5. O Guardião Assert e a Inspeção
Rápida
O nativo comando 'assert' é a faca de detecção da linguagem
Python projetada em prol da validação incisiva e crua. Ele sentencia
que, se uma determinada asserção não se sagrar True, as sirenes
devem soar através de uma destrutiva AssertionError abortando os
trabalhos.
def garantir_existencia(nome_alvo):
return nome_alvo is not None
assert garantir_existencia('Caio') == True, 'O valor é perfeitamen
assert garantir_existencia(None) == False, 'Retorno nulo deveria b
6. Desbravando o Domínio Pytest
Liderança suprema absoluta dentro do ecossistema de validação
Python moderno, o Pytest age buscando arquivos nomeados
magicamente como 'test_*.py', caçando exaustivamente funções
encabeçadas como 'test_'. O executor orquestra e audita todos os
assertions, reportando brilhantemente o percentual validado.
def test_calculador_estatico():
dados_fixos_ambientais = [2.0, 4.0, 6.0]
# O sistema interno de hook do Pytest interceptará a verificaç
assert operacao_media(dados_fixos_ambientais) == 4.0
Laboratório Prático 1
Desafio - Refatoração com Type Hints: Capture a velha e
desprotegida função `def emitir_aviso(remetente): return
f'Aviso originado por {remetente}'` injetando nela todos os
indispensáveis type hints de assinatura. Assuma a entrada e
a saída invariavelmente restritas aos domínios das Strings.
Gabarito Recomendado
def emitir_aviso(remetente: str) -> str:
return f'Aviso originado solidamente por {remetente}'
Por que funciona? Engessamos o parâmetro formal usando
o sinal de dois pontos, e definimos a trilha de retorno
cravando o sinal clássico de seta que aponta para o tipo
prometido.
Laboratório Prático 2
Desafio - Moldando a Documentação (Google Style):
Materialize e aninhe uma docstring completíssima, seguindo a
diretriz moderna, que descreva abertamente as premissas de
uma função concebida para checar estritamente uma
propriedade CSS de visibilidade no front-end.
Gabarito Recomendado
def checar_status_visual(id_seletor: str) -> bool:
'''Analisa o DOM e extrai visibilidade frontal ativa.
Args:
id_seletor (str): Referência absoluta do alvo mapeado n
Returns:
bool: True se confirmadamente visual, False se mascarad
'''
pass
Por que funciona? O escopo da docstring consolida em
tópicos segregados (Args e Returns) a especificação do
manual prático com legibilidade humana formidável e fácil
parser.
Laboratório Prático 3
Desafio - Cercando Comportamentos de Risco e
Exceções: Tire do papel a elaboração da função perigosa de
dividir(numerador, divisor). Escale-a para emitir explosão via
'raise ValueError' em situações de denominação que
configure um inaceitável divisor zerado. Construa um bloco try
exterior auditando esse alerta com um assert cirúrgico.
Gabarito Recomendado
def processo_de_divisao(a, b):
if b == 0: raise ValueError('Catástrofe: divisão anulada e
return a / b
try:
processo_de_divisao(55, 0)
except ValueError as pacote_erro:
assert str(pacote_erro) == 'Catástrofe: divisão anulada e e
Por que funciona? É dever imperativo isolar fluxos
arriscados, avaliá-los e provar sob ambiente de laboratório
try/catch que a malha defensiva de exceções disparou
corretamente.
Laboratório Prático 4
Desafio - Higienização Pura e Exclusão de Side-Effects:
Anule o perigo compartilhado visível na refatoração requerida
da peça: `def adicionar_contagem(): global saldo_x; saldo_x
+= 1` blindando-a definitivamente sob os paradigmas
blindados da programação estrita em funções isoladas sem
nenhum contato colateral global.
Gabarito Recomendado
def adicionar_contagem_isolada(saldo_recebido_x: int) -> int:
return saldo_recebido_x + 1
# Gerenciamento isolado do ciclo
saldo_x_seguro = adicionar_contagem_isolada(saldo_x_seguro)
Por que funciona? O vício fatal de efeitos colaterais
espalhados foi expurgado, repassando o controle direto via
retorno seguro estrito. Permite simulações atômicas de
testes.
Laboratório Prático 5
Desafio - Iniciação a Arquitetura Pytest: Formule um
minucioso caso arquitetado na nomenclatura
'test_checar_validador_status()' integralmente desenhado
com o propósito rigoroso de estressar intensamente a função
`is_ok(status_requisicao)` gerada a princípio no laboratório do
Módulo 1.
Gabarito Recomendado
def test_checar_validador_status():
# Trilogia Pytest: Arranjo de cenário, Ação, Asserção impla
assert is_ok(200) is True
assert is_ok(404) is False
assert is_ok(500) is False
Por que funciona? Delegando o poder ao interpretador e
hooks mágicos da ferramenta pytest, construímos a pirâmide
basilar garantindo o pilar sólido da qualidade das features
sem ruídos e com total rastreabilidade do processo.