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 01/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.

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 Python Avançado, onde temas como programação assíncrona, tipagem estática, empacotamento de projetos e padrões mais sofisticados entram em cena. Não prometemos data de lançamento; a trilha cresce com cuidado, um degrau bem construído de cada vez. Por ora, comemore: você saiu do básico de verdade, construiu um programa completo e o cobriu com testes. Essa é uma base sólida para tudo que vier depois, na trilha ou nos seus próprios projetos.

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?
O Avançado é o próximo degrau planejado da trilha, com temas como assincronismo, tipagem estática e empacotamento. Não temos data para anunciar. Enquanto isso, aprofunde os desafios sugeridos e construa projetos próprios; é o que mais consolida o intermediário.
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.