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

🧪 Testes de Integração com Bancos Reais via Testcontainers

v1.0 — Engenharia de Software & Práticas Profissionais

Trilha de Especialização Pedagógica


🎯 Objetivo & Escopo do Projeto

Suíte de testes de integração automatizados em Java/Spring Boot utilizando Testcontainers para instanciar contêineres reais de PostgreSQL e Redis de forma efêmera e isolada em tempo de execução de teste.


🛠️ Código de Exemplo da Implementação

package com.portal.testes;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

import static org.junit.jupiter.api.Assertions.assertTrue;

@SpringBootTest
@Testcontainers
class UsuarioIntegrationTest {

    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
            .withDatabaseName("testdb")
            .withUsername("testuser")
            .withPassword("testpass");

    @Test
    void deveConectarAoPostgresRealNoContainer() {
        assertTrue(postgres.isRunning(), "O contêiner PostgreSQL efêmero do Testcontainers deve estar ativo");
    }
}


🚀 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_02_testcontainers_integration

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_02_testcontainers_integration


🏛️ 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-containers/:

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 Engenheiro Backend Desejo testar consultas com PostgreSQL real em vez de banco H2 em memória Testcontainers subindo contêiner Docker temporário idêntico ao de produção Alta
US-02 DBA de Aplicação Desejo validar migrações Flyway e constraints reais de PostgreSQL nos testes Execução de migrations reais durante a inicialização do contêiner de teste Alta
US-03 Arquiteto de Integração Desejo reuso de contêiner com @Container e Singleton pattern para velocidade Compartilhamento do contêiner entre múltiplas classes de teste reduzindo tempo Alta
US-04 Engenheiro DevOps Desejo descarte automático do contêiner ao fim da execução (Ryuk) Garantia de que nenhum contêiner órfão consuma recursos da máquina após os testes Média
US-05 Auditor de Integração Desejo testes cobrindo transações complexas, bloqueios e triggers reais Suíte de testes validando integridade transacional ACID com banco Docker Média

⚙️ Requisitos Funcionais (RF)

ID Descrição do Requisito Criticidade
RF-01 Integração JUnit 5 com Testcontainers PostgreSQLContainer oficial Alta
RF-02 Configuração dinâmica de propriedades de conexão (DynamicPropertySource) Alta
RF-03 Execução de scripts DDL e migrações reais no início da suíte Alta
RF-04 Mapeamento e repositórios testados contra banco relacional autêntico Média
RF-05 Módulo de testes automatizados com cobertura de queries nativas Média

🛡️ Requisitos Não-Funcionais (RNF)

ID Especificação Arquitetural Criticidade
RNF-01 Ambiente de teste 100% compatível e fidedigno ao ambiente de produção Alta
RNF-02 Isolamento total de portas evitando conflito com instâncias locais Alta
RNF-03 Descarte garantido de contêineres e volumes temporários Alta
RNF-04 Compatibilidade com Docker Desktop, Rancher Desktop e Podman Média
RNF-05 Organização dos fontes na pasta test-containers/ 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-02 test-containers/src/test/ Testado
US-02 RF-03 RNF-01, RNF-04 test-containers/src/test/ Testado
US-03 RF-02 RNF-01, RNF-03 test-containers/src/test/ Testado
US-04 RF-01 RNF-03, RNF-04 test-containers/src/test/ Testado
US-05 RF-05 RNF-01, RNF-05 test-containers/src/test/ Testado

🏁 Checkpoints de Qualidade & Homologação

Checkpoint Escopo da Validação Artefato Verificado Status
CP-01 Estrutura de Diretórios & Dependências test-containers/ 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 ✅