Adicionando Testes Automatizados¶
Esta seção detalha a estratégia e a implementação de testes automatizados para o projeto, cobrindo testes unitários para as camadas de Domínio e Aplicação, e testes de integração para a camada de Apresentação (API).
1. Contexto e Justificativa¶
Testes automatizados são fundamentais para garantir a qualidade, robustez e a manutenibilidade de qualquer projeto de software, especialmente em um contexto open source. Eles permitem verificar o comportamento do sistema, detectar regressões precocemente e documentar a funcionalidade do código. Com a Arquitetura Limpa, a testabilidade é maximizada devido ao desacoplamento das camadas.
2. Estrutura de Testes¶
Os testes serão organizados no diretório project/core/tests/
, com subdiretórios para categorizá-los:
project/core/tests/unit/
: Para testes unitários que focam em componentes isolados (entidades, casos de uso).project/core/tests/integration/
: Para testes de integração que verificam a interação entre componentes (API com casos de uso e repositórios).
3. Ferramentas de Teste¶
Utilizaremos as seguintes bibliotecas para os testes:
pytest
: Um framework de teste robusto e flexível para Python.pytest-django
: Plugin parapytest
que facilita o teste de aplicações Django.pytest-mock
: Para criar mocks e simular dependências em testes unitários.rest_framework.test.APITestCase
: Para simular requisições HTTP e testar endpoints da API.
4. Testes Unitários (Camadas de Domínio e Aplicação)¶
Testes unitários focam na lógica de negócio das camadas de Domínio e Aplicação. Eles são rápidos, isolados e não dependem de banco de dados ou frameworks externos.
a. Entidades de Domínio (project/core/domain/entities/user.py
)¶
Nesta subseção, demonstramos como testar as entidades de domínio de forma isolada, garantindo que sua lógica interna funcione conforme o esperado. O exemplo abaixo mostra um teste básico para a criação de um usuário e a propriedade is_admin
da entidade User
.
b. Casos de Uso (project/core/domain/use_cases/user_use_cases.py
, project/core/domain/use_cases/generic_use_cases.py
)¶
Os testes de casos de uso focam em verificar a lógica de negócio principal, utilizando mocks para simular o comportamento dos repositórios e gateways, garantindo que o caso de uso reaja corretamente às entradas e interaja adequadamente com suas dependências.
Exemplo: CreateUserUseCase
¶
Exemplo: CreateEntityUseCase
(Genérico)¶
5. Testes de Integração (Camada de Apresentação - API)¶
Testes de integração verificam se as diferentes camadas do projeto (API, Casos de Uso, Repositórios, persistência) funcionam bem em conjunto. Eles simulam requisições HTTP para os endpoints da API.
a. Autenticação e Usuários (project/core/api/v1/views/auth.py
, project/core/api/v1/views/user.py
)¶
Os testes de integração verificam a funcionalidade completa da API, incluindo a interação com os casos de uso e as camadas de infraestrutura (como o banco de dados e o sistema de autenticação). Utilizamos rest_framework.test.APITestCase
para simular requisições HTTP e verificar as respostas.
Exemplo: Login de Usuário (Sucesso)¶
Exemplo: Listar Usuários (como Admin)¶
6. Passos da Implementação¶
A implementação dos testes automatizados seguiu os seguintes passos:
- Criação de Novo Arquivo de Documentação: O arquivo
docs/development/automated-testing.md
foi criado para descrever a estratégia de testes. - Atualização de
config/mkdocs.yml
: O novo arquivo de documentação foi adicionado à navegação do MkDocs. - Instalação de Dependências de Teste:
pytest
epytest-mock
foram adicionados aoproject/requirements.txt
e instalados.pytest-django
já estava presente. - Estrutura de Diretórios de Testes: Os diretórios
project/core/tests/unit/
eproject/core/tests/integration/
foram criados para organizar os testes. - Configuração do
config/pytest.ini
: Um arquivoconfig/pytest.ini
foi criado na raiz do projeto com configurações básicas para opytest
(ex:DJANGO_SETTINGS_MODULE
,python_files
,addopts
). - Implementação de Testes Unitários (Domínio): O arquivo
project/core/tests/unit/test_user_entity.py
foi criado com testes para a entidadeUser
. - Implementação de Testes Unitários (Aplicação): Os arquivos
project/core/tests/unit/test_user_use_cases.py
eproject/core/tests/unit/test_generic_use_cases.py
foram criados com testes para os casos de uso deUser
e casos de uso genéricos, respectivamente, utilizando mocks. - Implementação de Testes de Integração (API): Os arquivos
project/core/tests/integration/test_auth_api.py
eproject/core/tests/integration/test_user_api.py
foram criados com testes de integração para os endpoints da API de autenticação e gerenciamento de usuários, incluindo a obtenção e uso de tokens de acesso.
Com esses testes implementados, o projeto possui uma base robusta para garantir a qualidade do código e a funcionalidade da aplicação.