Módulo 16 - Projeto final: mini biblioteca de utilidades
Testes com pytest, empacotamento e encerramento
11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Escrever testes com pytest para os modelos e a lógica de preço.
- Testar o caminho feliz e os casos de erro com pytest.raises.
- Preparar o empacotamento da biblioteca no pyproject.toml.
- Fechar o curso com um balanço honesto, exame e certificado.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Testes com pytest, empacotamento e encerramento.
Os objetivos desta aula. Escrever testes com pytest para os modelos e a lógica de preço. Testar o caminho feliz e os casos de erro com pytest.raises. Preparar o empacotamento da biblioteca no pyproject.toml. Fechar o curso com um balanço honesto, exame e certificado.
Veja o essencial, parte por parte.
Testando a biblioteca com pytest. Testes com pytest provam que a biblioteca funciona como promete.
Empacotando a biblioteca. Modelos tipados com dataclass e Enum, validados no __post_init__.
O que você conquistou. Vale parar e olhar para trás com honestidade.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Testando a biblioteca com pytest
Uma biblioteca sem testes é uma promessa sem garantia. Com o pytest, que você viu no módulo 13, escrever testes é simples: funções que começam com test_ e usam o comando assert. Testamos duas frentes. A primeira é o caminho feliz: dado um produto válido e um desconto correto, o preço sai como esperado. A segunda, igualmente importante, é o caminho de erro: dado um percentual inválido, a função deve levantar a exceção certa. O pytest oferece o pytest.raises exatamente para isso, verificando que a exceção esperada aconteceu.
# tests/test_precos.py
from decimal import Decimal
import pytest
from catalogo import Produto, Categoria, preco_com_desconto
from catalogo.erros import PrecoInvalidoError
def test_desconto_valido():
cafe = Produto("Cafe", Decimal("20.00"), Categoria.BEBIDA)
assert preco_com_desconto(cafe, Decimal("10")) == Decimal("18.00")
def test_percentual_invalido_levanta_erro():
cafe = Produto("Cafe", Decimal("20.00"), Categoria.BEBIDA)
with pytest.raises(PrecoInvalidoError):
preco_com_desconto(cafe, Decimal("150"))
def test_produto_com_nome_vazio_e_rejeitado():
with pytest.raises(ValueError):
Produto("", Decimal("1.00"), Categoria.ALIMENTO)Testes com pytest: caminho feliz com assert e casos de erro com pytest.raises.
Repare que testar os erros é tão importante quanto testar os acertos. O test_percentual_invalido_levanta_erro prova que a biblioteca falha do jeito certo, com a exceção própria que projetamos, e não passa batido por um valor absurdo. E o test_produto_com_nome_vazio confirma que a validação do __post_init__ realmente rejeita um produto inválido. Juntos, esses testes documentam o comportamento esperado e travam regressões: se alguém mudar o código e quebrar uma dessas garantias, o pytest avisa na hora. É a rede de segurança que permite mexer no código sem medo.
Empacotando a biblioteca
Com a biblioteca escrita e testada, o passo final de engenharia é empacotá-la, para que outras pessoas possam instalá-la e importá-la. Aqui entra o pyproject.toml do módulo anterior, agora preenchido com os metadados do catalogo: nome, versão, descrição e a versão mínima de Python. Com esse arquivo e a estrutura src correta, uma ferramenta de build gera o pacote instalável. Você não precisa decorar os comandos; o que importa é entender que o pyproject.toml é o que transforma uma pasta de código num pacote que o mundo pode usar.
# pyproject.toml do projeto catalogo
[project]
name = "catalogo"
version = "0.1.0"
description = "Mini biblioteca de utilidades para catalogo de produtos"
readme = "README.md"
requires-python = ">=3.10"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
# Com isso, uma ferramenta de build gera o pacote instalavel a partir de src/.O pyproject.toml final: metadados do catalogo e o sistema de build que gera o pacote.
O que você conquistou
Vale parar e olhar para trás com honestidade. Ao terminar este curso, você não escreve mais só scripts que funcionam; você projeta software. Passou pela tipagem estática e pelas dataclasses, pela programação funcional, pelos decoradores e context managers, pelos geradores avançados, pela concorrência e pelo async, pela orientação a objetos com metaclasses e descritores, pelas exceções e logging, pelos testes com pytest, pela performance e pelo empacotamento. E fechou com um projeto que junta tudo numa biblioteca coesa, tipada e testada. Isso é base de engenharia de verdade, construída peça por peça.
Seja honesto também sobre o que vem a seguir. Este curso te deu uma base avançada sólida, não um ponto final. Programar é um ofício que se aprofunda com prática: projetos próprios, leitura de código de outras pessoas, contribuição a bibliotecas abertas, e o estudo contínuo de temas que cada área pede, como bancos de dados, web ou dados. Não existe curso que entregue emprego pronto, e desconfie de quem promete isso. O que existe é o degrau que você acabou de subir, real e seu, e a estrada aberta para continuar. O melhor programador que você vai conhecer é o que você será depois de muitos projetos.
Quando você começou
- Escrevia scripts que funcionavam
- Tratava o erro que aparecia
- Testava o caminho principal na mão
- Organizava o código como dava
Agora
- Projeta software com contratos tipados
- Desenha a hierarquia de erros de propósito
- Cobre acertos e falhas com pytest
- Estrutura pacotes com responsabilidades claras
Para fechar oficialmente, faça o exame final do curso, que sorteia questões de todos os módulos e mede se os conceitos ficaram. Ao ser aprovado, você recebe o certificado do ValorFinal, com carga horária e verificação, que registra o seu esforço. Ele não é um passe mágico, e sim o reconhecimento de um caminho concluído com seriedade. Guarde o pacote catalogo, expanda-o, adapte-o a outro domínio. Ele é a prova, para você mesmo, de que a mentalidade de engenharia agora é sua. Parabéns por chegar até aqui, e boa jornada no que vem depois.
Teste rápido
Por que testar também os casos de erro, e não só o caminho feliz?
Perguntas frequentes
- Como o pytest sabe quais funções são testes?
- Por convenção de nomes. O pytest procura arquivos que começam com test_ e, dentro deles, funções que também começam com test_. Cada uma é um teste, que passa se os assert derem certo e falha se algum falhar ou se uma exceção inesperada acontecer. É simples e sem cerimônia.
- Como testo que uma função levanta uma exceção?
- Com o pytest.raises, usado em um bloco with que envolve a chamada. O teste passa se a exceção esperada acontecer dentro do bloco e falha se ela não acontecer. É a forma correta de verificar que o código falha do jeito certo diante de entradas inválidas.
- Preciso publicar o pacote em algum repositório?
- Não para concluir o curso. Empacotar já demonstra o ciclo completo: com o pyproject.toml e a estrutura correta, o pacote pode ser gerado e instalado localmente. Publicar num índice público é um passo extra, opcional, que segue as mesmas ferramentas quando você quiser compartilhar a biblioteca.
- O certificado do curso garante um emprego?
- Não, e nenhum certificado sério promete isso. Ele reconhece que você concluiu o curso e passou no exame, o que é real e valioso. Conseguir uma vaga envolve prática, projetos próprios, portfólio e outras etapas. O certificado é uma peça honesta desse caminho, não um atalho para o fim dele.
- O que estudar depois deste curso?
- Depende da área que te atrai. Caminhos comuns são bancos de dados e SQL, desenvolvimento web com um framework, ou análise de dados. Em todos, o maior avanço vem da prática: construir projetos próprios, ler código de outras pessoas e resolver problemas reais. A base avançada que você tem agora sustenta qualquer um desses rumos.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.