📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Módulo 11: Qualidade e Testes de Software. Recomendado revisar antes de começar.
v1.0 — Test-Driven Development (TDD), JUnit 5, Mockito, AssertJ e Cobertura JaCoCo
Trilha de Especialização Pedagógica — Projeto 1 de 4
- ➡️ v1 (este): TDD · JUnit 5 · Mockito · AssertJ · Cobertura JaCoCo (90%+)
- v2: Testes de Integração com Bancos Reais via Testcontainers
- v3: Testes de Carga, Estresse e Soak Testing com k6
- v4: Testes de Mutação com Pitest & Testes de Contrato Pact
🎓 Nível Profissional Simulado: QA Engineer / Desenvolvedor Backend Júnior. Desenvolvedores de elite não testam software clicando na tela: eles escrevem testes automatizados antes mesmo de escrever o código de produção (TDD). Aqui você aprende o ciclo Red ➔ Green ➔ Refactor, uso de mocks e análise de cobertura de código com JaCoCo.
Construir uma suíte profissional de Testes Unitários Automatizados com TDD para um motor de cálculo de juros e descontos comerciais, utilizando JUnit 5, dublês de teste com Mockito, asserções fluentes com AssertJ e validação de cobertura de código de 95% via JaCoCo.
“Nosso motor de cálculo financeiro calcula juros de mora e descontos por pontualidade. Tivemos um prejuízo de R$ 80.000 mês passado porque alguém alterou uma regra de desconto e ninguém percebeu. Exigimos uma suíte TDD completa: testes unitários cobrindo todos os cenários de borda (valores negativos, parcelas zeradas, datas inválidas), mocks para o serviço de cotação de câmbio e relatório JaCoCo com no mínimo 90% de cobertura de código.”
| ID | Tipo | Descrição | Origem no Briefing |
|---|---|---|---|
| RF01 | Funcional | Calcular juros simples e compostos para pagamentos em atraso. | “juros de mora” |
| RF02 | Funcional | Aplicar desconto progressivo por antecipação de parcelas. | “descontos por pontualidade” |
| RF03 | Funcional | Lançar exceções customizadas para entradas inválidas (valores zerados ou negativos). | “cenários de borda” |
| RNF01 | Não-Funcional | Cobertura mínima de 90% de linhas e ramos aferida pelo plugin JaCoCo. | “relatório JaCoCo 90%” |
| RNF02 | Não-Funcional | Execução determinística e isolada em sub-segundos via JUnit 5. | Automação de CI |
| ID | User Story | Prioridade |
|---|---|---|
| US01 | Como analista financeiro, quero ter a garantia de que o cálculo de juros segue rigorosamente a fórmula contábil. | Alta |
| US02 | Como time de engenharia, quero que o build quebre no Maven se a cobertura cair abaixo de 90%. | Alta |
# 1. Criar branch da feature
git checkout -b feature/US01-tdd-calculo-juros
# 2. Executar suíte de testes unitários com relatório de cobertura
mvn clean test jacoco:report
src/test/.../CalculadoraFinanceiraTest.java)@Test
@DisplayName("Deve calcular juros de mora de 2% corretamente em pagamentos atrasados")
void deveCalcularJurosDeMoraCorretamente() {
// Arrange (Dado)
CalculadoraFinanceira calc = new CalculadoraFinanceira();
BigDecimal valorOriginal = new BigDecimal("1000.00");
// Act (Quando)
BigDecimal totalComJuros = calc.aplicarJuros(valorOriginal, 5); // 5 dias atraso
// Assert (Entao)
assertThat(totalComJuros).isEqualByComparingTo(new BigDecimal("1020.00"));
}
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd testes_01_suite_tdd_jacoco
./mvnw test
# ou k6 run load_test.js
[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd catalogo_projetos/testes_01_suite_tdd_jacoco`
O fluxo arquitetural abaixo detalha as camadas de interface, regras de negócio e homologação automatizada na subpasta test-junit/:
flowchart TD
subgraph Apresentacao["Camada de Interface & UI"]
V1["Componentes Gráficos / Test Cases"] --> V2["Event Dispatcher / FXML"]
end
subgraph Controlador["Camada de Controle & Lógica"]
C1["Action Listeners / Controllers"] --> C2["Máquina de Estados & Regras"]
end
subgraph Dominio["Camada de Domínio & Modelo"]
M1["Entidades de Negócio"] --> M2["Persistência & Recursos"]
end
subgraph Homologacao["Qualidade & Homologação"]
Q1["Testes Automatizados"] --> Q2["Checkpoints CP-01..05 PASS"]
end
Apresentacao --> Controlador
Controlador --> Dominio
Dominio --> Homologacao
style Apresentacao fill:#e3f2fd,stroke:#1976d2,stroke-width:1.5px
style Controlador fill:#fffde7,stroke:#fbc02d,stroke-width:1.5px
style Dominio fill:#e8f5e9,stroke:#388e3c,stroke-width:1.5px
style Homologacao fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1.5px
| ID | Persona | História de Usuário | Critério de Aceite | Prioridade |
|---|---|---|---|---|
| US-01 | Desenvolvedor TDD | Desejo praticar o ciclo Red-Green-Refactor construindo regras a partir de testes | Testes JUnit 5 criados antes da implementação real de classes de negócio | Alta |
| US-02 | Engenheiro de Qualidade | Desejo testes parametrizados (@ParameterizedTest) com @CsvSource | Testes em massa validando dezenas de cenários com um único método de teste | Alta |
| US-03 | Tech Lead | Desejo relatório de cobertura de código com JaCoCo exigindo mínimo de 90% | Build Maven falhando automaticamente se a cobertura de linhas/ramos for inferior | Alta |
| US-04 | Auditor de Software | Desejo testes de exceções com assertThrows e testes agrupados com assertAll | Asserções atômicas e claras relatando todas as inconsistências de uma vez | Média |
| US-05 | Operador de CI | Desejo geração de relatórios HTML de cobertura anexáveis ao GitHub Actions | Exportação do relatório target/site/jacoco para inspeção visual em esteira | Média |
| ID | Descrição do Requisito | Criticidade |
|---|---|---|
| RF-01 | Suíte JUnit 5 cobrindo cenários de sucesso, erro e borda com asserções modernas | Alta |
| RF-02 | Testes parametrizados para validação de fórmulas matemáticas e regras fiscais | Alta |
| RF-03 | Configuração do plugin jacoco-maven-plugin com regras de check estritas | Alta |
| RF-04 | Uso de fixtures de ciclo de vida (@BeforeEach, @AfterEach, @DisplayName) | Média |
| RF-05 | Estrutura do projeto Maven com compilação e teste automatizados | Média |
| ID | Especificação Arquitetural | Criticidade |
|---|---|---|
| RNF-01 | Tempo de execução da suíte completa de testes inferior a 2 segundos | Alta |
| RNF-02 | Garantia formal de cobertura de código superior a 90% em branches e linhas | Alta |
| RNF-03 | Zero acoplamento entre testes (testes 100% independentes e determinísticos) | Alta |
| RNF-04 | Conformidade com padrões oficiais JUnit 5 Jupiter e Maven Surefire | Média |
| RNF-05 | Isolamento dos fontes na pasta test-junit/ | Alta |
| User Story | Requisito Funcional | Requisito Não-Funcional | Módulo / Artefato de Código | Status de Homologação |
|---|---|---|---|---|
| US-01 | RF-01 |
RNF-01, RNF-03 |
test-junit/src/test/ |
Testado |
| US-02 | RF-02 |
RNF-01, RNF-04 |
test-junit/src/test/ |
Testado |
| US-03 | RF-03 |
RNF-02, RNF-04 |
test-junit/pom.xml |
Testado |
| US-04 | RF-01 |
RNF-01, RNF-03 |
test-junit/CalculadoraTest.java |
Testado |
| US-05 | RF-05 |
RNF-02, RNF-05 |
test-junit/pom.xml |
Testado |
| Checkpoint | Escopo da Validação | Artefato Verificado | Status |
|---|---|---|---|
| CP-01 | Estrutura de Diretórios & Dependências | test-junit/ |
PASS ✅ |
| CP-02 | Modelagem de Domínio & Entidades | Domain Models |
PASS ✅ |
| CP-03 | Interface de Usuário & Eventos | View / Controller |
PASS ✅ |
| CP-04 | Recursos, Áudio & Estilização | Assets & Configs |
PASS ✅ |
| CP-05 | Homologação com Suíte de Testes | Test Suite |
PASS ✅ |