📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Módulo 11: Qualidade e Testes de Software. Recomendado revisar antes de começar.

🧪 Suíte Completa de Testes Automatizados & TDD

v1.0 — Test-Driven Development (TDD), JUnit 5, Mockito, AssertJ e Cobertura JaCoCo

Trilha de Especialização Pedagógica — Projeto 1 de 4

🎓 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.


🎯 Objetivo & Escopo do Projeto

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.


🧑‍💼 Fase 1 — Levantamento de Requisitos

O Briefing do Cliente (Gerente de Qualidade & QA Lead)

“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.”

Requisitos Funcionais (RF) e Não-Funcionais (RNF)

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

📋 Fase 2 — Backlog & User Stories

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

🌿 Fase 3 — Engenharia em Equipe (Ciclo TDD no Terminal)

# 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

🛠️ Fase 4 — Implementação Guiada do Teste TDD (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"));
}


🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd testes_01_suite_tdd_jacoco

2. Execute a aplicação ou testes

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

🧭 Decisões de Arquitetura (ADRs)


🧪 Testes de Validação & Relatório JaCoCo



🏛️ Arquitetura Visual & Engenharia de Software

O fluxo arquitetural abaixo detalha as camadas de interface, regras de negócio e homologação automatizada na subpasta test-junit/:

Arquitetura da Aplicação

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

🎯 Engenharia de Requisitos & Modelagem Formal

👤 User Stories (Histórias de Usuário)

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

⚙️ Requisitos Funcionais (RF)

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

🛡️ Requisitos Não-Funcionais (RNF)

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

🔗 Matriz de Rastreabilidade (RTM)

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

🏁 Checkpoints de Qualidade & Homologação

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 ✅