Estrutura de projeto JAVA abrangendo implementação do clean architecture, features toggles e pirâmide de testes.
O projeto JAVA Clean têm como objetivo demonstrar como é simples trabalhar com toggles, clean architecture (não o by the book) e testes possibilitando o trunk based development.
A pirâmide de testes implementada nesse projeto têm como referência o documento Microservice Testing com algumas adaptações. Basicamente a implementação têm o seguinte princípio:
Unitário: Testa isoladamente as classes, o objetivo desse teste é validar se a regra da classe está funcionando corretamente sem precisar subir qualquer contexto de framework ou integrações.
Integração: Teste que valida a integração, necessita que simule um contexto externo para testar a regra da classe, por exemplo, bancos em memória e contextos de um framework.
Componente: Testa as regras de negócio da aplicação como um todo, mockando todas as depedências. Geralmente são testes que fazem um request e dado os mocks esperam por uma resposta específica.
Performance: Teste que valida a performance da aplicação como um todo, mockando todas as depedências. Se algo aumentar o tempo de resposta é uma camada que pegaria o problema, esse teste não têm como objetivo validar a performance da integração.
Segurança: Teste que vai verificar falhas de segurança que podem ser exploradas através do contrato da API. Em alguns casos pode até ser considerado um teste de contrato pois o contrato da API será validado de diversas formas nesse teste.
Os testes de E2E não se aplica a esse projeto, mais pra frente pretendemos colocar um exemplo de uma aplicação frontend integrando com o serviço, e todo o fluxo testado com o E2E. Esse projeto têm como objetivo mostrar os testes sendo executados de maneira isoladas em uma aplicação.
- Maven
- Spring Boot
- FF4j
- Swagger
- Feign
- JUnit 5, Factory Fixture, Hamcrest, Easy Random, Mockito e Spock (Testes unitários, possui exemplos utilizando JUnit e Spock, os testes duplicados são somente exemplos.)
- Gatling (Testes de performance)
- Cucumber, Easy Cucumber (Testes de componente)
- OWASP Zap (Testes de segurança)
- JDK 8
- Maven
- Docker
- Docker Compose 3
mvn clean verify -f app/pom.xml
mvn spring-boot:run -f app/pom.xml
Por padrão a aplicação sobe na porta 8080.
Swagger: http://localhost:8080/swagger-ui.html
Console FF4J: http://localhost:8080/ff4j-web-console/
mvn clean verify -f component-test/pom.xml
mvn clean verify -f performance-test/pom.xml
mvn clean verify -f security-test/pom.xml
Os testes são executados através do docker-compose, enquanto os testes estão rodando o docker é iniciado e ao término da execução o docker é desligado.
Reports
- Component test: target/cucumber-html-reports/overview-features.html
- Performance test: target/gatling/pokemonsimulation-*/index.html
- Security test: target/security-reports/*.html
- Ao alterar a versão do docker compose é necessário verificar se o plugin utilizado no pom.xml suporta.
- Toda vez que houver alguma alteração na aplicação é necessário compilar e realizar o build do docker compose novamente, pois assim o docker estará utilizando a versão atual da aplicação.
Esse projeto possui licença MIT license, veja LICENSE.md para mais detalhes.