DEV Community

Cover image for "[PT-BR] Testes Unitários Eficientes no Django"-Torne a saída mais legível usando o plugin pytest-sugar
Luanna
Luanna

Posted on

"[PT-BR] Testes Unitários Eficientes no Django"-Torne a saída mais legível usando o plugin pytest-sugar

1️⃣ Introdução
O que são testes unitários e por que são importantes?
Testes unitários são testes automatizados que verificam se pequenas partes do código (funções, classes ou métodos) funcionam corretamente de forma isolada. Eles são essenciais porque ajudam a:
◦ Identificar erros rapidamente durante o desenvolvimento.
◦ Garantir que mudanças no código não quebrem funcionalidades existentes.
◦ Melhorar a qualidade e a manutenção do código.

Django já vem com suporte nativo para testes
O Django possui um framework de testes embutido baseado no módulo unittest do Python. Isso permite que os desenvolvedores escrevam e executem testes facilmente, garantindo que suas aplicações funcionem corretamente. Para rodar os testes, basta usar o comando:
python manage.py test

Isso facilita a detecção de erros e a manutenção do código no desenvolvimento de aplicações Django. 🚀

“Os testes unitários garantem que cada parte do código funcione corretamente. Em Django, podemos usar o módulo unittest para escrever testes eficientes e evitar erros inesperados no código.”

2️⃣ Conceitos Básicos
✅ O que é um teste unitário?**
Um teste unitário é um tipo de teste automatizado que verifica o funcionamento de uma unidade específica do código, como uma função, um método ou uma classe. O objetivo é garantir que cada parte do código funcione de forma isolada, sem depender de outras partes do sistema.

✅ Diferença entre testes unitários e testes de integração

Image description

✅ O que é o unittest e como usá-lo no Django?
O unittest é um framework de testes padrão do Python usado para escrever testes automatizados. O Django já vem com suporte embutido para unittest, permitindo que você escreva e execute testes de forma simples.

Como usá-lo no Django?
• Criar um arquivo de teste no app, normalmente chamado tests.py.

• Importar unittest e TestCase do Django:

Image description

• Executar os testes com o comando:

python manage.py test

Isso verifica se a funcionalidade do código está correta e evita erros inesperados no desenvolvimento. 🚀

QUIZ! Por que se fala em Automação na Execução dos Testes ?
Os testes são executados automaticamente por meio do comando python manage.py test ou pytest, sem intervenção manual. Essa execução automática garante que, a cada mudança no código, os testes sejam rodados e o comportamento do sistema seja verificado.

3️⃣ Testando a Views

• Como testar uma View.
Utilize o Django Test Client para simular requisições HTTP (GET/POST) à view e verifique se a resposta está de acordo com o comportamento esperado (status code, redirecionamento, template renderizado, contexto, mensagens, etc.).
• Exemplo prático:

Image description

Nesse exemplo, o teste simula um acesso à view sem autenticação e verifica se o usuário é redirecionado para a página de login, conforme esperado.

4️⃣ Dicas Extras

1. Para acompanhar as saídas dos testes:
Para acompanhar mais detalhes da execução dos testes pelo prompt, você pode aumentar o nível de verbosidade ao rodar o comando do Django. Isso é feito utilizando a flag --verbosity (ou sua forma abreviada -v).
Por exemplo, se você quiser uma saída mais detalhada, execute:
python manage.py test funcionarios --verbosity=2
ou
python manage.py test funcionarios -v2

Os níveis de verbosidade funcionam da seguinte forma:

  • 0: saída mínima (quiet).
  • 1: saída padrão.
  • 2: saída detalhada (mostra quais testes estão sendo executados e mais informações).
  • 3: saída muito detalhada.

Assim, ajustando o nível de verbosidade você poderá ver mais informações sobre a execução dos testes, quais testes foram executados e outras mensagens de debug que você eventualmente adicionar.

2.Configurando o Logging para Mensagens de Debug
Em vez de usar apenas print(), é recomendável utilizar o módulo logging do Python. Assim, você pode configurar o nível de log para DEBUG e garantir que as mensagens sejam exibidas no console durante a execução dos testes.
No início do seu arquivo de teste (ou num arquivo de configuração específico para testes), adicione:

import logging
logging.basicConfig(level=logging.DEBUG)

Em seguida, insira chamadas ao método logging.debug() nos pontos do código ou dos testes onde deseja obter informações de depuração. Por exemplo:

Image description

5️⃣ Usando o plugin pytest-sugar
Para configurar seu projeto Django para utilizar o pytest com o plugin pytest-sugar (que fornece uma barra de progresso e uma saída de relatório mais bonita), você pode seguir estes passos:

1.Instale as dependências
No ambiente virtual do seu projeto, instale os pacotes necessários:
pip install pytest pytest-django pytest-sugar

Esses pacotes permitem rodar os testes do Django usando o pytest e melhoram a exibição dos resultados com o pytest-sugar.

2. Configure o arquivo pytest.ini
Na raiz do seu projeto (onde está localizado o arquivo manage.py), crie um arquivo chamado pytest.ini com o seguinte conteúdo:
[pytest]
DJANGO_SETTINGS_MODULE = seu_projeto.settings
python_files = tests.py test_*.py *_tests.py

Observação: Substitua seu_projeto pelo nome do seu diretório de configurações (geralmente o diretório que contém o settings.py).
Esse arquivo informa ao pytest onde estão as configurações do Django e quais arquivos devem ser considerados como testes.

3. Organize Seus Testes em Diretórios
Certifique-se de que seus testes estão organizados conforme o padrão, por exemplo:
meu_app/
├── models.py
├── views.py
└── tests/
├── init.py

└── test_views.py

O arquivo init.py vazio garante que a pasta tests seja tratada como um pacote e que o pytest possa encontrar os arquivos de teste.

4. Executando os Testes com Pytest
Com as dependências instaladas e o arquivo pytest.ini configurado, você pode executar os testes a partir da raiz do projeto usando o comando:
pytest

O pytest-sugar será carregado automaticamente (uma vez instalado) e você verá uma barra de progresso e um relatório mais detalhado e estilizado à medida que os testes forem executados.

Image description

Image description

Image description

5. Personalizando a Execução (Opcional)
Se desejar ajustar ainda mais a saída ou filtrar os testes, você pode utilizar opções adicionais do pytest, como:
• --maxfail=1: para interromper a execução ao encontrar o primeiro erro.

• --disable-warnings: para suprimir avisos. 
Enter fullscreen mode Exit fullscreen mode

Exemplo:
pytest --maxfail=1 --disable-warnings

Com esses passos, seu projeto Django estará configurado para utilizar o pytest com o plugin pytest-sugar, proporcionando uma execução de testes mais agradável e informativa.

Image description

6️⃣ Conclusão
Ao longo deste artigo, exploramos como escrever testes unitários eficientes em projetos Django, destacando a importância da automação na execução dos testes para garantir a qualidade e a manutenção do código.
Aprendemos a utilizar o Django Test Client para simular requisições, integrar ferramentas como Pytest e o plugin Pytest-Sugar para melhorar a visibilidade dos testes, além de configurar técnicas de debugging e logging para facilitar a identificação e correção de erros.

Essas práticas, combinadas com a organização estruturada do código e o uso de testes automatizados, demonstram como a implementação de testes pode tornar o desenvolvimento backend mais robusto, escalável e confiável.

"O que achou? Tem dúvidas? Comente aqui!".

"Se você gostou, compartilhe com quem está aprendendo Django!"

Contato:
E-mail
Linkedin
GitHub

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more