Módulo 16 - Projeto final: agenda de contatos
Testando a agenda e próximos passos
12 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 02/07/2026
O que você vai aprender
- Escrever testes com unittest para os métodos da Agenda.
- Testar o caminho de erro com assertRaises.
- Rever quais temas do curso o projeto exercitou.
- Conhecer o exame, o certificado e o próximo passo da trilha.
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: Testando a agenda e próximos passos.
Os objetivos desta aula. Escrever testes com unittest para os métodos da Agenda. Testar o caminho de erro com assertRaises. Rever quais temas do curso o projeto exercitou. Conhecer o exame, o certificado e o próximo passo da trilha.
Veja o essencial, parte por parte.
Escrevendo os testes. Os testes ficam em um arquivo separado, ao lado de agenda.py.
O que o projeto exercitou. Vale olhar para trás.
Exame, certificado e o próximo nível. Faça a mini-prova deste módulo para fechar o conteúdo do projeto.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Escrevendo os testes
Você usou a agenda à mão e ela pareceu funcionar. Testes automatizados transformam esse pareceu em tem certeza, e continuam valendo toda vez que você mexer no código. Crie um arquivo chamado teste_agenda.py na mesma pasta do agenda.py. Nele, você importa as classes do programa e escreve uma classe de teste que herda de unittest.TestCase. O método setUp roda antes de cada teste e monta um cenário limpo: uma agenda nova com um contato conhecido. Assim, cada teste parte do mesmo ponto, sem depender da ordem em que rodam.
import unittest
from agenda import Agenda, Contato, ContatoNaoEncontradoError
class TesteAgenda(unittest.TestCase):
def setUp(self):
self.agenda = Agenda()
self.agenda.adicionar_contato(
Contato("Ana Souza", "11999998888", "ana@exemplo.com")
)
def test_adicionar_aumenta_a_lista(self):
self.assertEqual(len(self.agenda.listar()), 1)
def test_buscar_ignora_maiusculas(self):
contato = self.agenda.buscar_por_nome("ana")
self.assertEqual(contato.telefone, "11999998888")
def test_buscar_inexistente_levanta_erro(self):
with self.assertRaises(ContatoNaoEncontradoError):
self.agenda.buscar_por_nome("Bruno")
def test_remover_tira_da_lista(self):
self.agenda.remover("Ana Souza")
self.assertEqual(len(self.agenda.listar()), 0)
if __name__ == "__main__":
unittest.main()Quatro testes cobrem adicionar, buscar, o erro de busca e remover.
Leia o que cada teste garante. O primeiro confirma que adicionar aumentou a lista para um. O segundo verifica que a busca ignora maiúsculas, encontrando Ana Souza ao procurar por ana, e confere o telefone do resultado. O terceiro é o mais interessante: com self.assertRaises, ele afirma que buscar um nome inexistente levanta ContatoNaoEncontradoError. Testar o caminho de erro é tão importante quanto testar o sucesso, porque é fácil quebrar o tratamento de erro sem perceber. O quarto confirma que remover esvaziou a lista. Rode com python teste_agenda.py e veja os pontos verdes.
O que o projeto exercitou
Vale olhar para trás. A agenda, modesta como é, tocou em quase tudo que o curso ensinou. Ela modelou dados com classes e deu comportamento a eles com métodos, o coração da orientação a objetos. Filtrou contatos com uma compreensão de lista. Criou uma exceção própria e a tratou no lugar certo. Validou entrada com uma expressão regular. Gravou e leu arquivos em JSON, com serialização e um construtor alternativo. Exportou para CSV. E, por fim, ganhou testes automatizados. Cada um desses temas tinha um módulo; aqui eles trabalharam juntos.
No começo do curso
- Scripts curtos que rodam uma vez
- Dados em variáveis soltas
- Erros que derrubam o programa
- Testar olhando a tela
Agora, no projeto final
- Programa com estado que persiste
- Dados modelados em classes
- Erros tratados de propósito
- Testes automatizados que se repetem
Esse é o retrato do salto intermediário anunciado na primeira aula do curso. Você não aprendeu uma linguagem nova; pegou a base do Básico e aprendeu a organizá-la em código legível, reaproveitável e confiável. A agenda é a prova concreta disso para você mesmo. Guarde o arquivo agenda.py: ele é um bom ponto de partida para outros projetos e um lembrete de que você consegue construir um programa completo, do zero ao teste.
Exame, certificado e o próximo nível
Antes de fechar, alguns desafios para levar a agenda adiante por conta própria, cada um exercitando o que você aprendeu: impedir contatos com o mesmo nome, usando buscar_por_nome antes de adicionar; acrescentar uma opção de editar contato ao menu; validar o e-mail; tratar o caso de um JSON corrompido na carga; ou ordenar a listagem por nome. Nenhum deles exige nada novo, só recombinar as peças. Tentar por conta é o melhor jeito de fixar o que o curso deu.
Concluído o intermediário, o caminho natural da trilha é o Curso de Python Avançado, que já está no ar no portal, gratuito como este. Lá entram em cena tipagem estática, decoradores avançados, geradores, concorrência, assincronismo, testes com pytest e empacotamento, fechando a trilha Python com o projeto de uma biblioteca de utilidades tipada e testada. Ele começa com uma revisão relâmpago deste curso, então dá para emendar hoje. E comemore: você saiu do básico de verdade, construiu um programa completo e o cobriu com testes. Essa é uma base sólida para o último degrau.
Curso de Python AvançadoO último degrau da trilha Python: tipagem, decoradores, concorrência, assincronismo, testes e empacotamento, com o projeto da biblioteca de utilidades. Começa revisando o intermediário para você retomar o ritmo.Teste rápido
Por que o teste usa assertRaises ao buscar um contato inexistente?
Perguntas frequentes
- Por que os testes ficam em um arquivo separado?
- Para manter o programa e os testes independentes. O teste_agenda.py importa as classes de agenda.py e as verifica sem misturar código de teste no programa. O if __name__ do agenda.py garante que o menu não dispare quando os testes importam o arquivo.
- O que o setUp faz de diferente de um teste comum?
- O setUp roda automaticamente antes de cada método de teste, preparando um cenário limpo. Assim, todos os testes começam com a mesma agenda conhecida, sem depender uns dos outros. Se um teste altera a agenda, o próximo recebe uma nova, intacta.
- Preciso testar cada método da agenda?
- O ideal é cobrir os comportamentos importantes, incluindo os caminhos de erro. Não é preciso um teste por linha, mas os métodos centrais e as exceções merecem testes. Salvar e carregar arquivos também podem ser testados usando arquivos temporários, um bom exercício extra.
- Como rodo os testes?
- Execute python teste_agenda.py no terminal, na pasta do projeto. O unittest encontra os métodos test_ e roda todos, mostrando um ponto por sucesso e detalhes por falha. Também dá para rodar com python -m unittest, que descobre os testes automaticamente.
- O curso continua no Python Avançado agora?
- Sim. O Curso de Python Avançado já está no ar em valorfinal.com.br/cursos/python-avancado, gratuito, e fecha a trilha com tipagem estática, concorrência, assincronismo, testes e empacotamento. Ele abre com uma revisão relâmpago do intermediário, então o melhor momento para emendar é agora, com o conteúdo fresco.
- Preciso do certificado para provar que aprendi?
- O certificado registra sua conclusão e é um bom reforço, mas o aprendizado de verdade está em conseguir construir a agenda e resolver os desafios sozinho. Use o certificado como marco e os projetos próprios como a prova prática do que você domina.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.