Nossa Stack Tecnológica & Processo de Testes

O projeto Testando com Spring é uma recriação profunda, moderna e pedagógica em língua portuguesa do aclamado curso Test With Spring (© Koodikupla Oy). O objetivo fundamental desta iniciativa é libertar o desenvolvedor de práticas e ferramentas defasadas (como Java 8 legados, Spock com Groovy não tipado, Selenium flutuante e bancos em memória H2 artificiais), apresentando o estado da arte do ecossistema JVM moderno.

Nesta página detalhamos tanto a stack das aplicações sob teste ensinada ao longo das 158 aulas, quanto o nosso próprio processo de testes automatizados empregado para garantir a integridade absoluta desta plataforma.


1. Nossa Stack Tecnológica

Todo o código, arquitetura e convenções abordados no curso utilizam estritamente versões de ponta e recursos contemporâneos:

Componente Tecnologia & Versão Por que escolhemos?
Linguagem Kotlin 2.4+ Código conciso, nulo-seguro por padrão (null safety), expressividade funcional, argumentos nomeados e suporte nativo a coroutines.
Framework Base Spring Boot 4.1+ & Spring 7 A fundação mais avançada do Spring, suporte nativo ao GraalVM AOT, Jakarta EE, @ServiceConnection e DSLs fluentes para MockMvc e RestClient.
Build & Dependências Gradle 9.8+ (Kotlin DSL) Gerenciamento de compilação de alta performance, suites de teste isoladas via jvm-test-suite, e compartilhamento modular de fixtures com java-test-fixtures.
Motor de Testes JUnit Jupiter 6.0+ Modelo moderno de extensões via @ExtendWith, ciclo de vida limpo sem dependência de regras legadas (@Rule), e testes parametrizados poderosos.
BDD & Especificação Kotest 6.2+ Especificações idiomáticas em Kotlin com múltiplos estilos (DescribeSpec, BehaviorSpec), asserções fluentes integradas e runners de alta velocidade.
Test Doubles MockK 1.14+ A biblioteca de mocking de primeira classe para Kotlin. Suporte total a suspend functions, funções top-level, classes seladas, singletons object e captura com slot().
Asserções Fluentes AssertJ 3.27+ Asserções ricas e encadeadas, com mensagens de erro diagnósticas cristalinas e agrupamento não-abortivo com assertSoftly.
Infraestrutura Real Testcontainers 2.0+ PostgreSQL e serviços reais rodando via Docker, integrados via @ServiceConnection ou inicializadores dinâmicos, sepultando de vez as inconsistências de SQL do H2.
Serviços Externos WireMock & Spring Cloud Contract Simulação confiável de dependências HTTP externas e testes de contrato orientados ao consumidor (CDC) para microsserviços.
End-to-End (E2E) Playwright 1.50+ Automação web ultrarrápida com navegadores reais (Chromium, Firefox, WebKit), auto-espera inteligente e eliminação completa de testes instáveis (flaky tests).

2. A Pirâmide e Filosofia de Testes Ensinada

Ao longo das lições, seguimos uma disciplina pragmática de engenharia de software:

flowchart TD E2E["Testes End-to-End (E2E)
Playwright + Testcontainers
Validação do fluxo real de ponta a ponta"] IT["Testes de Integração
Spring Boot + PostgreSQL Real (@ServiceConnection)
Persistência, Repositórios, Segurança e Controllers"] UT["Testes Unitários Rápidos
JUnit Jupiter / Kotest + MockK + AssertJ
Lógica de domínio, regras isoladas e execução em milissegundos"] E2E --> IT IT --> UT

Princípios Norteadores:

  1. Confiança Real: Não usamos bancos de dados em memória (como H2 ou HSQLDB) para validar queries PostgreSQL; testamos sempre contra o PostgreSQL real via Testcontainers.
  2. Isolamento e Determinismo: Cada teste gerencia explicitamente suas fixtures ou reseta suas sequências e tabelas, garantindo que a ordem de execução nunca altere o resultado.
  3. DSL Limpa & Idiomática: O código de teste deve servir como a documentação executável mais legível e agradável do sistema.

3. Nosso Processo de Testes Desta Plataforma

Não apenas ensinamos testes: praticamos testes rigorosos no desenvolvimento contínuo deste próprio site.

Para garantir que nenhuma das 158 lições, links de navegação cruzada, tópicos ou componentes sofram regressões, operamos com um pipeline automatizado de testes em camadas:

flowchart LR A["Hugo Server Isolado
(Porta dedicada)"] --> B["Playwright Crawler E2E
(Chromium Headless)"] B --> C["Descoberta Dinâmica no DOM
(Map: URL ➔ Status)"] C --> D["Navegação Recursiva
(100% dos Links Visitados)"] D --> E["Validação de Integridade
(Zero 404 / 500)"]

O Crawler E2E com Playwright (scripts/validar_site_playwright.py)

Em vez de apenas testar requisições HTTP cegas, nosso motor de testes utiliza o Playwright com Chromium real:

  1. Servidor Efêmero e Isolado: O script inicializa uma instância do Hugo em porta privada (13134) com ambiente idêntico ao de produção.
  2. Estrutura de Grafo com Mapa de Links:
    • Um mapa em memória (Dict[str, bool]) armazena todas as URLs do site.
    • Conforme o navegador carrega cada página, ele analisa o DOM e extrai dinamicamente todos os seletores de âncora a[href].
    • Links inéditos entram no mapa como pendentes (False).
  3. Navegação Real e Resolução de Aliases:
    • O navegador clica e carrega cada página, processando scripts de navegação, breadcrumbs e redirecionamentos canônicos de compatibilidade (<meta http-equiv="refresh">).
    • Após a validação com sucesso (HTTP 200 OK), a URL é marcada como visitada (True).
  4. Verificação de Exaustão: O teste só é concluído quando 100% dos links descobertos forem navegados com sucesso. Se um único link estiver quebrado ou inacessível, a suíte falha com diagnóstico detalhado.

Execução Local Rápida

Os testes podem ser executados por qualquer colaborador via Devbox e UV:

1
2
3
4
5
# Executa a suite completa com Playwright (Chromium headless):
devbox global run -- uv run --with playwright python3 scripts/validar_site_playwright.py

# Validação estática de sitemap:
python3 scripts/validar_site_hugo.py

[!TIP] Todo o processo de build e validação é executado antes de cada push e integrado ao pipeline do Cloudflare Pages, assegurando uma experiência sem falhas para os estudantes da comunidade.