<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Diego de Sousa Brandão</title>
    <description>The latest articles on DEV Community by Diego de Sousa Brandão (@diegobrandao).</description>
    <link>https://dev.to/diegobrandao</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F877145%2F70792ea6-0aa3-48b9-9ca2-e59d9d20a0b4.jpg</url>
      <title>DEV Community: Diego de Sousa Brandão</title>
      <link>https://dev.to/diegobrandao</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/diegobrandao"/>
    <language>en</language>
    <item>
      <title>Série: Claude Code CLI: guia técnico — Parte 3: remoto, limites e boas práticas</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:27:40 +0000</pubDate>
      <link>https://dev.to/diegobrandao/serie-claude-code-cli-guia-tecnico-parte-3-remoto-limites-e-boas-praticas-2659</link>
      <guid>https://dev.to/diegobrandao/serie-claude-code-cli-guia-tecnico-parte-3-remoto-limites-e-boas-praticas-2659</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Versão do conteúdo:&lt;/strong&gt; outubro de 2026&lt;br&gt;
&lt;strong&gt;Fontes:&lt;/strong&gt; exclusivamente a documentação oficial da Anthropic (&lt;a href="https://code.claude.com/docs" rel="noopener noreferrer"&gt;code.claude.com/docs&lt;/a&gt; e &lt;a href="https://support.claude.com" rel="noopener noreferrer"&gt;support.claude.com&lt;/a&gt;). A lista completa está em Fontes oficiais.&lt;br&gt;
&lt;strong&gt;Aviso:&lt;/strong&gt; o Claude Code é atualizado com frequência. Antes de usar este material como referência, confira as mudanças com &lt;code&gt;/release-notes&lt;/code&gt; e a &lt;a href="https://code.claude.com/docs/en/cli-reference" rel="noopener noreferrer"&gt;referência oficial do CLI&lt;/a&gt;. O &lt;code&gt;claude --help&lt;/code&gt; não lista todas as flags.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📑 Índice da série
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;🧠 O que é o Claude Code CLI (Parte 1)&lt;/li&gt;
&lt;li&gt;📦 Instalação e autenticação (Parte 1)&lt;/li&gt;
&lt;li&gt;🚪 Comandos de entrada (Parte 1)&lt;/li&gt;
&lt;li&gt;⌨️ Atalhos de teclado e prefixos (Parte 1)&lt;/li&gt;
&lt;li&gt;⚡ Slash commands essenciais (Parte 1)&lt;/li&gt;
&lt;li&gt;🔐 Modos de permissão (Parte 1)&lt;/li&gt;
&lt;li&gt;📄 Memória: CLAUDE.md e auto memory (Parte 1)&lt;/li&gt;
&lt;li&gt;⚖️ Configuração: settings.json (Parte 1)&lt;/li&gt;
&lt;li&gt;🪝 Hooks (Parte 2)&lt;/li&gt;
&lt;li&gt;👥 Subagents (Parte 2)&lt;/li&gt;
&lt;li&gt;🧩 Skills, comandos e plugins (Parte 2)&lt;/li&gt;
&lt;li&gt;🔌 MCP no terminal (Parte 2)&lt;/li&gt;
&lt;li&gt;⏪ Checkpoints e gestão de contexto (Parte 2)&lt;/li&gt;
&lt;li&gt;🤖 Modo não interativo (&lt;code&gt;-p&lt;/code&gt;) e CI (Parte 2)&lt;/li&gt;
&lt;li&gt;🔀 Sessões em paralelo (Parte 2)&lt;/li&gt;
&lt;li&gt;⏰ Automação agendada (Parte 2)&lt;/li&gt;
&lt;li&gt;📱 Trabalho remoto e entre dispositivos&lt;/li&gt;
&lt;li&gt;✅ O que só o CLI faz&lt;/li&gt;
&lt;li&gt;❌ O que o CLI não faz&lt;/li&gt;
&lt;li&gt;🤫 Recursos pouco conhecidos&lt;/li&gt;
&lt;li&gt;🏆 Fluxo de trabalho recomendado&lt;/li&gt;
&lt;li&gt;⚠️ Cuidados e limitações&lt;/li&gt;
&lt;li&gt;📚 Fontes oficiais&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a id="remoto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  17. 📱 Trabalho remoto e entre dispositivos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Remote Control: controlar a sessão local de outro aparelho
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--remote-control&lt;/span&gt;   &lt;span class="c"&gt;# ou --rc: sessão interativa com Remote Control ligado&lt;/span&gt;
claude remote-control     &lt;span class="c"&gt;# modo servidor&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Dentro de uma sessão: &lt;code&gt;/remote-control&lt;/code&gt; ou &lt;code&gt;/rc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A sessão continua rodando na sua máquina; você acompanha e responde pelo navegador ou pelo app mobile.&lt;/li&gt;
&lt;li&gt;Exige Pro, Max, Team ou Enterprise com login no claude.ai. Não funciona com API key nem com Bedrock, Agent Platform ou Foundry. Em Team e Enterprise, um Owner precisa habilitar.&lt;/li&gt;
&lt;li&gt;Para ligar em toda sessão: &lt;code&gt;/config&lt;/code&gt; → &lt;strong&gt;Enable Remote Control for all sessions&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sessões na nuvem (claude.ai/code)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--cloud&lt;/span&gt; &lt;span class="s2"&gt;"corrija o teste flaky em auth.spec.ts"&lt;/span&gt;  &lt;span class="c"&gt;# cria sessão na nuvem&lt;/span&gt;
claude &lt;span class="nt"&gt;--teleport&lt;/span&gt;                                       &lt;span class="c"&gt;# puxa uma sessão da nuvem para o terminal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--remote&lt;/code&gt; é um apelido antigo (deprecated) de &lt;code&gt;--cloud&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dentro da sessão, &lt;code&gt;/teleport&lt;/code&gt; (ou &lt;code&gt;/tp&lt;/code&gt;) também puxa uma sessão da nuvem.&lt;/li&gt;
&lt;li&gt;O teleport exige git limpo, o mesmo repositório, a branch publicada e a mesma conta do claude.ai.&lt;/li&gt;
&lt;li&gt;Sem remoto no GitHub, &lt;code&gt;--cloud&lt;/code&gt; envia um bundle do git (até 100 MB, sem arquivos não rastreados).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--teleport&lt;/code&gt; é diferente de &lt;code&gt;--resume&lt;/code&gt;: este último só lê o histórico local.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/autofix-pr&lt;/code&gt; cria uma sessão na nuvem que acompanha o PR atual e corrige falhas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Outros dispositivos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mobile:&lt;/strong&gt; app Claude para iOS e Android; sessões na nuvem e Remote Control aparecem na aba &lt;strong&gt;Code&lt;/strong&gt;. &lt;code&gt;/mobile&lt;/code&gt; mostra um QR code para baixar o app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop:&lt;/strong&gt; &lt;code&gt;claude --desktop&lt;/code&gt; abre o app desktop na pasta atual (macOS e Windows x64, v2.1.285+). Combine com &lt;code&gt;--continue&lt;/code&gt; ou &lt;code&gt;--resume &amp;lt;id&amp;gt;&lt;/code&gt; para levar a sessão.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack:&lt;/strong&gt; com Pro, Max, Team ou Enterprise, Claude Code on the web habilitado e GitHub conectado. Funciona em canais, não em DMs. Em Team e Enterprise, essa versão está sendo substituída pelo Claude Tag.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a id="so-cli"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  18. ✅ O que só o CLI faz
&lt;/h2&gt;

&lt;p&gt;Comparando com o app desktop, as IDEs, a web e o mobile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scripting e modo &lt;code&gt;-p&lt;/code&gt;:&lt;/strong&gt; o desktop é só interativo. Pipelines, &lt;code&gt;--output-format&lt;/code&gt; e CI dependem do CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent SDK:&lt;/strong&gt; a página de plataformas o classifica, junto com scripting, como recurso só do CLI. Os pacotes oficiais são em Python e TypeScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent teams:&lt;/strong&gt; disponíveis no CLI, não no desktop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--allowedTools&lt;/code&gt; / &lt;code&gt;--disallowedTools&lt;/code&gt; por sessão:&lt;/strong&gt; o desktop não tem equivalente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comandos de diálogo&lt;/strong&gt; como &lt;code&gt;/permissions&lt;/code&gt;: no desktop, respondem que não estão disponíveis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vim mode&lt;/strong&gt; (&lt;code&gt;/config&lt;/code&gt; → Editor mode, ou &lt;code&gt;"editorMode": "vim"&lt;/code&gt;) e &lt;code&gt;/terminal-setup&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mover trabalho entre terminal e nuvem:&lt;/strong&gt; &lt;code&gt;claude --cloud&lt;/code&gt; e &lt;code&gt;claude --teleport&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provedores terceiros&lt;/strong&gt; (Bedrock, Agent Platform, Foundry): suportados no CLI e nas IDEs que rodam o CLI. O desktop usa a API da Anthropic por padrão.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Subagents, hooks, skills, CLAUDE.md, plugins, MCP, checkpoints e sandbox &lt;strong&gt;não&lt;/strong&gt; são exclusivos do CLI: funcionam em todas as superfícies e provedores.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a id="cli-nao-faz"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  19. ❌ O que o CLI não faz
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Revisão visual de diff, preview do app e computer use:&lt;/strong&gt; recursos do app desktop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diffs inline no editor:&lt;/strong&gt; recurso das extensões de VS Code e JetBrains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rodar sem a sua máquina:&lt;/strong&gt; uma sessão do CLI depende do seu computador. Para continuar com tudo desligado, use sessões na nuvem (&lt;code&gt;--cloud&lt;/code&gt;) ou rotinas (&lt;code&gt;/schedule&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandbox no Windows nativo:&lt;/strong&gt; só no macOS, Linux e WSL 2.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandbox para tudo:&lt;/strong&gt; o sandbox cobre comandos de shell. Ferramentas de arquivo, servidores MCP e hooks rodam fora dele.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desfazer efeitos de Bash:&lt;/strong&gt; checkpoints não cobrem &lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, deploys ou chamadas de API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ferramentas no &lt;code&gt;/btw&lt;/code&gt;:&lt;/strong&gt; a pergunta paralela não usa ferramentas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast mode em Bedrock, Agent Platform ou Foundry:&lt;/strong&gt; não disponível.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recursos que exigem login no claude.ai (não funcionam com API key do Console nem provedores terceiros): sessões na nuvem, Claude Code no mobile, integração com Slack, app desktop, rotinas, &lt;code&gt;/ultrareview&lt;/code&gt;, Remote Control e computer use.&lt;/p&gt;




&lt;p&gt;&lt;a id="pouco-conhecidos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  20. 🤫 Recursos pouco conhecidos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Recurso&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/statusline &amp;lt;descrição&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gera um script de status line a partir de linguagem natural. Roda localmente, sem gastar tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/output-style&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Troca o estilo de resposta: Proactive, Concise, Explanatory, Learning ou estilos próprios em &lt;code&gt;.claude/output-styles/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/keybindings&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Abre &lt;code&gt;~/.claude/keybindings.json&lt;/code&gt; para remapear atalhos, sem reiniciar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/terminal-setup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Configura &lt;code&gt;Shift+Enter&lt;/code&gt; para quebra de linha (VS Code, Cursor, Alacritty, Zed e outros)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/sandbox&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Liga o sandbox de comandos de shell (Seatbelt no macOS; &lt;code&gt;bubblewrap&lt;/code&gt; e &lt;code&gt;socat&lt;/code&gt; no Linux/WSL 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--add-dir&lt;/code&gt; / &lt;code&gt;/add-dir&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Dá acesso a pastas fora do projeto (ex.: &lt;code&gt;claude --add-dir ../lib&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/copy [N]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copia a N-ésima resposta mais recente; &lt;code&gt;w&lt;/code&gt; no seletor grava em arquivo (útil por SSH)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/export [arquivo]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exporta a conversa como texto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude --from-pr 123&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Abre o seletor de sessões ligadas a um PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/insights&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gera um relatório HTML de uso em &lt;code&gt;~/.claude/usage-data/report.html&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/recap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Resume a sessão em uma linha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/goal &amp;lt;condição&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mantém o Claude trabalhando entre turnos até a condição ser atendida&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ultrathink&lt;/code&gt; no prompt&lt;/td&gt;
&lt;td&gt;Pede raciocínio mais profundo só naquele turno, sem mudar o &lt;code&gt;/effort&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--safe-mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inicia com todas as personalizações desligadas, para depurar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/powerup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lições interativas sobre recursos do Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/team-onboarding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gera um guia para o time a partir de 30 dias de uso&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mais detalhes úteis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sugestões de prompt:&lt;/strong&gt; &lt;code&gt;Tab&lt;/code&gt; ou &lt;code&gt;→&lt;/code&gt; aceita. Desligue com &lt;code&gt;promptSuggestionEnabled: false&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notificações:&lt;/strong&gt; por padrão só no Ghostty, Kitty e iTerm2. Nos outros terminais, use &lt;code&gt;"preferredNotifChannel": "terminal_bell"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Imagens:&lt;/strong&gt; cole com &lt;code&gt;Ctrl+V&lt;/code&gt; ou arraste para o prompt.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a id="fluxo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  21. 🏆 Fluxo de trabalho recomendado
&lt;/h2&gt;

&lt;p&gt;Baseado na página oficial de boas práticas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Explore, planeje, implemente, faça commit.&lt;/strong&gt; Entre no plan mode (&lt;code&gt;Shift+Tab&lt;/code&gt; ou &lt;code&gt;claude --permission-mode plan&lt;/code&gt;), deixe o Claude ler o código e propor um plano. Use &lt;code&gt;Ctrl+G&lt;/code&gt; para editar o plano no seu editor antes de implementar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pule o plano em mudanças pequenas.&lt;/strong&gt; Se dá para descrever o diff em uma frase, não precisa de plano.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dê ao Claude um jeito de verificar.&lt;/strong&gt; Testes, build, linter ou screenshot comparado ao design. Sem verificação, ele para quando o trabalho &lt;em&gt;parece&lt;/em&gt; pronto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faça a verificação decidir quando parar.&lt;/strong&gt; Use &lt;code&gt;/goal&lt;/code&gt; para uma condição da sessão, um hook &lt;code&gt;Stop&lt;/code&gt; para um portão determinístico, ou um subagent revisor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seja específico.&lt;/strong&gt; Diga o arquivo, o cenário, o padrão existente a seguir e como fica o "corrigido".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mantenha um CLAUDE.md enxuto.&lt;/strong&gt; Comece com &lt;code&gt;/init&lt;/code&gt;. Para cada linha, pergunte: "se eu tirar isso, o Claude erra?".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corrija cedo.&lt;/strong&gt; &lt;code&gt;Esc&lt;/code&gt; para no meio; &lt;code&gt;Esc&lt;/code&gt; &lt;code&gt;Esc&lt;/code&gt; ou &lt;code&gt;/rewind&lt;/code&gt; volta atrás. Depois de duas correções sem sucesso, rode &lt;code&gt;/clear&lt;/code&gt; e escreva um prompt melhor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;/clear&lt;/code&gt; entre tarefas sem relação&lt;/strong&gt; e subagents para investigações longas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entreviste antes de features grandes.&lt;/strong&gt; Peça ao Claude para te entrevistar, gere um &lt;code&gt;SPEC.md&lt;/code&gt; e implemente numa sessão nova.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escritor e revisor.&lt;/strong&gt; Uma sessão implementa, outra (com contexto limpo) revisa o diff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrações grandes:&lt;/strong&gt; &lt;code&gt;/batch&lt;/code&gt;, ou um loop de &lt;code&gt;claude -p&lt;/code&gt; com &lt;code&gt;--allowedTools&lt;/code&gt; e &lt;code&gt;--permission-mode dontAsk&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Padrões de falha a evitar:&lt;/strong&gt; sessão "pia de cozinha" (tudo misturado), correções em série, CLAUDE.md inchado, confiar sem verificar, investigação sem escopo.&lt;/p&gt;




&lt;p&gt;&lt;a id="cuidados"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  22. ⚠️ Cuidados e limitações
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Segurança
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No modo &lt;code&gt;default&lt;/code&gt;, o Claude só escreve na pasta inicial e nas subpastas, e pede confirmação antes de ler fora dela.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;curl&lt;/code&gt; e &lt;code&gt;wget&lt;/code&gt; não são aprovados automaticamente.&lt;/li&gt;
&lt;li&gt;A documentação admite que nenhum sistema é imune a todos os ataques. Prompt injection é um risco real, principalmente com conteúdo da web e servidores MCP.&lt;/li&gt;
&lt;li&gt;A Anthropic não audita servidores MCP. Configuração versionada no repositório é responsabilidade do time.&lt;/li&gt;
&lt;li&gt;No Windows, evite WebDAV e caminhos &lt;code&gt;\\*&lt;/code&gt;: eles podem contornar o sistema de permissões.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;bypassPermissions&lt;/code&gt; e auto mode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bypassPermissions&lt;/code&gt; &lt;strong&gt;não protege contra prompt injection&lt;/strong&gt; nem ações indesejadas. Use só em container ou VM isolada.&lt;/li&gt;
&lt;li&gt;No Linux e no macOS, a flag é recusada quando roda como root ou com sudo. Administradores podem bloqueá-la com &lt;code&gt;permissions.disableBypassPermissionsMode: "disable"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;O classificador do auto mode bloqueia ações irreversíveis, destrutivas ou fora do ambiente. Por padrão, confia só no diretório de trabalho e nos remotes configurados do repositório.&lt;/li&gt;
&lt;li&gt;Depois de 3 bloqueios seguidos ou 20 no total, o auto mode pausa e volta a pedir permissão.&lt;/li&gt;
&lt;li&gt;Redefinir listas como &lt;code&gt;soft_deny&lt;/code&gt; sem &lt;code&gt;"$defaults"&lt;/code&gt; remove as proteções internas, incluindo os bloqueios de force-push e de deploy em produção.&lt;/li&gt;
&lt;li&gt;Para limites rígidos, use &lt;code&gt;permissions.deny&lt;/code&gt;, não o classificador.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dev containers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Recomendados para isolamento, mas um container não impede que um projeto malicioso leia o que está dentro dele, inclusive as credenciais em &lt;code&gt;~/.claude&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Não monte segredos do host (como &lt;code&gt;~/.ssh&lt;/code&gt; ou credenciais de nuvem) e restrinja a saída de rede com allowlist.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  IDEs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No JetBrains em &lt;code&gt;acceptEdits&lt;/code&gt;, o Claude pode alterar arquivos de configuração que a IDE executa sozinha, contornando a confirmação de Bash.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dados
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Planos de consumidor (Free, Pro, Max): os dados podem ser usados para treino se a opção estiver ligada (retenção de 5 anos); com a opção desligada, retenção de 30 dias.&lt;/li&gt;
&lt;li&gt;Planos comerciais (Team, Enterprise, API): sem treino por padrão; retenção padrão de 30 dias. Zero Data Retention para contas qualificadas.&lt;/li&gt;
&lt;li&gt;As transcrições locais ficam em texto puro em &lt;code&gt;~/.claude/projects/&lt;/code&gt; por 30 dias (&lt;code&gt;cleanupPeriodDays&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/feedback&lt;/code&gt; envia a conversa inteira, incluindo código, e ela é guardada por 5 anos.&lt;/li&gt;
&lt;li&gt;Telemetria: desligue com &lt;code&gt;DISABLE_TELEMETRY&lt;/code&gt; ou &lt;code&gt;CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Custo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Média em empresas: cerca de US$ 13 por desenvolvedor por dia ativo e US$ 150 a 250 por mês; 90% dos usuários ficam abaixo de US$ 30 por dia ativo.&lt;/li&gt;
&lt;li&gt;O que encarece: contexto longo, perda de cache, tarefas agendadas e subagents. Agent teams consomem cerca de 7 vezes mais tokens que uma sessão comum quando os teammates rodam em plan mode.&lt;/li&gt;
&lt;li&gt;Para gastar menos: &lt;code&gt;/clear&lt;/code&gt; entre tarefas, &lt;code&gt;/compact&lt;/code&gt; com foco, CLAUDE.md abaixo de 200 linhas, Sonnet para a maior parte do trabalho e Opus para o difícil, &lt;code&gt;model: haiku&lt;/code&gt; em subagents simples, ferramentas de CLI em vez de MCP quando possível.&lt;/li&gt;
&lt;li&gt;Acompanhe com &lt;code&gt;/usage&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a id="fontes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  23. 📚 Fontes oficiais
&lt;/h2&gt;

&lt;p&gt;Todas em &lt;a href="https://code.claude.com/docs/en/overview" rel="noopener noreferrer"&gt;code.claude.com/docs&lt;/a&gt;, consultadas em outubro de 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visão geral e instalação&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/overview" rel="noopener noreferrer"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/how-claude-code-works" rel="noopener noreferrer"&gt;How Claude Code works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/platforms" rel="noopener noreferrer"&gt;Platforms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/feature-availability" rel="noopener noreferrer"&gt;Feature availability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/setup" rel="noopener noreferrer"&gt;Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/authentication" rel="noopener noreferrer"&gt;Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/third-party-integrations" rel="noopener noreferrer"&gt;Third-party integrations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Uso no terminal&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/cli-reference" rel="noopener noreferrer"&gt;CLI reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/interactive-mode" rel="noopener noreferrer"&gt;Interactive mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/commands" rel="noopener noreferrer"&gt;Commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/keybindings" rel="noopener noreferrer"&gt;Keybindings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/terminal-config" rel="noopener noreferrer"&gt;Terminal config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/statusline" rel="noopener noreferrer"&gt;Status line&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/output-styles" rel="noopener noreferrer"&gt;Output styles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/model-config" rel="noopener noreferrer"&gt;Model config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/fast-mode" rel="noopener noreferrer"&gt;Fast mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Permissões, memória e configuração&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/permission-modes" rel="noopener noreferrer"&gt;Permission modes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/permissions" rel="noopener noreferrer"&gt;Permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/auto-mode-config" rel="noopener noreferrer"&gt;Auto mode config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/memory" rel="noopener noreferrer"&gt;Memory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/settings" rel="noopener noreferrer"&gt;Settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/sandboxing" rel="noopener noreferrer"&gt;Sandboxing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Extensões&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/hooks" rel="noopener noreferrer"&gt;Hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/hooks-guide" rel="noopener noreferrer"&gt;Hooks guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/sub-agents" rel="noopener noreferrer"&gt;Subagents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/skills" rel="noopener noreferrer"&gt;Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/plugins/overview" rel="noopener noreferrer"&gt;Plugins overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/plugins/install" rel="noopener noreferrer"&gt;Install and manage plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/discover-plugins" rel="noopener noreferrer"&gt;Discover plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/mcp" rel="noopener noreferrer"&gt;MCP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contexto, automação e paralelismo&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/checkpointing" rel="noopener noreferrer"&gt;Checkpointing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/headless" rel="noopener noreferrer"&gt;Headless (&lt;code&gt;-p&lt;/code&gt;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/github-actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/gitlab-ci-cd" rel="noopener noreferrer"&gt;GitLab CI/CD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/worktrees" rel="noopener noreferrer"&gt;Worktrees&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/agent-view" rel="noopener noreferrer"&gt;Agent view&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/agent-teams" rel="noopener noreferrer"&gt;Agent teams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/scheduled-tasks" rel="noopener noreferrer"&gt;Scheduled tasks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/routines" rel="noopener noreferrer"&gt;Routines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Remoto e outras superfícies&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/remote-control" rel="noopener noreferrer"&gt;Remote Control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/claude-code-on-the-web" rel="noopener noreferrer"&gt;Claude Code on the web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/mobile" rel="noopener noreferrer"&gt;Mobile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/desktop" rel="noopener noreferrer"&gt;Desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/slack" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/jetbrains" rel="noopener noreferrer"&gt;JetBrains&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Boas práticas, segurança e custo&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/best-practices" rel="noopener noreferrer"&gt;Best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/security" rel="noopener noreferrer"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/data-usage" rel="noopener noreferrer"&gt;Data usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/costs" rel="noopener noreferrer"&gt;Costs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/devcontainer" rel="noopener noreferrer"&gt;Dev containers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fim da série.&lt;/strong&gt; Parte 1: fundamentos e configuração. Parte 2: extensões, MCP e automação.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>cli</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Série: Claude Code CLI: guia técnico — Parte 2: extensões, MCP e automação</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:24:51 +0000</pubDate>
      <link>https://dev.to/diegobrandao/serie-claude-code-cli-guia-tecnico-completo-parte-2-extensoes-mcp-e-automacao-de-3-2c5l</link>
      <guid>https://dev.to/diegobrandao/serie-claude-code-cli-guia-tecnico-completo-parte-2-extensoes-mcp-e-automacao-de-3-2c5l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Versão do conteúdo:&lt;/strong&gt; outubro de 2026&lt;br&gt;
&lt;strong&gt;Fontes:&lt;/strong&gt; exclusivamente a documentação oficial da Anthropic (&lt;a href="https://code.claude.com/docs" rel="noopener noreferrer"&gt;code.claude.com/docs&lt;/a&gt; e &lt;a href="https://support.claude.com" rel="noopener noreferrer"&gt;support.claude.com&lt;/a&gt;). A lista completa está em Fontes oficiais (Parte 3).&lt;br&gt;
&lt;strong&gt;Aviso:&lt;/strong&gt; o Claude Code é atualizado com frequência. Antes de usar este material como referência, confira as mudanças com &lt;code&gt;/release-notes&lt;/code&gt; e a &lt;a href="https://code.claude.com/docs/en/cli-reference" rel="noopener noreferrer"&gt;referência oficial do CLI&lt;/a&gt;. O &lt;code&gt;claude --help&lt;/code&gt; não lista todas as flags.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📑 Índice da série
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;🧠 O que é o Claude Code CLI (Parte 1)&lt;/li&gt;
&lt;li&gt;📦 Instalação e autenticação (Parte 1)&lt;/li&gt;
&lt;li&gt;🚪 Comandos de entrada (Parte 1)&lt;/li&gt;
&lt;li&gt;⌨️ Atalhos de teclado e prefixos (Parte 1)&lt;/li&gt;
&lt;li&gt;⚡ Slash commands essenciais (Parte 1)&lt;/li&gt;
&lt;li&gt;🔐 Modos de permissão (Parte 1)&lt;/li&gt;
&lt;li&gt;📄 Memória: CLAUDE.md e auto memory (Parte 1)&lt;/li&gt;
&lt;li&gt;⚖️ Configuração: settings.json (Parte 1)&lt;/li&gt;
&lt;li&gt;🪝 Hooks&lt;/li&gt;
&lt;li&gt;👥 Subagents&lt;/li&gt;
&lt;li&gt;🧩 Skills, comandos e plugins&lt;/li&gt;
&lt;li&gt;🔌 MCP no terminal&lt;/li&gt;
&lt;li&gt;⏪ Checkpoints e gestão de contexto&lt;/li&gt;
&lt;li&gt;🤖 Modo não interativo (&lt;code&gt;-p&lt;/code&gt;) e CI&lt;/li&gt;
&lt;li&gt;🔀 Sessões em paralelo&lt;/li&gt;
&lt;li&gt;⏰ Automação agendada&lt;/li&gt;
&lt;li&gt;📱 Trabalho remoto e entre dispositivos (Parte 3)&lt;/li&gt;
&lt;li&gt;✅ O que só o CLI faz (Parte 3)&lt;/li&gt;
&lt;li&gt;❌ O que o CLI não faz (Parte 3)&lt;/li&gt;
&lt;li&gt;🤫 Recursos pouco conhecidos (Parte 3)&lt;/li&gt;
&lt;li&gt;🏆 Fluxo de trabalho recomendado (Parte 3)&lt;/li&gt;
&lt;li&gt;⚠️ Cuidados e limitações (Parte 3)&lt;/li&gt;
&lt;li&gt;📚 Fontes oficiais (Parte 3)&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a id="hooks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. 🪝 Hooks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;O que é:&lt;/strong&gt; um comando seu (ou uma chamada HTTP, ferramenta MCP, prompt ou agente) que roda em pontos fixos do ciclo de vida da sessão. Ele não depende de o Claude decidir executá-lo. Hooks dos tipos &lt;code&gt;prompt&lt;/code&gt; e &lt;code&gt;agent&lt;/code&gt; usam um modelo para avaliar a situação, então não são determinísticos como &lt;code&gt;command&lt;/code&gt; e &lt;code&gt;http&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para que serve:&lt;/strong&gt; formatar código depois de cada edição, bloquear comandos perigosos, registrar todo comando executado, notificar o time, carregar contexto no início da sessão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eventos mais usados
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;SessionStart&lt;/code&gt;, &lt;code&gt;UserPromptSubmit&lt;/code&gt;, &lt;code&gt;PreToolUse&lt;/code&gt;, &lt;code&gt;PermissionRequest&lt;/code&gt;, &lt;code&gt;PostToolUse&lt;/code&gt;, &lt;code&gt;Stop&lt;/code&gt;, &lt;code&gt;PreCompact&lt;/code&gt;, &lt;code&gt;PostCompact&lt;/code&gt;. A documentação lista 33 eventos no total.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo: formatar após cada edição
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PostToolUse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit|Write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run format"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Códigos de saída
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Código&lt;/th&gt;
&lt;th&gt;Efeito&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sucesso. Sem saída, o hook não tem decisão: a ação passa pelo fluxo normal de permissões (silêncio não aprova). Com JSON na saída, o hook pode decidir, por exemplo negar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Erro bloqueante em eventos que podem bloquear. Em &lt;code&gt;PreToolUse&lt;/code&gt;, bloqueia a ferramenta e devolve o stderr ao Claude como motivo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outros&lt;/td&gt;
&lt;td&gt;Erro não bloqueante; a ação segue e aparece um aviso&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Tipos de handler:&lt;/strong&gt; &lt;code&gt;command&lt;/code&gt;, &lt;code&gt;http&lt;/code&gt;, &lt;code&gt;mcp_tool&lt;/code&gt;, &lt;code&gt;prompt&lt;/code&gt; e &lt;code&gt;agent&lt;/code&gt; (este é experimental).&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo: bloquear &lt;code&gt;rm -rf&lt;/code&gt; com &lt;code&gt;if&lt;/code&gt; e decisão em JSON
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"PreToolUse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"if"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash(rm *)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# .claude/hooks/block-rm.sh  (chmod +x; exige jq)&lt;/span&gt;
&lt;span class="nv"&gt;COMMAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.tool_input.command'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$COMMAND&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'rm -rf'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;jq &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'{
    hookSpecificOutput: {
      hookEventName: "PreToolUse",
      permissionDecision: "deny",
      permissionDecisionReason: "Destructive command blocked by hook"
    }
  }'&lt;/span&gt;
&lt;span class="k"&gt;else
  &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0  &lt;span class="c"&gt;# sem decisão; segue o fluxo normal de permissões&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;matcher&lt;/code&gt; restringe ao Bash e o &lt;code&gt;if&lt;/code&gt; restringe a subcomandos &lt;code&gt;rm *&lt;/code&gt;; só quando os dois casam o script é executado. Sem matcher, ou com &lt;code&gt;"*"&lt;/code&gt;, o grupo dispara em toda ocorrência do evento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde definir hooks
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Local&lt;/th&gt;
&lt;th&gt;Escopo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Todos os seus projetos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;O projeto, versionado no git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.claude/settings.local.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;O projeto, só para você&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Settings gerenciado (managed)&lt;/td&gt;
&lt;td&gt;A organização inteira&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;hooks/hooks.json&lt;/code&gt; de um plugin&lt;/td&gt;
&lt;td&gt;Enquanto o plugin estiver ativo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontmatter de skill&lt;/td&gt;
&lt;td&gt;Resto da sessão, depois que a skill é chamada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontmatter de subagent&lt;/td&gt;
&lt;td&gt;Enquanto o subagent roda&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Hooks de níveis diferentes &lt;strong&gt;se somam&lt;/strong&gt;: user, project e local acrescentam hooks sem remover os gerenciados. &lt;code&gt;disableAllHooks&lt;/code&gt; não desliga hooks gerenciados.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;allowManagedHooksOnly&lt;/code&gt; (managed) bloqueia hooks de user, project, local e plugins.&lt;/li&gt;
&lt;li&gt;Hooks de settings, managed e plugins também rodam dentro de subagents; a entrada traz &lt;code&gt;agent_id&lt;/code&gt; e &lt;code&gt;agent_type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sessões na nuvem não leem o &lt;code&gt;~/.claude/settings.json&lt;/code&gt;, então hooks de usuário não rodam lá.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dicas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/hooks&lt;/code&gt; mostra os hooks configurados (só leitura).&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;matcher&lt;/code&gt; aceita texto exato ou regex. O campo &lt;code&gt;if&lt;/code&gt; filtra usando a mesma sintaxe das regras de permissão.&lt;/li&gt;
&lt;li&gt;Timeout padrão: 600 s para &lt;code&gt;command&lt;/code&gt;, &lt;code&gt;http&lt;/code&gt; e &lt;code&gt;mcp_tool&lt;/code&gt;; 30 s para &lt;code&gt;prompt&lt;/code&gt;; 60 s para &lt;code&gt;agent&lt;/code&gt;. Alguns eventos têm limites próprios, menores.&lt;/li&gt;
&lt;li&gt;Na maioria dos eventos, se o hook falhar ou estourar o tempo, a ação segue. Para bloquear nesse caso, use &lt;code&gt;"onFailure": "block"&lt;/code&gt; em hooks &lt;code&gt;command&lt;/code&gt; ou &lt;code&gt;http&lt;/code&gt; (v2.1.295+; sem efeito em &lt;code&gt;Stop&lt;/code&gt;, &lt;code&gt;SubagentStop&lt;/code&gt;, &lt;code&gt;TaskCompleted&lt;/code&gt; e &lt;code&gt;TeammateIdle&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Para reinjetar instruções depois de uma compactação, use um hook &lt;code&gt;SessionStart&lt;/code&gt; com matcher &lt;code&gt;compact&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hook não fura &lt;code&gt;deny&lt;/code&gt;:&lt;/strong&gt; um &lt;code&gt;PreToolUse&lt;/code&gt; que devolve "allow" não libera uma ação bloqueada por regra &lt;code&gt;deny&lt;/code&gt;. Para limites rígidos, use o sistema de permissões.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a id="subagents"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10. 👥 Subagents
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;O que é:&lt;/strong&gt; um assistente especializado que roda na sua própria janela de contexto, com prompt de sistema, ferramentas e permissões próprios. Ele devolve só um resumo, então logs e resultados de busca extensos não poluem a conversa principal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subagents nativos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Explore&lt;/code&gt;: busca rápida, só leitura.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Plan&lt;/code&gt;: pesquisa no plan mode, só leitura.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;general-purpose&lt;/code&gt;: tarefas complexas, com todas as ferramentas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude&lt;/code&gt;: catch-all para o que não se encaixa nos outros.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;statusline-setup&lt;/code&gt; e &lt;code&gt;claude-code-guide&lt;/code&gt;: configuração da status line e dúvidas sobre o próprio Claude Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Criar o seu
&lt;/h3&gt;

&lt;p&gt;Arquivo em &lt;code&gt;.claude/agents/&lt;/code&gt; (projeto) ou &lt;code&gt;~/.claude/agents/&lt;/code&gt; (todos os projetos):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;code-reviewer&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Reviews code for quality and best practices&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read, Glob, Grep&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sonnet&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
You are a code reviewer. Give specific, actionable feedback.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Só &lt;code&gt;name&lt;/code&gt; e &lt;code&gt;description&lt;/code&gt; são obrigatórios.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tools&lt;/code&gt;: allowlist de ferramentas. Se omitido, o subagent herda todas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;disallowedTools&lt;/code&gt;: lista de ferramentas bloqueadas.&lt;/li&gt;
&lt;li&gt;Outros campos: &lt;code&gt;model&lt;/code&gt;, &lt;code&gt;permissionMode&lt;/code&gt;, &lt;code&gt;skills&lt;/code&gt;, &lt;code&gt;mcpServers&lt;/code&gt;, &lt;code&gt;hooks&lt;/code&gt;, &lt;code&gt;memory&lt;/code&gt;, &lt;code&gt;isolation: worktree&lt;/code&gt;, &lt;code&gt;maxTurns&lt;/code&gt;, &lt;code&gt;background&lt;/code&gt;, &lt;code&gt;effort&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;initialPrompt&lt;/code&gt;, &lt;code&gt;omitClaudeMd&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Como invocar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automático:&lt;/strong&gt; o Claude delega com base na &lt;code&gt;description&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explícito:&lt;/strong&gt; cite o subagent no prompt ou mencione com &lt;code&gt;@&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessão inteira:&lt;/strong&gt; &lt;code&gt;claude --agent code-reviewer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Definição temporária, só para a sessão:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--agents&lt;/span&gt; &lt;span class="s1"&gt;'{"debugger": {"description": "Debugs errors", "prompt": "You are an expert debugger."}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Recursos extras:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/subtask &amp;lt;tarefa&amp;gt;&lt;/code&gt; cria um fork que herda a conversa inteira e reporta o resultado de volta na conversa. Para copiar a conversa para uma sessão em segundo plano, use &lt;code&gt;/fork&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+B&lt;/code&gt; manda um subagent em execução para segundo plano.&lt;/li&gt;
&lt;li&gt;Subagents num modelo mais barato (como &lt;code&gt;model: haiku&lt;/code&gt; para tarefas simples) reduzem custo.&lt;/li&gt;
&lt;li&gt;Para um subagent só de leitura, defina &lt;code&gt;tools&lt;/code&gt; com ferramentas de leitura (como no exemplo acima). Apenas remover &lt;code&gt;Edit&lt;/code&gt;/&lt;code&gt;Write&lt;/code&gt; com &lt;code&gt;disallowedTools&lt;/code&gt; &lt;strong&gt;não basta&lt;/strong&gt;: ele mantém Bash e ferramentas MCP.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a id="skills"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  11. 🧩 Skills, comandos e plugins
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Skills
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;O que é:&lt;/strong&gt; um arquivo &lt;code&gt;SKILL.md&lt;/code&gt; com instruções (e arquivos de apoio opcionais) que ensina um procedimento. O Claude carrega a skill quando ela é relevante, ou você chama com &lt;code&gt;/nome&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Local&lt;/th&gt;
&lt;th&gt;Escopo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.claude/skills/&amp;lt;nome&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Você, em todos os projetos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.claude/skills/&amp;lt;nome&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;O time, via git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;plugin&amp;gt;/skills/&amp;lt;nome&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chamada como &lt;code&gt;/plugin-name:skill-name&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy the application to production&lt;/span&gt;
&lt;span class="na"&gt;disable-model-invocation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="na"&gt;Deploy $ARGUMENTS to production&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="s"&gt;1. Run the test suite&lt;/span&gt;
&lt;span class="s"&gt;2. Build the application&lt;/span&gt;
&lt;span class="s"&gt;3. Push to the deployment target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;disable-model-invocation: true&lt;/code&gt;: só você pode chamar (ideal para deploy).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user-invocable: false&lt;/code&gt;: some do menu &lt;code&gt;/&lt;/code&gt; e só o Claude pode chamar.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$ARGUMENTS&lt;/code&gt; recebe todos os argumentos; &lt;code&gt;$0&lt;/code&gt; é o primeiro, &lt;code&gt;$1&lt;/code&gt; o segundo (índice começa em zero).&lt;/li&gt;
&lt;li&gt;Arquivos em &lt;code&gt;.claude/commands/&lt;/code&gt; continuam funcionando e também viram &lt;code&gt;/nome&lt;/code&gt;; a skill acrescenta arquivos de apoio e controle de invocação.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/skills&lt;/code&gt; lista as skills; &lt;code&gt;/skill-doctor&lt;/code&gt; (v2.1.252+) mostra o custo de contexto e o uso de cada uma.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Custo de contexto:&lt;/strong&gt; a descrição de cada skill fica sempre no contexto (&lt;code&gt;description&lt;/code&gt; + &lt;code&gt;when_to_use&lt;/code&gt; são truncados em 1.536 caracteres na listagem). O conteúdo completo só carrega quando a skill é usada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Skills que já vêm prontas:&lt;/strong&gt; &lt;code&gt;/code-review&lt;/code&gt;, &lt;code&gt;/batch&lt;/code&gt;, &lt;code&gt;/debug&lt;/code&gt;, &lt;code&gt;/loop&lt;/code&gt;, &lt;code&gt;/claude-api&lt;/code&gt;, &lt;code&gt;/verify&lt;/code&gt;, &lt;code&gt;/run&lt;/code&gt;, &lt;code&gt;/simplify&lt;/code&gt;, &lt;code&gt;/fewer-permission-prompts&lt;/code&gt;, entre outras.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plugins
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;O que é:&lt;/strong&gt; um diretório que empacota skills, agentes, hooks, servidores MCP e servidores LSP para instalar como uma unidade.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/plugin&lt;/code&gt; abre o menu, com as abas &lt;strong&gt;Discover&lt;/strong&gt;, &lt;strong&gt;Installed&lt;/strong&gt;, &lt;strong&gt;Marketplaces&lt;/strong&gt;, &lt;strong&gt;Errors&lt;/strong&gt; e &lt;strong&gt;Stats&lt;/strong&gt;. A aba Discover lista os plugins dos seus marketplaces.&lt;/li&gt;
&lt;li&gt;Ao abrir um plugin, os detalhes mostram uma estimativa de &lt;strong&gt;custo de contexto&lt;/strong&gt; (Context cost) e o que ele vai instalar. Marketplaces locais ou próprios podem não fornecer esses dados.&lt;/li&gt;
&lt;li&gt;O marketplace oficial da Anthropic (&lt;code&gt;claude-plugins-official&lt;/code&gt;) é adicionado na primeira sessão interativa no terminal, salvo bloqueio por política gerenciada.&lt;/li&gt;
&lt;li&gt;Pelo shell: &lt;code&gt;claude plugin install &amp;lt;plugin&amp;gt;@&amp;lt;marketplace&amp;gt;&lt;/code&gt; (instala no escopo de usuário, a menos que você passe &lt;code&gt;--scope&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Escopos de instalação: usuário, projeto (via &lt;code&gt;.claude/settings.json&lt;/code&gt;) ou local.&lt;/li&gt;
&lt;li&gt;A aba &lt;strong&gt;Installed&lt;/strong&gt; agrupa plugins &lt;strong&gt;sem uso recente&lt;/strong&gt; (Not used recently), para você desativar o que não usa.&lt;/li&gt;
&lt;li&gt;Sessões na nuvem (claude.ai/code) não carregam os plugins das suas configurações locais.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Atenção:&lt;/strong&gt; um plugin ativo entra em todas as sessões, consome contexto e roda com as suas permissões. Revise antes de instalar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a id="mcp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  12. 🔌 MCP no terminal
&lt;/h2&gt;

&lt;p&gt;O MCP (Model Context Protocol) é um padrão aberto para conectar ferramentas de IA a fontes de dados externas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adicionar servidores
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Remoto via HTTP (recomendado para servidores remotos)&lt;/span&gt;
claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http notion https://mcp.notion.com/mcp

&lt;span class="c"&gt;# Remoto com cabeçalho de autenticação&lt;/span&gt;
claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http secure-api https://api.example.com/mcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer your-token"&lt;/span&gt;

&lt;span class="c"&gt;# Local via stdio: tudo depois de "--" vai para o comando do servidor&lt;/span&gt;
claude mcp add &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;AIRTABLE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_KEY &lt;span class="nt"&gt;--transport&lt;/span&gt; stdio airtable &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; airtable-mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Escopos
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Escopo&lt;/th&gt;
&lt;th&gt;Onde fica&lt;/th&gt;
&lt;th&gt;Quem vê&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;local&lt;/code&gt; (padrão)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~/.claude.json&lt;/code&gt;, na entrada do projeto&lt;/td&gt;
&lt;td&gt;Só você, neste projeto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.mcp.json&lt;/code&gt; na raiz do repositório&lt;/td&gt;
&lt;td&gt;O time, via git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;user&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Você, em todos os projetos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Escolha com &lt;code&gt;-s&lt;/code&gt; ou &lt;code&gt;--scope&lt;/code&gt;, por exemplo &lt;code&gt;claude mcp add --transport http shared-server --scope project https://example.com/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se o mesmo nome existir em mais de um lugar, vale a entrada inteira da fonte de maior precedência (os campos não se misturam): local → project → user → plugin → connectors do claude.ai. Servidores fornecidos pela organização via &lt;code&gt;managedMcpServers&lt;/code&gt; (v2.1.259+) ficam acima de todos.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;.mcp.json&lt;/code&gt; (compartilhado com o time)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"notion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.notion.com/mcp"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"airtable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"airtable-mcp-server"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"AIRTABLE_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${AIRTABLE_API_KEY}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;${VAR}&lt;/code&gt; e &lt;code&gt;${VAR:-padrão}&lt;/code&gt; são expandidos em &lt;code&gt;command&lt;/code&gt;, &lt;code&gt;args&lt;/code&gt;, &lt;code&gt;env&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt; e &lt;code&gt;headers&lt;/code&gt;. Assim o segredo fica no ambiente, não no git.&lt;/li&gt;
&lt;li&gt;Variáveis de credencial ficam vazias quando usadas em &lt;code&gt;url&lt;/code&gt; e &lt;code&gt;headers&lt;/code&gt; de servidores remotos. Exemplos: &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;, &lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;, &lt;code&gt;AWS_BEARER_TOKEN_BEDROCK&lt;/code&gt;, &lt;code&gt;HTTPS_PROXY&lt;/code&gt; e &lt;code&gt;NPM_TOKEN&lt;/code&gt;. Use nomes próprios, como &lt;code&gt;API_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Servidores de escopo &lt;code&gt;project&lt;/code&gt; pedem aprovação nas sessões interativas. Para refazer essas escolhas: &lt;code&gt;claude mcp reset-project-choices&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gerenciar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp list                     &lt;span class="c"&gt;# lista servidores&lt;/span&gt;
claude mcp get &amp;lt;nome&amp;gt;               &lt;span class="c"&gt;# detalhes de um servidor&lt;/span&gt;
claude mcp remove &amp;lt;nome&amp;gt;            &lt;span class="c"&gt;# remove&lt;/span&gt;
claude mcp add-json &amp;lt;nome&amp;gt; &lt;span class="s1"&gt;'&amp;lt;json&amp;gt;'&lt;/span&gt; &lt;span class="c"&gt;# adiciona a partir de JSON&lt;/span&gt;
claude mcp add-from-claude-desktop  &lt;span class="c"&gt;# importa do Claude Desktop (macOS e WSL)&lt;/span&gt;
claude mcp serve                    &lt;span class="c"&gt;# expõe o próprio Claude Code como servidor MCP&lt;/span&gt;
claude mcp login &amp;lt;nome&amp;gt;             &lt;span class="c"&gt;# faz o login OAuth sem abrir o painel /mcp&lt;/span&gt;
claude mcp &lt;span class="nb"&gt;logout&lt;/span&gt; &amp;lt;nome&amp;gt;            &lt;span class="c"&gt;# apaga as credenciais OAuth salvas&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro da sessão, &lt;code&gt;/mcp&lt;/code&gt; mostra o status, faz login OAuth pelo navegador e liga ou desliga servidores por projeto. &lt;code&gt;/mcp reconnect all&lt;/code&gt; reconecta todos os servidores com falha (v2.1.284+).&lt;/p&gt;

&lt;h3&gt;
  
  
  Limites e nomes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A saída de uma ferramenta MCP gera aviso acima de 10.000 tokens e tem limite padrão de 25.000, ajustável com &lt;code&gt;MAX_MCP_OUTPUT_TOKENS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;MCP_TIMEOUT&lt;/code&gt; controla o timeout de inicialização (ex.: &lt;code&gt;MCP_TIMEOUT=10000 claude&lt;/code&gt;, 10 s); &lt;code&gt;MCP_TOOL_TIMEOUT&lt;/code&gt;, o de cada ferramenta. O campo &lt;code&gt;timeout&lt;/code&gt; (em ms) no &lt;code&gt;.mcp.json&lt;/code&gt; sobrepõe esse valor por servidor.&lt;/li&gt;
&lt;li&gt;Os schemas das ferramentas MCP são carregados sob demanda (tool search) por padrão, para economizar contexto.&lt;/li&gt;
&lt;li&gt;Ferramentas MCP seguem o padrão &lt;code&gt;mcp__&amp;lt;servidor&amp;gt;__&amp;lt;ferramenta&amp;gt;&lt;/code&gt;; as de plugin, &lt;code&gt;mcp__plugin_&amp;lt;plugin&amp;gt;_&amp;lt;servidor&amp;gt;__&amp;lt;ferramenta&amp;gt;&lt;/code&gt;. Use o nome completo em regras de permissão, &lt;code&gt;tools&lt;/code&gt; de subagent e matchers de hook.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Segurança:&lt;/strong&gt; a Anthropic não audita nem gerencia servidores MCP. Instale só os que você confia; um servidor que lê conteúdo da internet expõe você a prompt injection.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a id="contexto"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  13. ⏪ Checkpoints e gestão de contexto
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Checkpoints
&lt;/h3&gt;

&lt;p&gt;O Claude Code cria um checkpoint automaticamente antes de cada prompt. Ele guarda as edições feitas pelas ferramentas de edição de arquivo do Claude.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Abrir:&lt;/strong&gt; &lt;code&gt;/rewind&lt;/code&gt; (apelidos &lt;code&gt;/checkpoint&lt;/code&gt; e &lt;code&gt;/undo&lt;/code&gt;) ou &lt;code&gt;Esc&lt;/code&gt; &lt;code&gt;Esc&lt;/code&gt; com o campo vazio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opções do menu:&lt;/strong&gt; restaurar código e conversa, só a conversa, só o código, resumir a partir daqui, resumir até aqui. As opções de resumo comprimem o contexto sem mexer nos arquivos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retenção:&lt;/strong&gt; os 100 checkpoints mais recentes de cada sessão. Os snapshots são apagados cerca de 30 dias depois, conforme &lt;code&gt;cleanupPeriodDays&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Checkpoints sobrevivem a &lt;code&gt;--resume&lt;/code&gt; e &lt;code&gt;--continue&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;O que o checkpoint NÃO desfaz:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Efeitos de comandos Bash (&lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, &lt;code&gt;cp&lt;/code&gt; etc.).&lt;/li&gt;
&lt;li&gt;Edições feitas por subagents.&lt;/li&gt;
&lt;li&gt;Mudanças feitas fora do Claude Code ou por outras sessões.&lt;/li&gt;
&lt;li&gt;Arquivos com symlink ou hard link.&lt;/li&gt;
&lt;li&gt;Ações remotas: banco de dados, APIs, deploys.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Checkpoint não substitui o git. Faça commits.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Gestão de contexto
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comando&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/context&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mostra o uso do contexto em grade colorida, com sugestões&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/compact [instruções]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Resume a conversa, com foco opcional (ex.: &lt;code&gt;/compact foque nas mudanças da API&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/clear&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Começa uma conversa nova, com contexto vazio (apelidos &lt;code&gt;/reset&lt;/code&gt; e &lt;code&gt;/new&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/btw &amp;lt;pergunta&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pergunta paralela que não entra no histórico&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/autocompact 500k&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Define a partir de quantos tokens a compactação automática dispara (&lt;code&gt;auto&lt;/code&gt; volta ao padrão)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Janela de contexto:&lt;/strong&gt; 200 mil tokens no padrão. Modelos com janela nativa de 1 milhão (como Fable 5.1, Sonnet 5 em diante, Haiku 5.5 e Opus 4.7 em diante) usam 1M por padrão.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compactação automática&lt;/strong&gt; vem ligada. Ela descarta primeiro saídas antigas de ferramentas e depois resume. Instruções detalhadas do início podem se perder.&lt;/li&gt;
&lt;li&gt;Para controlar o que sobrevive à compactação, adicione uma seção "Compact Instructions" no CLAUDE.md.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CLAUDE_CODE_DISABLE_1M_CONTEXT=1&lt;/code&gt; desliga a janela de 1M.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Como economizar contexto:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regras permanentes vão no CLAUDE.md, não na conversa.&lt;/li&gt;
&lt;li&gt;Investigações longas vão para subagents: só o resumo volta.&lt;/li&gt;
&lt;li&gt;Skills carregam o conteúdo só quando usadas.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;/clear&lt;/code&gt; entre tarefas sem relação.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a id="headless"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  14. 🤖 Modo não interativo (&lt;code&gt;-p&lt;/code&gt;) e CI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"explique este erro"&lt;/span&gt; &lt;span class="nt"&gt;--output-format&lt;/span&gt; json
git diff | claude &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"revise este diff"&lt;/span&gt; &lt;span class="nt"&gt;--allowedTools&lt;/span&gt; &lt;span class="s2"&gt;"Read"&lt;/span&gt; &lt;span class="s2"&gt;"Grep"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Flags principais
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--output-format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Formato da saída: &lt;code&gt;text&lt;/code&gt; (padrão), &lt;code&gt;json&lt;/code&gt; ou &lt;code&gt;stream-json&lt;/code&gt;. &lt;code&gt;json&lt;/code&gt; traz &lt;code&gt;result&lt;/code&gt;, &lt;code&gt;session_id&lt;/code&gt; e &lt;code&gt;total_cost_usd&lt;/code&gt;. &lt;code&gt;stream-json&lt;/code&gt; exige &lt;code&gt;--verbose&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--input-format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Formato da entrada: &lt;code&gt;text&lt;/code&gt; ou &lt;code&gt;stream-json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--json-schema '&amp;lt;schema&amp;gt;'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Força saída estruturada (com &lt;code&gt;--output-format json&lt;/code&gt;, vem em &lt;code&gt;structured_output&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--max-turns &amp;lt;n&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Limita o número de turnos; sem limite por padrão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--max-budget-usd &amp;lt;valor&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Para quando o gasto estimado atingir o teto (só no modo &lt;code&gt;-p&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--allowedTools&lt;/code&gt; / &lt;code&gt;--disallowedTools&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Libera ou bloqueia ferramentas com a sintaxe de regras, uma regra por argumento entre aspas: &lt;code&gt;"Bash(git diff *)" "Read"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restringe quais ferramentas nativas existem na sessão (ex.: &lt;code&gt;"Bash,Edit,Read"&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--permission-mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modo de permissão da execução (&lt;code&gt;dontAsk&lt;/code&gt; é o mais seguro para CI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--permission-prompts none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nega pedidos de permissão em vez de esperar (v2.1.259+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--append-system-prompt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Acrescenta instruções ao prompt de sistema; &lt;code&gt;--system-prompt&lt;/code&gt; substitui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--bare&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pula hooks, skills, plugins, MCP, auto memory e CLAUDE.md; inicia mais rápido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;-c&lt;/code&gt; / &lt;code&gt;-r &amp;lt;id&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Continua ou retoma uma sessão também no modo &lt;code&gt;-p&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Código de saída:&lt;/strong&gt; 0 em sucesso, diferente de zero em falha. &lt;code&gt;SIGTERM&lt;/code&gt; encerra com 143; prefira &lt;code&gt;SIGINT&lt;/code&gt; para fechar o turno de forma limpa.&lt;/li&gt;
&lt;li&gt;A documentação avisa que &lt;code&gt;--bare&lt;/code&gt; deve virar o padrão do &lt;code&gt;-p&lt;/code&gt; numa versão futura.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Autenticação em CI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No modo &lt;code&gt;-p&lt;/code&gt;, &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; é sempre usada quando presente.&lt;/li&gt;
&lt;li&gt;Com assinatura: gere o token com &lt;code&gt;claude setup-token&lt;/code&gt; e use &lt;code&gt;CLAUDE_CODE_OAUTH_TOKEN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Com &lt;code&gt;--bare&lt;/code&gt;, o OAuth é ignorado: use &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; ou &lt;code&gt;apiKeyHelper&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GitHub Actions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Configuração rápida: rode &lt;code&gt;/install-github-app&lt;/code&gt; dentro do Claude Code. Exige repositório no github.com, &lt;code&gt;gh&lt;/code&gt; autenticado e acesso de admin.&lt;/li&gt;
&lt;li&gt;Action oficial: &lt;code&gt;anthropics/claude-code-action@v1&lt;/code&gt;, com o segredo &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; ou &lt;code&gt;CLAUDE_CODE_OAUTH_TOKEN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sem &lt;code&gt;prompt&lt;/code&gt;, responde a menções &lt;code&gt;@claude&lt;/code&gt; em issues e PRs. Com &lt;code&gt;prompt&lt;/code&gt;, roda automaticamente.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude_args&lt;/code&gt; repassa flags do CLI (ex.: &lt;code&gt;--max-turns&lt;/code&gt;, &lt;code&gt;--model&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Quem dispara precisa ter permissão de escrita no repositório.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;anthropics/claude-code-action@v1&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;anthropic_api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;% raw %&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;&lt;span class="s"&gt;${{ secrets.ANTHROPIC_API_KEY }}{% endraw %}&lt;/span&gt;
    &lt;span class="na"&gt;claude_args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--max-turns&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;5"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GitLab CI/CD
&lt;/h3&gt;

&lt;p&gt;Integração em beta, mantida pela GitLab. O job instala o Claude Code com o instalador nativo e roda &lt;code&gt;claude -p&lt;/code&gt; com a variável mascarada &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent SDK
&lt;/h3&gt;

&lt;p&gt;O modo &lt;code&gt;-p&lt;/code&gt; é a interface de linha de comando do Agent SDK. Para saída estruturada, callbacks de aprovação e controle fino, use os pacotes oficiais em Python ou TypeScript.&lt;/p&gt;




&lt;p&gt;&lt;a id="paralelo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  15. 🔀 Sessões em paralelo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Git worktrees
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--worktree&lt;/span&gt; feature-auth   &lt;span class="c"&gt;# ou: claude -w feature-auth&lt;/span&gt;
claude &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"#1234"&lt;/span&gt;                &lt;span class="c"&gt;# cria a partir de um PR (aspas por causa do #)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Cria &lt;code&gt;&amp;lt;repo&amp;gt;/.claude/worktrees/&amp;lt;nome&amp;gt;&lt;/code&gt; numa branch nova &lt;code&gt;worktree-&amp;lt;nome&amp;gt;&lt;/code&gt;. Sem nome, o Claude gera um.&lt;/li&gt;
&lt;li&gt;Coloque &lt;code&gt;.claude/worktrees/&lt;/code&gt; no &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.worktreeinclude&lt;/code&gt; (sintaxe de gitignore) copia arquivos ignorados, como &lt;code&gt;.env&lt;/code&gt;, para o worktree novo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;worktree.baseRef&lt;/code&gt;: &lt;code&gt;"fresh"&lt;/code&gt; (padrão, parte da branch principal) ou &lt;code&gt;"head"&lt;/code&gt; (parte do HEAD atual).&lt;/li&gt;
&lt;li&gt;Ao sair de uma sessão sem nome e sem alterações, o worktree é removido. Nos demais casos, o Claude pergunta antes. Execuções &lt;code&gt;-p&lt;/code&gt; não limpam: use &lt;code&gt;git worktree remove&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--tmux&lt;/code&gt; junto com &lt;code&gt;--worktree&lt;/code&gt; abre o worktree numa sessão tmux.&lt;/li&gt;
&lt;li&gt;Subagents com &lt;code&gt;isolation: worktree&lt;/code&gt; trabalham num worktree próprio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/batch&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;/batch &amp;lt;instrução&amp;gt;&lt;/code&gt; pesquisa o código, divide o trabalho em 5 a 30 unidades independentes e mostra o plano. Depois da aprovação, roda um subagent em segundo plano por unidade, cada um no seu worktree, com testes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/batch migre src/ de JavaScript para TypeScript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sessões em segundo plano
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;claude --bg "tarefa"&lt;/code&gt; inicia uma sessão em segundo plano (não combina com &lt;code&gt;-p&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/background&lt;/code&gt; (ou &lt;code&gt;/bg&lt;/code&gt;) desanexa a sessão atual; &lt;code&gt;/fork&lt;/code&gt; copia a conversa para uma nova sessão em segundo plano.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude agents&lt;/code&gt; abre o painel (agent view, em research preview). &lt;code&gt;←&lt;/code&gt; com o campo vazio desanexa; &lt;code&gt;Enter&lt;/code&gt; ou &lt;code&gt;→&lt;/code&gt; anexa.&lt;/li&gt;
&lt;li&gt;Pelo shell: &lt;code&gt;claude attach&lt;/code&gt;, &lt;code&gt;claude logs&lt;/code&gt;, &lt;code&gt;claude stop&lt;/code&gt;, &lt;code&gt;claude rm&lt;/code&gt;, &lt;code&gt;claude respawn&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;As sessões rodam na sua máquina; uma sessão ociosa e desanexada encerra o processo depois de cerca de uma hora.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent teams (experimental)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Desligado por padrão. Ative com &lt;code&gt;CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Um líder coordena vários "teammates" que trabalham em paralelo e conversam entre si.&lt;/li&gt;
&lt;li&gt;Não funciona no modo &lt;code&gt;-p&lt;/code&gt;. Um time por sessão, sem times aninhados.&lt;/li&gt;
&lt;li&gt;Comece com 3 a 5 teammates. O consumo de tokens é bem maior que o de uma sessão única.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a id="automacao"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  16. ⏰ Automação agendada
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/loop&lt;/code&gt;: repetição dentro da sessão
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/loop 5m verifique se o deploy terminou
/loop verifique o CI a cada 2 horas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Unidades: &lt;code&gt;s&lt;/code&gt;, &lt;code&gt;m&lt;/code&gt;, &lt;code&gt;h&lt;/code&gt;, &lt;code&gt;d&lt;/code&gt;. A granularidade real é de 1 minuto (segundos são arredondados para cima).&lt;/li&gt;
&lt;li&gt;Sem intervalo, o Claude escolhe o ritmo entre 1 minuto e 1 hora. Sem prompt, usa &lt;code&gt;.claude/loop.md&lt;/code&gt; ou &lt;code&gt;~/.claude/loop.md&lt;/code&gt;, se existir.&lt;/li&gt;
&lt;li&gt;Só dispara com o Claude Code aberto e ocioso. Tarefas recorrentes expiram em 7 dias; máximo de 50 por sessão.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Esc&lt;/code&gt; para um loop de ritmo automático. &lt;code&gt;CLAUDE_CODE_DISABLE_CRON=1&lt;/code&gt; desliga o recurso.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/schedule&lt;/code&gt;: rotinas na nuvem
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rotinas rodam na infraestrutura da Anthropic e continuam com o notebook fechado. Planos Pro, Max, Team e Enterprise; em research preview.&lt;/li&gt;
&lt;li&gt;Crie com &lt;code&gt;/schedule&lt;/code&gt; no CLI ou em claude.ai/code/routines.&lt;/li&gt;
&lt;li&gt;Gatilhos: agenda (intervalo mínimo de 1 hora), chamada de API (HTTP POST com token) e eventos do GitHub.&lt;/li&gt;
&lt;li&gt;Limites por hora: 100 execuções agendadas por conta; 30 execuções por rotina, somando "Run now", chamadas de API e reexecuções avulsas; 100 chamadas de API por conta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Qual usar
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opção&lt;/th&gt;
&lt;th&gt;Onde roda&lt;/th&gt;
&lt;th&gt;Intervalo mínimo&lt;/th&gt;
&lt;th&gt;Precisa da máquina ligada?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/loop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Na sessão aberta&lt;/td&gt;
&lt;td&gt;1 minuto&lt;/td&gt;
&lt;td&gt;Sim, com a sessão aberta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tarefa agendada do app desktop&lt;/td&gt;
&lt;td&gt;Na sua máquina&lt;/td&gt;
&lt;td&gt;1 minuto&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/schedule&lt;/code&gt; (rotina)&lt;/td&gt;
&lt;td&gt;Nuvem da Anthropic&lt;/td&gt;
&lt;td&gt;1 hora&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Actions com &lt;code&gt;schedule&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Runner do GitHub&lt;/td&gt;
&lt;td&gt;Conforme o cron do GitHub&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Continua na Parte 3:&lt;/strong&gt; trabalho remoto, o que só o CLI faz, o que ele não faz, recursos pouco conhecidos, fluxo recomendado, cuidados e fontes oficiais.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>automation</category>
      <category>claude</category>
      <category>cli</category>
      <category>mcp</category>
    </item>
    <item>
      <title>⌨️ Série: Claude Code CLI: guia técnico — Parte 1: fundamentos e configuração</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Wed, 14 Oct 2026 11:27:44 +0000</pubDate>
      <link>https://dev.to/diegobrandao/claude-code-cli-guia-tecnico-completo-p9i</link>
      <guid>https://dev.to/diegobrandao/claude-code-cli-guia-tecnico-completo-p9i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Versão do conteúdo:&lt;/strong&gt; outubro de 2026&lt;br&gt;
&lt;strong&gt;Fontes:&lt;/strong&gt; exclusivamente a documentação oficial da Anthropic (&lt;a href="https://code.claude.com/docs" rel="noopener noreferrer"&gt;code.claude.com/docs&lt;/a&gt; e &lt;a href="https://support.claude.com" rel="noopener noreferrer"&gt;support.claude.com&lt;/a&gt;). A lista completa está em Fontes oficiais (Parte 3).&lt;br&gt;
&lt;strong&gt;Aviso:&lt;/strong&gt; o Claude Code é atualizado com frequência. Antes de usar este material como referência, confira as mudanças com &lt;code&gt;/release-notes&lt;/code&gt; e a &lt;a href="https://code.claude.com/docs/en/cli-reference" rel="noopener noreferrer"&gt;referência oficial do CLI&lt;/a&gt;. O &lt;code&gt;claude --help&lt;/code&gt; não lista todas as flags.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📑 Índice da série
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;🧠 O que é o Claude Code CLI&lt;/li&gt;
&lt;li&gt;📦 Instalação e autenticação&lt;/li&gt;
&lt;li&gt;🚪 Comandos de entrada&lt;/li&gt;
&lt;li&gt;⌨️ Atalhos de teclado e prefixos&lt;/li&gt;
&lt;li&gt;⚡ Slash commands essenciais&lt;/li&gt;
&lt;li&gt;🔐 Modos de permissão&lt;/li&gt;
&lt;li&gt;📄 Memória: CLAUDE.md e auto memory&lt;/li&gt;
&lt;li&gt;⚖️ Configuração: settings.json&lt;/li&gt;
&lt;li&gt;🪝 Hooks (Parte 2)&lt;/li&gt;
&lt;li&gt;👥 Subagents (Parte 2)&lt;/li&gt;
&lt;li&gt;🧩 Skills, comandos e plugins (Parte 2)&lt;/li&gt;
&lt;li&gt;🔌 MCP no terminal (Parte 2)&lt;/li&gt;
&lt;li&gt;⏪ Checkpoints e gestão de contexto (Parte 2)&lt;/li&gt;
&lt;li&gt;🤖 Modo não interativo (&lt;code&gt;-p&lt;/code&gt;) e CI (Parte 2)&lt;/li&gt;
&lt;li&gt;🔀 Sessões em paralelo (Parte 2)&lt;/li&gt;
&lt;li&gt;⏰ Automação agendada (Parte 2)&lt;/li&gt;
&lt;li&gt;📱 Trabalho remoto e entre dispositivos (Parte 3)&lt;/li&gt;
&lt;li&gt;✅ O que só o CLI faz (Parte 3)&lt;/li&gt;
&lt;li&gt;❌ O que o CLI não faz (Parte 3)&lt;/li&gt;
&lt;li&gt;🤫 Recursos pouco conhecidos (Parte 3)&lt;/li&gt;
&lt;li&gt;🏆 Fluxo de trabalho recomendado (Parte 3)&lt;/li&gt;
&lt;li&gt;⚠️ Cuidados e limitações (Parte 3)&lt;/li&gt;
&lt;li&gt;📚 Fontes oficiais (Parte 3)&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a id="o-que-e"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. 🧠 O que é o Claude Code CLI
&lt;/h2&gt;

&lt;p&gt;O Claude Code é uma ferramenta de programação agêntica da Anthropic. Ela lê o seu código, edita arquivos, executa comandos e se integra às suas ferramentas de desenvolvimento. O CLI é a versão de terminal: você roda &lt;code&gt;claude&lt;/code&gt; dentro de uma pasta de projeto e conversa com um agente que trabalha nesse projeto.&lt;/p&gt;

&lt;p&gt;Não é um autocomplete. Segundo a documentação, o agente trabalha num ciclo de três fases, que se repete até a tarefa terminar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🔍 &lt;strong&gt;Reúne contexto&lt;/strong&gt;: lê e busca no repositório.&lt;/li&gt;
&lt;li&gt;✏️ &lt;strong&gt;Age&lt;/strong&gt;: edita arquivos, roda testes, build e git.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Verifica&lt;/strong&gt;: confere o resultado e volta ao início se algo falhou.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Planejar antes de mexer no código não é uma fase do ciclo. É um modo de permissão (&lt;code&gt;plan&lt;/code&gt;), que você ativa quando quer (veja a seção 6).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que ele faz, segundo a documentação oficial:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Escreve testes, corrige erros de lint, resolve conflitos de merge, atualiza dependências e escreve release notes.&lt;/li&gt;
&lt;li&gt;Implementa features e corrige bugs a partir de uma descrição em linguagem natural ou de uma mensagem de erro.&lt;/li&gt;
&lt;li&gt;Trabalha direto com git: faz stage, escreve mensagens de commit, cria branches e abre pull requests.&lt;/li&gt;
&lt;li&gt;Conecta-se a ferramentas externas via MCP (Google Drive, Jira, Slack ou ferramentas internas).&lt;/li&gt;
&lt;li&gt;Funciona em pipelines Unix, scripts e CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Onde o mesmo motor roda:&lt;/strong&gt; terminal (CLI), VS Code/Cursor, JetBrains, aba Code do app desktop, web (claude.ai/code), app mobile e Slack. Arquivos &lt;code&gt;CLAUDE.md&lt;/code&gt;, settings e servidores MCP do repositório são compartilhados entre as &lt;strong&gt;superfícies locais&lt;/strong&gt; (CLI, IDEs e desktop).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A página oficial de plataformas descreve o CLI como a superfície mais completa para trabalho no terminal e diz que scripting e o Agent SDK só existem nele.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a id="instalacao"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 📦 Instalação e autenticação
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Requisitos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sistema operacional:&lt;/strong&gt; macOS 13.0+, Windows 10 1809+ ou Windows Server 2019+, Ubuntu 20.04+, Debian 10+, Alpine Linux 3.19+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware:&lt;/strong&gt; 4 GB+ de RAM, processador x64 ou ARM64&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conta:&lt;/strong&gt; Pro, Max, Team, Enterprise ou Console. &lt;strong&gt;O plano Free do claude.ai não inclui Claude Code.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternativa:&lt;/strong&gt; provedores terceiros (Amazon Bedrock, Google Cloud's Agent Platform, Microsoft Foundry)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt; o Bash tool usa o Git for Windows; sem ele, o Claude Code recorre à ferramenta de PowerShell. O sandbox não funciona no Windows nativo; só no WSL 2.&lt;br&gt;
&lt;strong&gt;Alpine e distros com musl:&lt;/strong&gt; instale &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;libgcc&lt;/code&gt;, &lt;code&gt;libstdc++&lt;/code&gt; e &lt;code&gt;ripgrep&lt;/code&gt;, e defina &lt;code&gt;USE_BUILTIN_RIPGREP=0&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Instalar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS, Linux, WSL — instalador nativo (recomendado)&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://claude.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Windows PowerShell&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;irm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://claude.ai/install.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="c"&gt;:: Windows CMD&lt;/span&gt;
&lt;span class="nb"&gt;curl&lt;/span&gt; &lt;span class="na"&gt;-fsSL &lt;/span&gt;&lt;span class="kd"&gt;https&lt;/span&gt;://claude.ai/install.cmd &lt;span class="na"&gt;-o &lt;/span&gt;&lt;span class="kd"&gt;install&lt;/span&gt;.cmd &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kd"&gt;install&lt;/span&gt;.cmd &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;del&lt;/span&gt; &lt;span class="kd"&gt;install&lt;/span&gt;.cmd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Alternativas&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; claude-code          &lt;span class="c"&gt;# Homebrew (canal stable)&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; claude-code@latest   &lt;span class="c"&gt;# Homebrew (canal latest)&lt;/span&gt;
winget &lt;span class="nb"&gt;install &lt;/span&gt;Anthropic.ClaudeCode      &lt;span class="c"&gt;# WinGet&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code &lt;span class="c"&gt;# npm (Node.js 22+; nunca use sudo)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também há repositórios assinados para &lt;code&gt;apt&lt;/code&gt;, &lt;code&gt;dnf&lt;/code&gt; e &lt;code&gt;apk&lt;/code&gt; (Debian, Ubuntu, Fedora, RHEL, Alpine).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;npm com Node antigo:&lt;/strong&gt; a instalação conclui, mas mostra o aviso &lt;code&gt;EBADENGINE&lt;/code&gt;. Use Node.js 22 ou superior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Verificar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--version&lt;/span&gt;   &lt;span class="c"&gt;# imprime a versão, ex.: 2.1.211 (Claude Code)&lt;/span&gt;
claude doctor      &lt;span class="c"&gt;# diagnóstico da instalação e das configurações, sem abrir sessão&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os binários publicados vêm com um &lt;code&gt;manifest.json&lt;/code&gt; assinado e checksums SHA256, verificáveis com a chave GPG divulgada na documentação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Atualizações
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Método de instalação&lt;/th&gt;
&lt;th&gt;Atualiza sozinho?&lt;/th&gt;
&lt;th&gt;Como atualizar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instalador nativo&lt;/td&gt;
&lt;td&gt;✅ Sim, em segundo plano&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;claude update&lt;/code&gt; para forçar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Homebrew&lt;/td&gt;
&lt;td&gt;❌ Não, por padrão&lt;/td&gt;
&lt;td&gt;&lt;code&gt;brew upgrade claude-code&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WinGet&lt;/td&gt;
&lt;td&gt;❌ Não, por padrão&lt;/td&gt;
&lt;td&gt;&lt;code&gt;winget upgrade Anthropic.ClaudeCode&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apt / dnf / apk&lt;/td&gt;
&lt;td&gt;❌ Não&lt;/td&gt;
&lt;td&gt;Pelo gerenciador do sistema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;✅ Sim, se o diretório global do npm for gravável&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;npm install -g @anthropic-ai/claude-code@latest&lt;/code&gt; (evite &lt;code&gt;npm update -g&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;O canal de atualização (&lt;code&gt;latest&lt;/code&gt; ou &lt;code&gt;stable&lt;/code&gt;) é definido pelo setting &lt;code&gt;autoUpdatesChannel&lt;/code&gt;, ou em &lt;code&gt;/config&lt;/code&gt;. O padrão é &lt;code&gt;latest&lt;/code&gt;. O &lt;code&gt;stable&lt;/code&gt; costuma estar cerca de uma semana atrás e pula versões com regressões graves.&lt;/li&gt;
&lt;li&gt;Homebrew e WinGet passam a se atualizar sozinhos com &lt;code&gt;CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE=1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;O setting &lt;code&gt;minimumVersion&lt;/code&gt; define uma versão mínima, para que trocar para &lt;code&gt;stable&lt;/code&gt; não faça downgrade.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Login
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude                      &lt;span class="c"&gt;# primeira execução: login pelo navegador&lt;/span&gt;
claude auth login           &lt;span class="c"&gt;# login explícito (--console para cobrança via API)&lt;/span&gt;
claude auth status          &lt;span class="c"&gt;# status em JSON; código de saída 0 = logado, 1 = não&lt;/span&gt;
claude setup-token          &lt;span class="c"&gt;# gera um token OAuth de longa duração para CI e scripts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;claude setup-token&lt;/code&gt; exige assinatura Claude e abre o navegador uma vez para autorizar. O token vale &lt;strong&gt;um ano&lt;/strong&gt;, é impresso no terminal e não fica salvo. Use-o na variável &lt;code&gt;CLAUDE_CODE_OAUTH_TOKEN&lt;/code&gt;. Ele autentica só as chamadas ao modelo: não serve para Remote Control nem para connectors do claude.ai, e é ignorado com &lt;code&gt;--bare&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pegadinha de autenticação:&lt;/strong&gt; uma &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; que você aprovou tem prioridade sobre a assinatura. Confira o que está em uso com &lt;code&gt;/status&lt;/code&gt; e rode &lt;code&gt;unset ANTHROPIC_API_KEY&lt;/code&gt; para voltar à assinatura.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a id="comandos-de-entrada"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. 🚪 Comandos de entrada
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comando&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Abre uma sessão interativa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude "pergunta"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Abre a sessão já com um prompt inicial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude -p "pergunta"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Roda sem interface, imprime o resultado e sai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude -c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Continua a conversa mais recente &lt;strong&gt;desta pasta&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude -r "&amp;lt;sessão&amp;gt;"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retoma uma sessão por ID ou nome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude -n "nome"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dá nome à sessão (aparece em &lt;code&gt;/resume&lt;/code&gt; e no título do terminal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude -w nome&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Abre a sessão num git worktree isolado (seção 15, na Parte 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude --bg "tarefa"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inicia uma sessão em segundo plano (seção 15, na Parte 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Atualiza para a versão mais recente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gerencia servidores MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gerencia plugins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude agents&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Abre o painel de sessões em segundo plano (exige terminal interativo)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para processar conteúdo recebido por pipe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;arquivo | claude &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"pergunta"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a id="atalhos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. ⌨️ Atalhos de teclado e prefixos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Atalhos principais
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Atalho&lt;/th&gt;
&lt;th&gt;O que faz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Esc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interrompe o Claude ou fecha um diálogo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Esc&lt;/code&gt; &lt;code&gt;Esc&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Com o campo vazio, abre o menu de rewind; com texto, limpa o campo e guarda o rascunho no histórico&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shift+Tab&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Alterna o modo de permissão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+C&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interrompe ou limpa o campo; com o Claude ocioso, o segundo toque sai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+D&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sai da sessão: o primeiro toque mostra um aviso e o segundo, em até 800 ms, sai. Com texto no campo, apaga o próximo caractere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manda comandos Bash e agentes em execução para segundo plano (no tmux, aperte duas vezes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+R&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Busca reversa no histórico de comandos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+G&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Abre o prompt no seu editor de texto padrão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+O&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Liga e desliga o visualizador de transcrição&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+S&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Guarda ou recupera o rascunho do prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+T&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mostra ou oculta a lista de tarefas do Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+V&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cola imagem da área de transferência (&lt;code&gt;Cmd+V&lt;/code&gt; no iTerm2; &lt;code&gt;Alt+V&lt;/code&gt; no Windows/WSL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+X&lt;/code&gt; &lt;code&gt;Ctrl+K&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Para todos os subagents em segundo plano e desliga as respostas automáticas a artifacts (aperte duas vezes em até 3 s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Option+P&lt;/code&gt; / &lt;code&gt;Alt+P&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Troca o modelo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Option+T&lt;/code&gt; / &lt;code&gt;Alt+T&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Liga e desliga o pensamento estendido (sem efeito no Opus 5.5 e nos modelos Fable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Option+O&lt;/code&gt; / &lt;code&gt;Alt+O&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Liga e desliga o fast mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;?&lt;/code&gt; (campo vazio)&lt;/td&gt;
&lt;td&gt;Mostra o painel de atalhos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; alguns atalhos com Option (como &lt;code&gt;Option+P&lt;/code&gt;) exigem configurar Option como Meta no terminal. &lt;code&gt;Option+T&lt;/code&gt; funciona sem essa configuração.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mensagens na fila:&lt;/strong&gt; dá para digitar enquanto o Claude trabalha. &lt;code&gt;Enter&lt;/code&gt; coloca a mensagem na fila; &lt;code&gt;Esc&lt;/code&gt; interrompe mas preserva a fila; &lt;code&gt;Ctrl+Enter&lt;/code&gt; envia a fila na hora (v2.1.275+).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Prefixos no início da linha
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prefixo&lt;/th&gt;
&lt;th&gt;Efeito&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Comando ou skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Shell mode:&lt;/strong&gt; roda o comando direto, a saída entra na conversa e o Claude responde a ela&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menciona um arquivo (uma pasta mostra a listagem de arquivos, não o conteúdo)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de shell mode:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;! npm test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O teste roda e o Claude explica as falhas sem você precisar de um segundo prompt.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Atenção:&lt;/strong&gt; comandos com &lt;code&gt;!&lt;/code&gt; rodam &lt;strong&gt;fora do sandbox&lt;/strong&gt; na maioria das sessões, mesmo com o sandbox ligado. Para o Claude não responder à saída, defina &lt;code&gt;respondToBashCommands&lt;/code&gt; como &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a id="slash-commands"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. ⚡ Slash commands essenciais
&lt;/h2&gt;

&lt;p&gt;Digite &lt;code&gt;/&lt;/code&gt; para ver a lista completa e filtrar.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Categoria&lt;/th&gt;
&lt;th&gt;Comandos&lt;/th&gt;
&lt;th&gt;Para quê&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🏗️ Setup&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/init&lt;/code&gt;, &lt;code&gt;/memory&lt;/code&gt;, &lt;code&gt;/permissions&lt;/code&gt;, &lt;code&gt;/config&lt;/code&gt;, &lt;code&gt;/doctor&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Gerar CLAUDE.md, editar memória e regras, diagnosticar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Contexto&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/context&lt;/code&gt;, &lt;code&gt;/compact&lt;/code&gt;, &lt;code&gt;/clear&lt;/code&gt;, &lt;code&gt;/rewind&lt;/code&gt;, &lt;code&gt;/btw&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Ver, resumir e limpar o contexto; voltar no tempo; fazer pergunta paralela&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎛️ Modelo e consumo&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/model&lt;/code&gt;, &lt;code&gt;/effort&lt;/code&gt;, &lt;code&gt;/fast&lt;/code&gt;, &lt;code&gt;/usage&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Trocar o modelo, o nível de esforço e o modo rápido; ver o consumo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔍 Revisão&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/diff&lt;/code&gt;, &lt;code&gt;/code-review&lt;/code&gt;, &lt;code&gt;/security-review&lt;/code&gt;, &lt;code&gt;/simplify&lt;/code&gt;, &lt;code&gt;/ultrareview&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Revisar mudanças, buscar bugs e falhas de segurança&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🗂️ Sessões&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/resume&lt;/code&gt;, &lt;code&gt;/branch&lt;/code&gt;, &lt;code&gt;/fork&lt;/code&gt;, &lt;code&gt;/rename&lt;/code&gt;, &lt;code&gt;/export&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Retomar, ramificar, copiar e exportar conversas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 Escala&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/batch&lt;/code&gt;, &lt;code&gt;/background&lt;/code&gt;, &lt;code&gt;/loop&lt;/code&gt;, &lt;code&gt;/schedule&lt;/code&gt;, &lt;code&gt;/remote-control&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Paralelismo, segundo plano, recorrência, nuvem, controle remoto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Destaques:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/init&lt;/code&gt; analisa o repositório e gera um &lt;code&gt;CLAUDE.md&lt;/code&gt; inicial com comandos de build, testes e convenções. Se o arquivo já existir, sugere melhorias em vez de sobrescrever.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/effort&lt;/code&gt; aceita &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;, &lt;code&gt;xhigh&lt;/code&gt;, &lt;code&gt;max&lt;/code&gt; ou &lt;code&gt;auto&lt;/code&gt;, além de &lt;code&gt;status&lt;/code&gt; e &lt;code&gt;ultracode&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/simplify&lt;/code&gt; revisa o código alterado com quatro agentes em paralelo. Não procura bugs de corretude; para isso, use &lt;code&gt;/code-review&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/ultrareview&lt;/code&gt; faz uma revisão profunda, com vários agentes, num sandbox na nuvem. Pro e Max têm 3 execuções grátis; depois, exige créditos de uso.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/usage&lt;/code&gt; mostra o custo da sessão, os limites do plano e estatísticas de uso. &lt;code&gt;/cost&lt;/code&gt; e &lt;code&gt;/stats&lt;/code&gt; são apelidos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/btw&lt;/code&gt; faz uma pergunta paralela que não entra no histórico. Ele vê a conversa inteira, mas não usa ferramentas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/branch&lt;/code&gt; cria uma ramificação da conversa e muda para ela; a original continua disponível em &lt;code&gt;/resume&lt;/code&gt;. &lt;code&gt;/fork&lt;/code&gt; copia a conversa para uma nova sessão em segundo plano e mantém você na atual.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/background&lt;/code&gt; (apelido &lt;code&gt;/bg&lt;/code&gt;) desanexa a sessão atual para rodar em segundo plano e libera o terminal.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/doctor&lt;/code&gt; vai além do diagnóstico: aponta skills, servidores MCP e plugins sem uso, hooks lentos, e pode pré-aprovar comandos de leitura que você nega com frequência.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a id="permissoes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. 🔐 Modos de permissão
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modo&lt;/th&gt;
&lt;th&gt;O que roda sem perguntar&lt;/th&gt;
&lt;th&gt;Indicado para&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;auto&lt;/code&gt; ⚡&lt;/td&gt;
&lt;td&gt;Leituras e edições no diretório de trabalho seguem direto; as demais ações passam por um classificador de segurança&lt;/td&gt;
&lt;td&gt;Tarefas longas, menos interrupções&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;default&lt;/code&gt; (Manual)&lt;/td&gt;
&lt;td&gt;Só leituras&lt;/td&gt;
&lt;td&gt;Trabalho sensível&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;acceptEdits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Leituras, edições e comandos comuns de arquivo (&lt;code&gt;mkdir&lt;/code&gt;, &lt;code&gt;touch&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, &lt;code&gt;cp&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Iterar no código que você está revisando&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;plan&lt;/code&gt; 🗺️&lt;/td&gt;
&lt;td&gt;Leituras (mais comandos aprovados pelo classificador, quando o auto mode está disponível)&lt;/td&gt;
&lt;td&gt;Explorar e planejar antes de mudar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dontAsk&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Leituras e ferramentas pré-aprovadas; o resto é &lt;strong&gt;negado&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;CI e scripts travados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;bypassPermissions&lt;/code&gt; ⚠️&lt;/td&gt;
&lt;td&gt;Tudo&lt;/td&gt;
&lt;td&gt;Apenas containers e VMs isoladas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Como trocar de modo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Durante a sessão:&lt;/strong&gt; &lt;code&gt;Shift+Tab&lt;/code&gt;. A partir de &lt;code&gt;auto&lt;/code&gt;, o primeiro toque vai para &lt;code&gt;default&lt;/code&gt;, e o ciclo segue &lt;code&gt;default → acceptEdits → plan&lt;/code&gt;. Modos opcionais, como &lt;code&gt;bypassPermissions&lt;/code&gt;, entram depois de &lt;code&gt;plan&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ao iniciar:&lt;/strong&gt; &lt;code&gt;claude --permission-mode plan&lt;/code&gt;. &lt;code&gt;manual&lt;/code&gt; é apelido de &lt;code&gt;default&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan mode num único prompt:&lt;/strong&gt; comece o prompt com &lt;code&gt;/plan&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Como padrão:&lt;/strong&gt; &lt;code&gt;permissions.defaultMode&lt;/code&gt; no &lt;code&gt;settings.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dontAsk&lt;/code&gt; não entra no ciclo do &lt;code&gt;Shift+Tab&lt;/code&gt;; ative com &lt;code&gt;--permission-mode dontAsk&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pouca gente sabe:&lt;/strong&gt; desde a v2.1.283, &lt;code&gt;auto&lt;/code&gt; é o modo inicial das sessões interativas no terminal e no VS Code. Regras &lt;code&gt;deny&lt;/code&gt; bloqueiam em &lt;strong&gt;qualquer&lt;/strong&gt; modo, inclusive &lt;code&gt;bypassPermissions&lt;/code&gt;. Já as regras &lt;code&gt;allow&lt;/code&gt; não têm efeito em &lt;code&gt;bypassPermissions&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Limites que valem conhecer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;permissions.defaultMode&lt;/code&gt; com &lt;code&gt;auto&lt;/code&gt; ou &lt;code&gt;bypassPermissions&lt;/code&gt; é &lt;strong&gt;ignorado&lt;/strong&gt; em settings de projeto (&lt;code&gt;.claude/settings.json&lt;/code&gt;) e local. Defina no settings de usuário, no managed, ou passe &lt;code&gt;--permission-mode&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;permissions.disableAutoMode: "disable"&lt;/code&gt; remove o auto mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caminhos protegidos&lt;/strong&gt; não têm escrita aprovada automaticamente; a exceção principal é &lt;code&gt;bypassPermissions&lt;/code&gt;. Regras &lt;code&gt;allow&lt;/code&gt; não liberam escrita neles. A lista inclui, entre outros, &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;.gitmodules&lt;/code&gt;, &lt;code&gt;.config/git&lt;/code&gt;, &lt;code&gt;.vscode&lt;/code&gt;, &lt;code&gt;.idea&lt;/code&gt;, &lt;code&gt;.husky&lt;/code&gt;, &lt;code&gt;.devcontainer&lt;/code&gt;, &lt;code&gt;.claude&lt;/code&gt;, &lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.bash_profile&lt;/code&gt;, &lt;code&gt;.zshrc&lt;/code&gt;, &lt;code&gt;.gitconfig&lt;/code&gt;, &lt;code&gt;.npmrc&lt;/code&gt;, &lt;code&gt;.yarnrc&lt;/code&gt;, &lt;code&gt;.mcp.json&lt;/code&gt; e &lt;code&gt;.claude.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A primeira leitura fora dos diretórios de trabalho pede confirmação, a menos que &lt;code&gt;permissions.blockReadsOutsideWorkingDirectories&lt;/code&gt; esteja desligado.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a id="memoria"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. 📄 Memória: CLAUDE.md e auto memory
&lt;/h2&gt;

&lt;p&gt;O Claude Code tem dois sistemas de memória, e os dois são carregados como &lt;strong&gt;contexto&lt;/strong&gt;, não como configuração obrigatória.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Auto memory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Quem escreve&lt;/td&gt;
&lt;td&gt;Você&lt;/td&gt;
&lt;td&gt;O Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conteúdo&lt;/td&gt;
&lt;td&gt;Instruções e regras&lt;/td&gt;
&lt;td&gt;Aprendizados e padrões&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escopo&lt;/td&gt;
&lt;td&gt;Projeto, usuário ou organização&lt;/td&gt;
&lt;td&gt;Por repositório, compartilhado entre worktrees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Carregamento&lt;/td&gt;
&lt;td&gt;Toda sessão&lt;/td&gt;
&lt;td&gt;Toda sessão (primeiras 200 linhas ou 25 KB)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A auto memory fica em &lt;code&gt;~/.claude/projects/&amp;lt;projeto&amp;gt;/memory/&lt;/code&gt;, com um índice &lt;code&gt;MEMORY.md&lt;/code&gt;; o limite de 200 linhas ou 25 KB vale para esse índice. Liga e desliga com o setting &lt;code&gt;autoMemoryEnabled&lt;/code&gt; ou em &lt;code&gt;/memory&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde fica o CLAUDE.md
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Local&lt;/th&gt;
&lt;th&gt;Escopo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Você, em todos os projetos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;./CLAUDE.md&lt;/code&gt; ou &lt;code&gt;./.claude/CLAUDE.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;O time, versionado no git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;./CLAUDE.local.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Só você, neste projeto (coloque no &lt;code&gt;.gitignore&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;./subpasta/CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Carrega sob demanda, quando o Claude trabalha ali&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caminho gerenciado (managed)&lt;/td&gt;
&lt;td&gt;A organização inteira&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;AGENTS.md:&lt;/strong&gt; se não houver &lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;.claude/CLAUDE.md&lt;/code&gt; nem &lt;code&gt;CLAUDE.local.md&lt;/code&gt; no diretório de trabalho ou acima dele, o Claude Code lê o &lt;code&gt;AGENTS.md&lt;/code&gt; no lugar (v2.1.277+).&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Projeto&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Build: ./gradlew build
&lt;span class="p"&gt;-&lt;/span&gt; Testes: ./gradlew test
&lt;span class="p"&gt;-&lt;/span&gt; Nunca editar arquivos em /generated
&lt;span class="p"&gt;-&lt;/span&gt; Convenções de API: @docs/api-conventions.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Boas práticas da documentação oficial:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mantenha cada arquivo abaixo de ~200 linhas. Arquivos longos consomem contexto e reduzem a aderência.&lt;/li&gt;
&lt;li&gt;Escreva instruções verificáveis: "use indentação de 2 espaços" em vez de "formate bem".&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@caminho/arquivo&lt;/code&gt; importa outro arquivo, com profundidade máxima de 4 níveis.&lt;/li&gt;
&lt;li&gt;Adicione uma linha quando o Claude cometer o mesmo erro pela segunda vez.&lt;/li&gt;
&lt;li&gt;Para regras que valem só em parte do código, use &lt;code&gt;.claude/rules/&lt;/code&gt; com escopo por caminho (&lt;code&gt;paths&lt;/code&gt;). Regras em &lt;code&gt;~/.claude/rules/&lt;/code&gt; valem em todos os projetos.&lt;/li&gt;
&lt;li&gt;Em monorepos, &lt;code&gt;claudeMdExcludes&lt;/code&gt; ignora arquivos CLAUDE.md de pastas acima que não interessam.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Comandos úteis:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/memory&lt;/code&gt;: edita os CLAUDE.md, liga ou desliga a auto memory e abre a pasta do que o Claude anotou.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/doctor prompt-audit&lt;/code&gt; (v2.1.283+): procura instruções desatualizadas, contraditórias ou que citam arquivos inexistentes, no CLAUDE.md e nas skills.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/context&lt;/code&gt;: mostra quais arquivos de memória foram carregados.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pegadinha:&lt;/strong&gt; CLAUDE.md é contexto, não regra obrigatória. Para impedir uma ação de verdade, use regras &lt;code&gt;deny&lt;/code&gt; de permissão ou hooks.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a id="settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. ⚖️ Configuração: settings.json
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Precedência, do mais forte para o mais fraco
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nível&lt;/th&gt;
&lt;th&gt;Arquivo&lt;/th&gt;
&lt;th&gt;Quem afeta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Managed&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;managed-settings.json&lt;/code&gt;, MDM ou console do claude.ai&lt;/td&gt;
&lt;td&gt;A organização&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Linha de comando&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude --settings&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Esta sessão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Projeto local&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/settings.local.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Você, neste projeto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Projeto compartilhado&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Todo o time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Usuário&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Você, em todos os projetos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Em geral, o nível mais alto vence. Mas listas como &lt;code&gt;permissions.allow&lt;/code&gt; e &lt;code&gt;permissions.deny&lt;/code&gt; &lt;strong&gt;se somam&lt;/strong&gt; entre os níveis, em vez de uma substituir a outra.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Exemplo: liberar lint e testes, bloquear &lt;code&gt;.env&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://json.schemastore.org/claude-code-settings.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(npm run lint)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(npm run test *)"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deny"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Read(./.env)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Read(./.env.*)"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Detalhes que fazem diferença:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O arquivo é &lt;strong&gt;JSON estrito&lt;/strong&gt;: comentário ou vírgula sobrando gera erro de configuração.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ordem de avaliação:&lt;/strong&gt; &lt;code&gt;deny&lt;/code&gt;, depois &lt;code&gt;ask&lt;/code&gt;, depois &lt;code&gt;allow&lt;/code&gt;. Um &lt;code&gt;deny&lt;/code&gt; amplo vence um &lt;code&gt;allow&lt;/code&gt; mais específico.&lt;/li&gt;
&lt;li&gt;O espaço antes do &lt;code&gt;*&lt;/code&gt; importa: &lt;code&gt;Bash(git diff *)&lt;/code&gt; casa com &lt;code&gt;git diff&lt;/code&gt; e argumentos; sem o espaço, casaria também com &lt;code&gt;git diff-index&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.claudeignore&lt;/code&gt; não tem efeito. Para esconder arquivos, use regras &lt;code&gt;Read(...)&lt;/code&gt; em &lt;code&gt;deny&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Prefere não editar JSON? &lt;code&gt;/permissions&lt;/code&gt; abre um menu, e &lt;code&gt;/fewer-permission-prompts&lt;/code&gt; analisa seu uso e propõe uma allowlist.&lt;/li&gt;
&lt;li&gt;Para saber de onde veio cada valor, &lt;code&gt;/status&lt;/code&gt; mostra as fontes de configuração, e &lt;code&gt;claude doctor&lt;/code&gt; aponta entradas descartadas.&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Continua na Parte 2:&lt;/strong&gt; hooks, subagents, skills, plugins, MCP, checkpoints, modo &lt;code&gt;-p&lt;/code&gt; e CI, sessões em paralelo e automação agendada.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>cli</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Custo de tokens em LLMs: onde pesa e como evitar desperdício</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Mon, 21 Sep 2026 16:02:55 +0000</pubDate>
      <link>https://dev.to/diegobrandao/custo-de-tokens-em-llms-onde-pesa-e-como-evitar-desperdicio-530c</link>
      <guid>https://dev.to/diegobrandao/custo-de-tokens-em-llms-onde-pesa-e-como-evitar-desperdicio-530c</guid>
      <description>&lt;h2&gt;
  
  
  Resumo executivo
&lt;/h2&gt;

&lt;p&gt;Em agentes de código o input domina o volume e o custo; em respostas pontuais e com raciocínio o output pesa mais por token. O desperdício evitável vem de contexto acumulado, modelo e esforço acima do necessário, cache quebrado e modos caros ligados sem necessidade, não da indentação.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Preço por token.&lt;/strong&gt; O output custa 5x a 6x o input em todos os modelos de topo: Claude Opus 5 US$5/25, GPT-5.6 Sol US$4/20 (promoção), Gemini 3.1 Pro US$2/12, e US$10/50 no Fable 5.1 e no GPT-6 Astra.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volume em agentes.&lt;/strong&gt; Agentes gastam ~1.000x mais tokens que chat, com o input puxando o custo (&lt;a href="https://arxiv.org/abs/2604.22750" rel="noopener noreferrer"&gt;arXiv 2604.22750&lt;/a&gt;). Num trace de PR da Sonar, 98% dos ~156 milhões de tokens foram leituras de cache e o output foi 0,19%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raciocínio.&lt;/strong&gt; Thinking tokens são cobrados como output, vêm ligados por padrão e podem chegar a dezenas de milhares por requisição. O esforço é a maior alavanca.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tokenizer.&lt;/strong&gt; O do Claude a partir do 4.7 gera ~30% mais tokens que o anterior (Anthropic) e 1,4x a 1,7x mais que o do GPT em texto e código (Playcode). Compare custo por tarefa, não preço por token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache e modos.&lt;/strong&gt; A leitura de cache custa 10% do input (2,5% no Fable 5.1) e reescrever custa 12,5x mais (50x no Fable 5.1). Fast e Priority custam 1,8x a 2x, e o Batch corta 50%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erros de uso mais bem documentados.&lt;/strong&gt; Sessão longa sem limpar, modelo caro como padrão, esforço alto sem necessidade, cache invalidado, leituras largas e agentes paralelos esquecidos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arquivos de contexto.&lt;/strong&gt; CLAUDE.md, AGENTS.md e GEMINI.md entram em toda sessão e os agentes seguem o que eles dizem. No estudo da ETH Zurich, arquivos gerados por LLM elevaram o custo por tarefa em 20% a 23% sem ganho significativo de acerto. O custo vem do comportamento induzido, não do tamanho do texto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estratégias com ganho medido.&lt;/strong&gt; Mascarar observações antigas (~50% menos custo, JetBrains), estabilizar o prefixo do cache (acerto de 7% para 84% e 59% a 70% de economia num agente em produção), carregar ferramentas sob demanda (de ~77 mil para ~8,7 mil tokens, Anthropic) e cortar instruções de teste de arquivos gerados (−16% a −21% de custo). Os números vêm de contextos diferentes e não se somam.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formatação.&lt;/strong&gt; Indentação, espaços e quebras de linha custam 13% a 15% dos tokens de arquivos reais de Java, C# e C++ e 4% dos de Python; a indentação sozinha vale ~8% a 10% nos exercícios de completar código. O modelo tende a repetir a formatação na saída. É real, mas secundário.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Recomendação:&lt;/strong&gt; limpar contexto a cada tarefa, escolher modelo e esforço por tarefa, estabilizar o prefixo para cache, reduzir leituras e definições de ferramentas, impor tetos de gasto e medir custo por tarefa com o campo &lt;code&gt;usage&lt;/code&gt; de cada resposta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escopo e qualidade das fontes
&lt;/h2&gt;

&lt;p&gt;O estudo responde quatro perguntas: onde o custo de tokens se concentra (input ou output), quais erros de uso mais o geram, como evitá-los e quais estratégias de redução têm ganho medido em fonte primária ou caso de produção. Cobre Claude (Fable 5.1, Opus 5, Sonnet 5, Haiku 4.5), OpenAI (GPT-6 Astra e GPT-5.6 Sol, Terra e Luna) e Google (Gemini 3.1 Pro e 3.8 Flash), além dos arquivos de contexto do Claude Code, do Codex, do Gemini CLI, do Kimi Code CLI e do GLM. Data-base: 20/09/2026.&lt;/p&gt;

&lt;p&gt;Método: cada número vem de página aberta em 20/09/2026, com prioridade para documentação oficial e papers. Onde a fonte é de um fornecedor que vende a solução ou de terceiros, isso está marcado. Cálculos próprios estão marcados como tais.&lt;/p&gt;

&lt;p&gt;Cada fonte recebe uma nota de força:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A:&lt;/strong&gt; paper, documentação ou página oficial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;B:&lt;/strong&gt; medição de terceiro ou de fornecedor, com método descrito.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C:&lt;/strong&gt; análise secundária.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Onde o custo se concentra: input em agentes, output em geração e raciocínio
&lt;/h2&gt;

&lt;p&gt;O ponto de maior custo depende do padrão de uso.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Padrão de uso&lt;/th&gt;
&lt;th&gt;Onde o custo pesa&lt;/th&gt;
&lt;th&gt;Evidência&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chat e geração pontual&lt;/td&gt;
&lt;td&gt;Output, 5x a 6x mais caro por token&lt;/td&gt;
&lt;td&gt;Tabela de preços abaixo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agente de código&lt;/td&gt;
&lt;td&gt;Input, por releitura do contexto a cada passo&lt;/td&gt;
&lt;td&gt;arXiv 2604.22750; trace de um PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de raciocínio&lt;/td&gt;
&lt;td&gt;Output invisível (thinking tokens)&lt;/td&gt;
&lt;td&gt;Documentação da OpenAI e da Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Uso real em escala.&lt;/strong&gt; O relatório OpenRouter/a16z (&lt;a href="https://openrouter.ai/state-of-ai" rel="noopener noreferrer"&gt;State of AI&lt;/a&gt;, 100 trilhões de tokens até nov/2025) mostra o prompt médio subindo de ~1,5 mil para mais de 6 mil tokens e a resposta de ~150 para ~400, uma razão de ~15 para 1 (cálculo nosso). Prompts de programação são 3 a 4x mais longos que os gerais e passam de 20 mil tokens de input, e mais de 50% dos tokens já passam por modelos de raciocínio. Com output 5x mais caro, o input ainda responde por ~75% do custo a preço cheio e sem cache (cálculo ilustrativo nosso). O dado vem de uma só plataforma e usa proxies para uso agêntico.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentes.&lt;/strong&gt; Bai et al. (&lt;a href="https://arxiv.org/abs/2604.22750" rel="noopener noreferrer"&gt;arXiv 2604.22750&lt;/a&gt;, abr/2026) analisaram trajetórias de 8 modelos de 2025 no SWE-bench Verified, com o agente OpenHands. Em média, uma tarefa agêntica usou 4,17 milhões de tokens (US$1,86), contra 1,19 mil (US$0,016) em raciocínio de código e 3,39 mil (US$0,023) em chat de código: de 1.200x a 3.500x mais tokens. A razão input/output é de ~154 para 1 em agentes, contra 0,16 e 1,33 nos outros dois, e o input puxa o custo mesmo com cache. Num estudo de caso com o Sonnet 4.5, a leitura de cache dominou volume e custo em todas as fases, embora o output custe muito mais por token.&lt;/p&gt;

&lt;p&gt;A mesma tarefa varia: a run mais cara custa em média ~2x a mais barata, com extremos de até 30x. Mais tokens não garantem mais acerto (a acurácia sobe pouco e satura), e os modelos preveem o próprio gasto com correlação de no máximo 0,39, subestimando-o. Um loop ingênuo relê o histórico a cada passo: 20 passos de 1.000 tokens somam 210.000 tokens de input, não 20.000 (cálculo nosso).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caso: um PR de 800 linhas (Sonar, 1/09/2026).&lt;/strong&gt; O &lt;a href="https://www.sonarsource.com/blog/stop-the-context-tax/" rel="noopener noreferrer"&gt;post da Sonar&lt;/a&gt; mede 512 idas e voltas, janela com pico de 458.700 tokens e ~156 milhões de tokens faturados por ~US$41: 152,8 milhões de leitura de cache, 3,1 milhões de escrita, 106 mil de input novo e 289 mil de output. Um arquivo de 618 linhas (6.472 tokens), lido para usar uma função de ~67 linhas, ficou no contexto por ~470 turnos: ~2,7 milhões de tokens relidos, cerca de US$0,54 à tarifa de cache citada (~US$0,20 por milhão). Em 18 PRs comparáveis, a média foi de ~234 milhões de tokens de contexto, ~700 idas e voltas e ~US$65 por PR (mediana ~US$52). Com essa tarifa, as 152,8 milhões de leituras custam ~US$30,6, cerca de 75% do total (cálculo nosso). Ressalvas: o post não nomeia o modelo nem o agente, mede um repositório e a Sonar vende a solução (&lt;a href="https://www.beri.net/article/coding-agent-cache-read-context-tax-tokens-per-pr-turn-budget" rel="noopener noreferrer"&gt;análise crítica&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentação oficial: o custo cresce com a sessão.&lt;/strong&gt; O Claude Code envia a conversa inteira a cada requisição, e cada uso de ferramenta gera outra requisição. Com cache, o histórico é relido à tarifa de cache, então uma pergunta de uma linha numa sessão aberta o dia todo consome o histórico inteiro. A primeira mensagem após uma pausa maior que o TTL reprocessa o contexto inteiro, e &lt;code&gt;/compact&lt;/code&gt; é ele próprio uma requisição grande (&lt;a href="https://code.claude.com/docs/en/costs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Leitura: com agentes, otimizar input (contexto, cache, leituras) rende mais que otimizar output. Em geração direta e modelos de raciocínio, ocorre o inverso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidência por modelo: o preço por token é parecido, o custo por tarefa não
&lt;/h2&gt;

&lt;p&gt;Os modelos de topo custam de US$4 a US$10 por milhão de tokens de input, e o output custa 5x a 6x mais em todos; tokenizer, raciocínio e cache é que fazem o custo por tarefa divergir. A tabela traz US$ por milhão de tokens, contexto curto, tarifa padrão, lida nas páginas oficiais em 20/09/2026.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Output/Input&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;Claude Fable 5.1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;GPT-6 Astra&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;Claude Opus 5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developers.openai.com/api/docs/models/gpt-5.6-sol" rel="noopener noreferrer"&gt;GPT-5.6 Sol&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4 (promo)&lt;/td&gt;
&lt;td&gt;20 (promo)&lt;/td&gt;
&lt;td&gt;5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;Claude Sonnet 5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;GPT-5.6 Terra&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Gemini 3.1 Pro Preview&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;Claude Haiku 4.5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Gemini 3.8 Flash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;0,75 (promo)&lt;/td&gt;
&lt;td&gt;3,75 (promo)&lt;/td&gt;
&lt;td&gt;5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;GPT-5.6 Luna&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;0,20&lt;/td&gt;
&lt;td&gt;1,20&lt;/td&gt;
&lt;td&gt;6x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O GPT-5.6 Sol está em promoção: a OpenAI garante US$4/20 pelo menos até 21/11/2026, e o preço anterior era US$5/30 (&lt;a href="https://developers.openai.com/api/docs/models/gpt-5.6-sol" rel="noopener noreferrer"&gt;página oficial&lt;/a&gt;). Na Anthropic, o Sonnet 5 a US$2/10 é agora o preço padrão, e o aumento previsto para US$3/15 em 1/09/2026 não vai ocorrer. DeepSeek V4, Grok e Mistral ficaram fora da tabela porque não foram verificados em página oficial nesta revisão.&lt;/p&gt;

&lt;p&gt;Fontes: páginas de preços da &lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt;, da &lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt; e do &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Google&lt;/a&gt;. O Gemini 3.8 Flash custa US$0,75/3,75 até 31/12/2026 e US$1,50/7,50 depois. GPT-6 Astra (OpenAI) e Claude Fable 5.1 (Anthropic) custam ambos US$10/50.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cache, contexto longo e modos especiais: regras oficiais por fornecedor
&lt;/h3&gt;

&lt;p&gt;Anthropic, OpenAI e Google cobram a leitura de cache a 10% do input (2,5% no Fable 5.1). A escrita, o prazo, o contexto longo e o que invalida o cache variam.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fornecedor&lt;/th&gt;
&lt;th&gt;Leitura de cache&lt;/th&gt;
&lt;th&gt;Escrita ou armazenamento&lt;/th&gt;
&lt;th&gt;Contexto longo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://platform.claude.com/docs/en/build-with-claude/prompt-caching" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;0,1x o input (0,025x no Fable 5.1)&lt;/td&gt;
&lt;td&gt;Escrita 1,25x (5 min) ou 2x (1 h)&lt;/td&gt;
&lt;td&gt;Janela de 1 milhão a preço padrão, sem sobretaxa (&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;preços&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;0,1x (Sol US$0,40; Astra US$1,00)&lt;/td&gt;
&lt;td&gt;Escrita 1,25x (Sol US$5,00)&lt;/td&gt;
&lt;td&gt;Acima de 272 mil tokens: 2x no input e 1,5x no output da requisição inteira (Sol)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Google&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;0,1x (3.1 Pro US$0,20; 3.8 Flash US$0,075)&lt;/td&gt;
&lt;td&gt;Armazenamento por hora: US$4,50 por milhão (3.1 Pro), US$0,50 (3.8 Flash até 31/12/2026)&lt;/td&gt;
&lt;td&gt;Acima de 200 mil tokens: US$4/18 no 3.1 Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lote e prioridade.&lt;/strong&gt; O Batch corta 50% do input e do output nos três fornecedores (Sol a US$2/10 no Batch). Os modos rápidos custam mais: fast mode do Opus 5 e do Opus 4.8 a US$10/50 (2x, indisponível no Batch), Fast mode da OpenAI 2x (Sol a US$8/40) e Priority do Gemini 3.1 Pro 1,8x (US$3,60/21,60).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prazo.&lt;/strong&gt; O TTL padrão é de 5 minutos, renova a cada uso e conta desde o início da requisição, inclusive o tempo de geração. No Claude Code o cache dura 1 h em assinatura e 5 min em API key ou com créditos de uso (&lt;a href="https://code.claude.com/docs/en/costs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O que invalida (Anthropic).&lt;/strong&gt; O acerto exige prompt 100% idêntico até o breakpoint. Mudar definições de ferramentas invalida tudo. Ligar ou desligar web search ou citações e trocar o modo rápido invalidam sistema e mensagens. Mudar &lt;code&gt;tool_choice&lt;/code&gt;, imagens, parâmetros de thinking ou &lt;code&gt;output_config.effort&lt;/code&gt; invalida as mensagens. Em modelos com esforço por mensagem, mudar o esforço numa mensagem &lt;code&gt;system&lt;/code&gt; preserva o prefixo (&lt;a href="https://platform.claude.com/docs/en/build-with-claude/prompt-caching" rel="noopener noreferrer"&gt;docs&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erro clássico.&lt;/strong&gt; Breakpoint num bloco que muda a cada requisição, como um timestamp: o cache é escrito toda vez e nunca lido. O ponto certo é o último bloco estável.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mínimo.&lt;/strong&gt; Abaixo de 512 tokens (Opus 5, Fable 5.1), 1.024 (Sonnet 5) ou 4.096 (Haiku 4.5) o prompt não entra em cache, sem erro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custo do erro.&lt;/strong&gt; Reescrever o cache custa 12,5x mais que lê-lo (1,25x contra 0,1x) e 50x no Fable 5.1 (1,25x contra 0,025x); cálculo a partir das tarifas oficiais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Residência de dados.&lt;/strong&gt; &lt;code&gt;inference_geo: "us"&lt;/code&gt; multiplica todos os tipos de token por 1,1x nos Claude 4.6 e posteriores; a OpenAI cobra +10% em endpoints regionais.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tokenizer: o mesmo código vira 1,5x a 1,7x mais tokens no Claude atual que no GPT
&lt;/h3&gt;

&lt;p&gt;A Anthropic informa que os modelos a partir do Claude 4.7 geram cerca de 30% mais tokens para o mesmo texto que o tokenizer anterior (&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;preços&lt;/a&gt;). A &lt;a href="https://playcode.io/blog/real-price-of-frontier-models" rel="noopener noreferrer"&gt;Playcode&lt;/a&gt; comparou fornecedores com o &lt;code&gt;count_tokens&lt;/code&gt; da Anthropic e conferiu contra requisições pagas. A tabela usa o o200k do GPT como 1,00x.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Conteúdo&lt;/th&gt;
&lt;th&gt;Claude (novo)&lt;/th&gt;
&lt;th&gt;Claude (antigo)&lt;/th&gt;
&lt;th&gt;Gemini 3.x Flash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript (2.888 caracteres)&lt;/td&gt;
&lt;td&gt;1,73x&lt;/td&gt;
&lt;td&gt;1,32x&lt;/td&gt;
&lt;td&gt;1,16x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;1,58x&lt;/td&gt;
&lt;td&gt;1,22x&lt;/td&gt;
&lt;td&gt;1,19x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;1,52x&lt;/td&gt;
&lt;td&gt;1,26x&lt;/td&gt;
&lt;td&gt;1,23x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;1,50x&lt;/td&gt;
&lt;td&gt;1,22x&lt;/td&gt;
&lt;td&gt;1,20x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prosa em inglês&lt;/td&gt;
&lt;td&gt;1,40x&lt;/td&gt;
&lt;td&gt;1,05x&lt;/td&gt;
&lt;td&gt;1,01x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prosa em chinês&lt;/td&gt;
&lt;td&gt;1,44x&lt;/td&gt;
&lt;td&gt;1,45x&lt;/td&gt;
&lt;td&gt;0,85x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quem usa qual.&lt;/strong&gt; Sonnet 5, Opus 4.8, Opus 5, Fable 5 e Fable 5.1 usam o tokenizer novo; Sonnet 4.6 e Opus 4.6 usam o antigo. O Fable 5.1 conta o input igual ao Fable 5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preço efetivo.&lt;/strong&gt; Com a divergência média de 1,50x em pedidos típicos de código, a Playcode calcula que os US$5/25 do Opus 5 se comportam como US$7,50/37,50 na base do GPT, e os US$10/50 do Fable 5.1 como US$15/75. É estimativa de terceiro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache também.&lt;/strong&gt; Leituras e escritas de cache cobram por token, então a inflação as encarece na mesma proporção.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output varia mais que input.&lt;/strong&gt; Numa tarefa única (o mesmo SVG, esforço máximo, thinking incluído), os tokens de output foram: Sonnet 5 121.713; Fable 5.1 99.072; Opus 5 74.061; GPT-6 Astra 45.836; Fable 5 42.560; GPT-5.6 Terra 29.834; Gemini 3.7 Flash 13.863. É um prompt só: serve de indício, não de regra.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentes (modelos de 2025).&lt;/strong&gt; No estudo de Bai et al., Claude Sonnet 4.5 e Kimi K2 consumiram em média mais de 1,5 milhão de tokens a mais que o GPT-5 nas mesmas tarefas (&lt;a href="https://arxiv.org/abs/2604.22750" rel="noopener noreferrer"&gt;arXiv 2604.22750&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare por custo por tarefa, não por preço por token: rode o mesmo trabalho em cada modelo e leia o campo &lt;code&gt;usage&lt;/code&gt; das respostas. O estudo de formatação da seção seguinte usou tokenizers de 2024–25 (GPT-4o, Claude 3.7, Gemini 1.5); não encontramos medição do efeito no tokenizer novo do Claude.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reasoning tokens: cobrados como output, ligados por padrão e quase invisíveis
&lt;/h3&gt;

&lt;p&gt;OpenAI e Anthropic documentam que tokens de raciocínio saem à tarifa de output, e a página de preços do Google rotula o output do Gemini como incluindo os tokens de thinking.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI.&lt;/strong&gt; Os tokens de raciocínio não aparecem na API, ocupam a janela de contexto e são cobrados como output. Podem ir de algumas centenas a dezenas de milhares por resposta, e a OpenAI recomenda reservar ao menos 25.000 tokens para raciocínio e saída (&lt;a href="https://developers.openai.com/api/docs/guides/reasoning" rel="noopener noreferrer"&gt;guia&lt;/a&gt;). Se &lt;code&gt;max_output_tokens&lt;/code&gt; se esgota durante o raciocínio, você paga input e raciocínio sem receber resposta visível.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic.&lt;/strong&gt; No Claude Code o extended thinking vem ligado por padrão, é cobrado como output e seu orçamento padrão pode chegar a dezenas de milhares de tokens por requisição. Nos modelos Fable não dá para desligá-lo. &lt;code&gt;MAX_THINKING_TOKENS&lt;/code&gt; só vale em modelos de orçamento fixo; os de raciocínio adaptativo ignoram orçamentos não nulos, então o controle é o esforço (&lt;code&gt;/effort&lt;/code&gt;) (&lt;a href="https://code.claude.com/docs/en/costs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Padrões e modos (OpenAI).&lt;/strong&gt; O GPT-5.6 usa esforço &lt;code&gt;medium&lt;/code&gt; por padrão. O modo &lt;code&gt;pro&lt;/code&gt; agrega mais trabalho do modelo e cobra pelas tarifas normais, então gasta mais tokens. O GPT-6 Astra não aceita &lt;code&gt;none&lt;/code&gt;. O GPT-5.6 também renderiza por padrão o raciocínio de turnos anteriores (&lt;code&gt;all_turns&lt;/code&gt;); &lt;code&gt;current_turn&lt;/code&gt; reduz o contexto renderizado em fluxos longos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trocar o esforço e o cache.&lt;/strong&gt; Na Anthropic, mudar o esforço invalida o cache de mensagens, salvo em modelos com esforço por mensagem. Na OpenAI, o item &lt;code&gt;configuration_update&lt;/code&gt; (só no GPT-6 Astra) muda o esforço preservando o prefixo do prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ordem de grandeza.&lt;/strong&gt; 4.000 tokens de thinking mais uma resposta de 500 somam 9x os tokens de output da resposta sozinha (cálculo nosso).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mais raciocínio não é mais acerto.&lt;/strong&gt; No estudo de agentes, a acurácia costuma atingir o pico em custo intermediário e satura depois (&lt;a href="https://arxiv.org/abs/2604.22750" rel="noopener noreferrer"&gt;arXiv 2604.22750&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Formatação custa de 4% a 15% dos tokens em arquivos reais e ~25% em trechos de exercício
&lt;/h2&gt;

&lt;p&gt;O estudo de Pan et al. (&lt;a href="https://arxiv.org/html/2508.13666v1" rel="noopener noreferrer"&gt;arXiv 2508.13666&lt;/a&gt;, lido na íntegra) mede o custo da formatação em duas etapas: uma amostra do Stack v2 (100 mil arquivos por linguagem em Java, C# e C++, tokenizer do GPT-4o) e um experimento principal com 10 modelos. Ambas removem só o que não altera a sintaxe. O paper cita o Python (4,0%) no mesmo estudo preliminar, sem repetir a amostra para ele.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Linguagem&lt;/th&gt;
&lt;th&gt;Arquivos reais (GPT-4o)&lt;/th&gt;
&lt;th&gt;Exercícios de completar código (média de 10 modelos)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;14,7%&lt;/td&gt;
&lt;td&gt;34,9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;13,2%&lt;/td&gt;
&lt;td&gt;31,1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;13,2%&lt;/td&gt;
&lt;td&gt;25,3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;4,0%&lt;/td&gt;
&lt;td&gt;6,5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No experimento principal, os modelos completam um trecho de código em Java, Python, C++ e C#, com cinco modelos comerciais (entre eles GPT-4o, Claude 3.7 e Gemini 1.5) e cinco de pesos abertos. Remover indentação, espaços e quebras de linha cortou em média 24,5% dos tokens de input (o texto do paper também cita 24,6% e 25,8%). Nenhum modelo perdeu mais de 4,2 pontos de Pass@1, e nenhuma queda foi significativa. No Claude 3.7 a redução média foi de 23,0%. Python cai menos porque a indentação é sintaxe.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cada elemento (C++, Java, C#).&lt;/strong&gt; A indentação sozinha responde por 7,9% dos tokens de input no Claude 3.7, 8,9% no Gemini 1.5 e 9,6% no GPT-4o. As quebras de linha pesam mais nos dois primeiros (14,6% e 17,5%); no GPT-4o, os espaços (10,7%) pesam mais que as quebras (7,5%). A diferença vem dos tokenizers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Saída.&lt;/strong&gt; O modelo repete a formatação mesmo com entrada sem ela: a redução média de output foi de só 2,5%. Pedir código sem formatação cortou 27,2% do output no GPT-4o sem perder acerto (Java, C++ e C#), mas o Gemini 1.5 quebrou a sintaxe e o Pass@1 em C++ caiu de 67,2% para 11,1%. Ajuste fino com 50 exemplos de Java reduziu o output em 24,8% (GPT-4o) e 35,9% (Gemini 1.5).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limites.&lt;/strong&gt; A tarefa é completar código, em quatro linguagens e com modelos de 2024–25. Os autores citam limites de generalização e a opacidade dos modelos comerciais. Nenhum modelo atual foi testado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Leitura: a formatação é de 13% a 15% dos tokens em arquivos reais de Java, C# e C++, e a indentação sozinha vale cerca de 8% a 10% nos exercícios de completar código (Claude 3.7, Gemini 1.5 e GPT-4o). Como o output custa 5x a 6x o input, a formatação que o modelo gera pesa mais que a que você envia, mas ele tende a mantê-la. Pedir "sem formatação" exige teste, porque pode quebrar a sintaxe. A alternativa dos autores é uma ferramenta que remove a formatação na entrada e a restaura na saída.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquivos de contexto (CLAUDE.md, AGENTS.md, GEMINI.md): o que custam e quando compensam
&lt;/h2&gt;

&lt;p&gt;Esses arquivos entram no contexto de toda sessão. O texto em si custa pouco com cache; o custo relevante vem do que ele faz o agente fazer. A medição mais rigorosa é a de Gloaguen et al. (&lt;a href="https://arxiv.org/abs/2602.11988" rel="noopener noreferrer"&gt;arXiv 2602.11988&lt;/a&gt;, v2 de jun/2026, lido na íntegra): quatro agentes (Claude Code com Sonnet 4.5, Codex com GPT-5.2 e GPT-5.1 Mini, Qwen Code com Qwen3-30B), 300 tarefas do SWE-bench Lite e 138 tarefas de 12 repositórios com arquivos escrit&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>performance</category>
    </item>
    <item>
      <title>Métricas de efetividade de uso de IA — Spark Monitor</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Fri, 18 Sep 2026 13:00:57 +0000</pubDate>
      <link>https://dev.to/diegobrandao/metricas-de-efetividade-de-uso-de-ia-spark-monitor-531g</link>
      <guid>https://dev.to/diegobrandao/metricas-de-efetividade-de-uso-de-ia-spark-monitor-531g</guid>
      <description>&lt;h1&gt;
  
  
  Métricas de efetividade de uso de IA — Spark Monitor
&lt;/h1&gt;

&lt;p&gt;Resumo da pesquisa sobre como medir se uma sessão de IA (Claude Code) foi produtiva, e como ranquear uso entre várias pessoas de forma fidedigna.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problema-base
&lt;/h2&gt;

&lt;p&gt;Token bruto (input/output/cache) mede &lt;strong&gt;atividade&lt;/strong&gt;, não &lt;strong&gt;resultado&lt;/strong&gt;. Ranquear pessoas só por isso vira Goodhart's law: o comportamento se otimiza para o número, não para a entrega.&lt;/p&gt;

&lt;h2&gt;
  
  
  Métricas para somar ao que o Spark Monitor já captura
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cache hit ratio&lt;/strong&gt; = &lt;code&gt;cache_read / (cache_read + input)&lt;/code&gt; — sinal de reuso eficiente de contexto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output por task fechada&lt;/strong&gt;, não por sessão — normaliza por dificuldade da tarefa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessões por task&lt;/strong&gt; — muitas sessões para fechar 1 task indica retrabalho ou task mal escopada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rework rate real&lt;/strong&gt; — % de código gerado por IA que é revertido ou reescrito em N dias. É a 5ª métrica oficial do DORA desde 2025. Sem esse dado, as métricas acima medem atividade, não qualidade.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Base acadêmica
&lt;/h2&gt;

&lt;p&gt;Paper: Chen et al., &lt;em&gt;"Beyond the Commit: Developer Perspectives on Productivity with AI Coding Assistants"&lt;/em&gt; — ICSE-SEIP 2026 (CMU + BNY Mellon). Survey com 2989 devs + 11 entrevistas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correlação entre satisfação percebida e tempo economizado auto-reportado: &lt;strong&gt;r = 0,34&lt;/strong&gt; (fraca). Confirma que métrica única não captura produtividade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6 fatores identificados&lt;/strong&gt;, agrupados em desenvolvimento / deploy / longo prazo:

&lt;ol&gt;
&lt;li&gt;Autossuficiência&lt;/li&gt;
&lt;li&gt;Fricção e carga cognitiva&lt;/li&gt;
&lt;li&gt;Taxa e qualidade de conclusão de tarefa&lt;/li&gt;
&lt;li&gt;Facilidade de peer review&lt;/li&gt;
&lt;li&gt;Expertise técnica (longo prazo)&lt;/li&gt;
&lt;li&gt;Ownership do código (longo prazo)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Achado direto ao caso: commit frequency e taxa de aceite de sugestão (o que o Spark Monitor já capta) cobrem apenas o fator de deployment — não medem tempo real gasto nem qualidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risco documentado&lt;/strong&gt;: ranking competitivo por atividade tende a empurrar devs júnior a confiar demais na IA, corroendo aprendizado e senso de ownership.&lt;/li&gt;
&lt;li&gt;Meta usa métrica própria, &lt;strong&gt;Diff Authoring Time (DAT)&lt;/strong&gt; — tempo real de autoria de um diff, sinal mais fino que token bruto (Beller et al. 2025).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gate de avaliação por LLM (se for implementado)
&lt;/h2&gt;

&lt;p&gt;Riscos documentados de usar um LLM como juiz de código:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Viés de verbosidade&lt;/strong&gt; — o juiz tende a preferir código/resposta mais longa, mesmo sem ganho real de conteúdo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autopreferência&lt;/strong&gt; — o modelo tende a preferir a própria saída/estilo (efeito de menor "perplexidade").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boa notícia&lt;/strong&gt;: em tarefas verificáveis (código com teste/build), a autopreferência tende a refletir qualidade real — diferente de tarefas subjetivas como chat/resumo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desenho recomendado — gate em 2 camadas:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Camada objetiva (sem viés): testes automatizados passam, build ok, lint/análise estática.&lt;/li&gt;
&lt;li&gt;Camada LLM-juiz: só para o que a camada objetiva não pega — legibilidade, aderência a padrão. Rubrica fixa, temperatura baixa, modelo juiz logado (idealmente diferente do modelo gerador). Calibrar periodicamente contra o rework rate real.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Mercado — não existe score pronto, mas existe a categoria
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitClear&lt;/strong&gt; — mede churn, duplicação, idade do código, atribuição IA vs. humano. ~US$15/contribuidor/mês.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DX&lt;/strong&gt; — feito pelos autores do SPACE e do DORA; lançou framework de IA dedicado em 2026 (utilização, impacto, custo).&lt;/li&gt;
&lt;li&gt;Nenhuma resolve o problema sozinha. A própria DX publicou (mar/2026) que DORA isolado não é suficiente para times usando IA.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dados já disponíveis para implementação
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Projeto&lt;/strong&gt;: campo &lt;code&gt;cwd&lt;/code&gt; presente em cada linha do JSONL de sessão do Claude Code (&lt;code&gt;~/.claude/projects/&amp;lt;cwd-codificado&amp;gt;/&amp;lt;uuid&amp;gt;.jsonl&lt;/code&gt; — no Windows, &lt;code&gt;%USERPROFILE%\.claude\projects\&lt;/code&gt;), mais &lt;code&gt;gitBranch&lt;/code&gt;. Já está no dado que o Spark Monitor lê.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push feito pela própria IA&lt;/strong&gt;: já registrado no mesmo JSONL, como &lt;code&gt;tool_use&lt;/code&gt;/&lt;code&gt;tool_result&lt;/code&gt; do Bash rodando &lt;code&gt;git push&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push manual do humano&lt;/strong&gt; (fora do Claude Code): não está no log do Claude Code. Requer hook git global (&lt;code&gt;git config --global core.hooksPath &amp;lt;pasta&amp;gt;&lt;/code&gt;, hook &lt;code&gt;pre-push&lt;/code&gt;) — cobre todos os repositórios de uma vez. Atenção: &lt;code&gt;pre-push&lt;/code&gt; confirma a intenção do push, não garante que a transferência de rede terminou com sucesso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atenção&lt;/strong&gt;: "subiu pro remoto" ≠ "foi pra produção". Confirmar deploy real exige integração com CI/CD.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Fontes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Acadêmico
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Chen et al., &lt;em&gt;"Beyond the Commit: Developer Perspectives on Productivity with AI Coding Assistants"&lt;/em&gt;, ICSE-SEIP 2026 — &lt;a href="https://arxiv.org/abs/2602.03593" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2602.03593&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wataoka et al., &lt;em&gt;"Self-Preference Bias in LLM-as-a-Judge"&lt;/em&gt; — &lt;a href="https://arxiv.org/html/2410.21819v1" rel="noopener noreferrer"&gt;https://arxiv.org/html/2410.21819v1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"Judging the Judges: A Systematic Evaluation of Bias Mitigation Strategies in LLM-as-a-Judge Pipelines"&lt;/em&gt; — &lt;a href="https://arxiv.org/pdf/2604.23178" rel="noopener noreferrer"&gt;https://arxiv.org/pdf/2604.23178&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"Do LLM Evaluators Prefer Themselves for a Reason?"&lt;/em&gt; (Univ. of Virginia, 2025) — &lt;a href="https://papers.lunadong.com/paper/6021" rel="noopener noreferrer"&gt;https://papers.lunadong.com/paper/6021&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DORA Research, &lt;em&gt;AI Capabilities Model&lt;/em&gt; — &lt;a href="https://dora.dev/research/ai/ai-capabilities-model" rel="noopener noreferrer"&gt;https://dora.dev/research/ai/ai-capabilities-model&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Indústria / mercado
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GetDX, &lt;em&gt;"How to Implement the AI Measurement Framework"&lt;/em&gt; — &lt;a href="https://getdx.com/blog/how-to-implement-ai-measurement-framework/" rel="noopener noreferrer"&gt;https://getdx.com/blog/how-to-implement-ai-measurement-framework/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitClear, estudo de churn/duplicação em código gerado por IA — via &lt;a href="https://arc.dev/talent-blog" rel="noopener noreferrer"&gt;https://arc.dev/talent-blog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Faros AI, &lt;em&gt;"AI Engineering Report 2026"&lt;/em&gt; — &lt;a href="https://www.faros.ai" rel="noopener noreferrer"&gt;https://www.faros.ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Documentação técnica Claude Code
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Formato JSONL de sessão — &lt;a href="https://claude-dev.tools/docs/jsonl-format"&gt;https://claude-dev.tools/docs/jsonl-format&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Local dos logs (&lt;code&gt;~/.claude/&lt;/code&gt;) — &lt;a href="https://claude-dev.tools/docs/log-locations"&gt;https://claude-dev.tools/docs/log-locations&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Template de Avaliação de IAs de Coding</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Wed, 01 Jul 2026 18:01:36 +0000</pubDate>
      <link>https://dev.to/diegobrandao/template-de-avaliacao-de-ias-de-coding-49fc</link>
      <guid>https://dev.to/diegobrandao/template-de-avaliacao-de-ias-de-coding-49fc</guid>
      <description>&lt;h2&gt;
  
  
  Resumo Executivo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;O que é este documento:&lt;/strong&gt; um modelo padronizado para avaliar, de forma comparável e replicável, a capacidade real de ferramentas de IA aplicadas a desenvolvimento (Codex, Devin, Claude e demais), identificando com precisão o que cada uma faz bem, faz mal, ou não faz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por que essa metodologia:&lt;/strong&gt; hoje o mercado divulga números de benchmarks públicos (como SWE-bench e Terminal-Bench) que servem como referência de capacidade geral, mas apresentam duas limitações relevantes para decisão de negócio:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Medem desempenho em projetos abertos de terceiros (majoritariamente Python), não refletem o comportamento em codebases proprietários, legados e no stack específico da empresa.&lt;/li&gt;
&lt;li&gt;O resultado divulgado depende fortemente da ferramenta usada em torno do modelo (a forma como a IA é operacionalizada), não só do modelo em si — comparações "cruas" entre fornecedores tendem a ser enganosas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por isso, este template combina três referências reconhecidas no mercado — benchmarks públicos como ponto de partida, uma métrica de escala de dificuldade usada por institutos de avaliação de IA (METR) para medir até onde a ferramenta aguenta, e uma estrutura de avaliação usada em processos de seleção corporativa de ferramentas de IA (dimensões como confiabilidade, rastreabilidade, segurança e custo real) — com um piloto controlado, executado sobre código real da nossa operação, com critério e revisor únicos para todas as ferramentas testadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resultado esperado:&lt;/strong&gt; uma matriz objetiva, com evidência documentada, que sustenta a recomendação de qual ferramenta adotar, para qual finalidade, e com quais limitações conhecidas.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Princípio metodológico:&lt;/strong&gt; o teste deve ser conduzido sobre uma tarefa real do backlog, nunca sobre um projeto de demonstração simplificado. A avaliação deve ser conduzida pelo mesmo revisor, com os mesmos critérios, para todas as ferramentas — garantindo comparabilidade.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Preparação do teste
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repositório real&lt;/strong&gt;, com código legado, particularidades e convenções próprias — não um projeto novo e simplificado. É diante da complexidade real que se evidenciam os limites de cada ferramenta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linha de base humana:&lt;/strong&gt; cronometrar quanto tempo um desenvolvedor Pleno leva para executar a mesma tarefa, como referência de comparação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revisor único:&lt;/strong&gt; mesma pessoa e mesmo critério de avaliação (checklist de PR) para todas as ferramentas testadas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repetição:&lt;/strong&gt; executar cada tarefa 2 a 3 vezes por ferramenta. O resultado de uma IA generativa varia entre execuções, mesmo para o mesmo pedido — uma única tentativa pode distorcer a avaliação.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Matriz de Capacidade por Ferramenta
&lt;/h2&gt;

&lt;p&gt;Escala: &lt;strong&gt;0&lt;/strong&gt; = não realiza | &lt;strong&gt;1&lt;/strong&gt; = realiza com baixa qualidade, exige reescrita | &lt;strong&gt;2&lt;/strong&gt; = realiza de forma razoável, exige ajustes | &lt;strong&gt;3&lt;/strong&gt; = realiza em nível pronto para PR&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capacidade avaliada&lt;/th&gt;
&lt;th&gt;Codex&lt;/th&gt;
&lt;th&gt;Devin&lt;/th&gt;
&lt;th&gt;Claude&lt;/th&gt;
&lt;th&gt;Outra&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Corrigir um bug simples em um único arquivo&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corrigir um bug que envolve múltiplos serviços simultaneamente&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alterar a assinatura de uma função e ajustar todos os pontos que a utilizam&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Criar um novo endpoint seguindo o padrão já existente no projeto&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reter contexto de uma decisão do projeto após reabertura de sessão&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responder "se eu alterar isso, o que mais é impactado?" apenas com análise, sem executar mudanças&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escrever testes que cobrem cenários relevantes, não apenas o caminho principal&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compreender uma dependência de um projeto que não está aberto no contexto atual&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seguir os padrões de arquitetura do time sem instrução repetida&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reconhecer limitação de conhecimento e solicitar mais contexto, em vez de gerar resposta incorreta com aparência de correta&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. Teste de Limite de Capacidade
&lt;/h2&gt;

&lt;p&gt;A dificuldade da tarefa deve ser escalonada progressivamente até que a ferramenta apresente falha — o objetivo é documentar em qual estágio cada uma deixa de performar de forma confiável:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tarefa de 1 arquivo, equivalente a menos de 30 min de trabalho humano&lt;/li&gt;
&lt;li&gt;Tarefa de 2 a 3 arquivos, equivalente a 1-2h de trabalho humano&lt;/li&gt;
&lt;li&gt;Tarefa que atravessa múltiplos serviços/repositórios, equivalente a meio dia de trabalho humano&lt;/li&gt;
&lt;li&gt;Tarefa sem especificação clara, que exige tomada de decisão de design, equivalente a um dia de trabalho humano&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Esta abordagem é baseada no conceito de &lt;strong&gt;Time Horizon&lt;/strong&gt;, métrica usada pelo instituto de pesquisa&lt;br&gt;
METR para medir não "se a IA acerta", mas até qual complexidade/duração de tarefa humana a ferramenta&lt;br&gt;
ainda mantém taxa de sucesso aceitável. Identificar o estágio em que cada ferramenta falha fornece&lt;br&gt;
mais informação para decisão do que uma nota única.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Critérios Corporativos Complementares
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimensão&lt;/th&gt;
&lt;th&gt;Critério de avaliação&lt;/th&gt;
&lt;th&gt;Codex&lt;/th&gt;
&lt;th&gt;Devin&lt;/th&gt;
&lt;th&gt;Claude&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Consistência&lt;/td&gt;
&lt;td&gt;O resultado varia significativamente entre execuções para o mesmo pedido?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rastreabilidade&lt;/td&gt;
&lt;td&gt;É possível identificar posteriormente qual ferramenta/versão gerou cada alteração?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retenção de contexto&lt;/td&gt;
&lt;td&gt;A ferramenta compreende o projeto como um todo ou apenas o que está aberto no momento?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reversibilidade&lt;/td&gt;
&lt;td&gt;Em caso de erro, é possível reverter apenas a alteração específica, ou o impacto se espalha por múltiplos arquivos?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Segurança da informação&lt;/td&gt;
&lt;td&gt;Onde o código é processado/armazenado? Há uso do código para treinamento de modelo?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custo real&lt;/td&gt;
&lt;td&gt;Qual o tempo de revisão humana efetivamente economizado, descontado o tempo gasto em correções?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5. Ressalvas Metodológicas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A camada de operacionalização (produto) tem tanto peso quanto o modelo em si.&lt;/strong&gt; O mesmo modelo (ex.: Claude) executado por diferentes produtos pode apresentar resultados distintos. Recomenda-se registrar não apenas "qual IA", mas "qual IA, em qual produto".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benchmarks públicos não são preditivos do caso de uso específico.&lt;/strong&gt; Os benchmarks de mercado avaliam majoritariamente projetos abertos em Python; não refletem o comportamento em ambiente Java de fintech legado, com Kafka e IBM MQ. Devem ser tratados como referência geral, não como critério de decisão.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Números divulgados por fornecedores devem ser tratados com cautela&lt;/strong&gt;, especialmente quando não há metodologia reprodutível associada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demonstração de fornecedor não equivale a piloto controlado.&lt;/strong&gt; O cenário apresentado em demonstrações tende a ser favorável (projeto simples e recente). A avaliação deve ocorrer sobre código real da operação, incluindo débito técnico.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O custo oculto deve ser mensurado.&lt;/strong&gt; Tempo adicional de revisão sênior para correção do que foi gerado pela IA é custo, não apenas o tempo nominal economizado — deve compor o cálculo final de ganho de produtividade.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Prompts Padronizados para Execução dos Testes
&lt;/h2&gt;

&lt;p&gt;Recomenda-se aplicar os mesmos prompts (ajustando apenas nome de arquivo/função) em Codex, Devin e Claude, garantindo comparabilidade entre os testes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Correção de bug simples (1 arquivo)&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"No arquivo &lt;code&gt;[caminho]&lt;/code&gt;, o teste &lt;code&gt;[nome do teste]&lt;/code&gt; está falhando. Investigue a causa e corrija, sem alterar o comportamento esperado do teste."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Correção de bug cross-service&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"O serviço &lt;code&gt;[A]&lt;/code&gt; está retornando erro quando chama &lt;code&gt;[B]&lt;/code&gt;. Rastreie o fluxo completo entre os dois serviços, identifique a origem do problema e proponha a correção. Antes de editar, indique quais arquivos pretende alterar."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Análise de impacto de mudança de assinatura&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Quero alterar a assinatura do método &lt;code&gt;[nome]&lt;/code&gt; de &lt;code&gt;[assinatura atual]&lt;/code&gt; para &lt;code&gt;[nova assinatura]&lt;/code&gt;. Antes de qualquer alteração, liste todos os pontos do projeto que chamam esse método e o que será impactado."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Aderência a padrão existente&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Crie um novo endpoint &lt;code&gt;[descrição]&lt;/code&gt; seguindo exatamente o mesmo padrão de arquitetura, nomenclatura e tratamento de erro já utilizado nos demais endpoints deste projeto. Não introduza um padrão novo."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Retenção de contexto (executar em sessão nova)&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Sem que eu forneça o contexto novamente: qual é a convenção que este projeto utiliza para tratamento de exceções? E para nomenclatura de branches?"&lt;br&gt;
&lt;em&gt;(aplica-se quando a ferramenta possui memória entre sessões — caso ela solicite o contexto de volta, esse já é um dado relevante sobre sua limitação)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Reconhecimento de limitação de conhecimento&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Implemente &lt;code&gt;[funcionalidade dependente de uma biblioteca ou API que você sabe que não existe ou mudou recentemente]&lt;/code&gt;."&lt;br&gt;
&lt;em&gt;Objetivo: verificar se a ferramenta sinaliza incerteza, ou gera código plausível porém incorreto.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Análise sem execução&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Não realize nenhuma alteração ainda. Apenas explique: se eu alterar o tipo de retorno de &lt;code&gt;[função]&lt;/code&gt; de &lt;code&gt;X&lt;/code&gt; para &lt;code&gt;Y&lt;/code&gt;, o que é impactado no projeto?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Cobertura de teste&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Escreva testes unitários para &lt;code&gt;[classe/função]&lt;/code&gt;. Inclua ao menos um cenário de borda não óbvio — entrada nula, lista vazia, concorrência ou timeout."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Teste de limite de complexidade (estágio 4 da seção 3)&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Preciso de &lt;code&gt;[funcionalidade nova, sem especificação detalhada, que exige decisão de design]&lt;/code&gt;. Propositalmente não fornecerei todos os detalhes — faça as perguntas que considerar necessárias antes de iniciar a implementação."&lt;br&gt;
&lt;em&gt;Objetivo: verificar se a ferramenta solicita esclarecimento antes de agir, ou avança sobre premissas não validadas.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Fontes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SWE-bench / SWE-bench Verified / Pro — arxiv.org/pdf/2509.16941, swebench.com&lt;/li&gt;
&lt;li&gt;Terminal-Bench 2.1 — tbench.ai, arxiv.org/html/2601.11868v1&lt;/li&gt;
&lt;li&gt;METR Time Horizon — metr.org/time-horizons, arxiv.org/html/2503.14499v1&lt;/li&gt;
&lt;li&gt;Checklist enterprise 6 dimensões (adaptado) — augmentcode.com/guides/cto-ai-coding-checklist&lt;/li&gt;
&lt;li&gt;Pilot enterprise (metodologia de rollout) — lumenalta.com/insights/how-to-evaluate-ai-coding-tools-for-enterprise-teams&lt;/li&gt;
&lt;li&gt;Governança de benchmarks / harness effect — digitalapplied.com/blog/swe-bench-terminal-bench-benchmark-guide-2026&lt;/li&gt;
&lt;li&gt;Devin SWE-bench technical report — cognition.ai/blog/swe-bench-technical-report&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>coding</category>
      <category>softwaredevelopment</category>
      <category>testing</category>
    </item>
    <item>
      <title>JIT Compilation — Guia Didático</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Tue, 09 Jun 2026 01:55:42 +0000</pubDate>
      <link>https://dev.to/diegobrandao/jit-compilation-guia-didatico-54h4</link>
      <guid>https://dev.to/diegobrandao/jit-compilation-guia-didatico-54h4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O que você vai aprender:&lt;/strong&gt;&lt;br&gt;
Como a JVM decide o que compilar e quando · A diferença real entre C1 e C2 · O que é o Code Cache e por que ele pode derrubar sua performance · GraalVM: JIT vs Native Image · Project Leyden: como o Java 25 resolve o warmup de vez&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Índice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
1. O Problema Original

&lt;ul&gt;
&lt;li&gt;A cena que todo dev Java já viveu&lt;/li&gt;
&lt;li&gt;Comparativo das abordagens&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
2. Just-In-Time Compilation

&lt;ul&gt;
&lt;li&gt;O processo completo de um método na JVM&lt;/li&gt;
&lt;li&gt;Fluxo visual&lt;/li&gt;
&lt;li&gt;Por que a compilação não trava a aplicação&lt;/li&gt;
&lt;li&gt;Deoptimização — o que o curso não menciona&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
3. Os Dois Compiladores: C1 e C2

&lt;ul&gt;
&lt;li&gt;Otimizações que o C2 aplica e o C1 não consegue&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
4. Code Cache

&lt;ul&gt;
&lt;li&gt;Tamanhos padrão por versão&lt;/li&gt;
&lt;li&gt;O aviso mais temido em produção&lt;/li&gt;
&lt;li&gt;Flags essenciais para diagnóstico e tuning&lt;/li&gt;
&lt;li&gt;Detalhe importante sobre o CompileThreshold&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
5. GraalVM

&lt;ul&gt;
&lt;li&gt;5.1 Graal JIT — substituto do C2&lt;/li&gt;
&lt;li&gt;5.2 Native Image — AOT total&lt;/li&gt;
&lt;li&gt;Comparativo: JIT clássico vs GraalVM Native Image&lt;/li&gt;
&lt;li&gt;Por que Native Image tem peak performance menor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
6. Project Leyden

&lt;ul&gt;
&lt;li&gt;Como funciona — em dois passos&lt;/li&gt;
&lt;li&gt;Linha do tempo dos JEPs do Leyden&lt;/li&gt;
&lt;li&gt;Comparativo final: os três mundos&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
7. Quando Parar de se Preocupar com Warmup

&lt;ul&gt;
&lt;li&gt;Resposta direta: Java 25+&lt;/li&gt;
&lt;li&gt;Contexto prático para Kubernetes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
8. Linha do Tempo e Resumo Executivo

&lt;ul&gt;
&lt;li&gt;Evolução completa da performance JVM&lt;/li&gt;
&lt;li&gt;Resumo executivo — referência rápida&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
9. GraalVM vs sem GraalVM — análise com dados reais

&lt;ul&gt;
&lt;li&gt;O que os dados dizem sobre adoção em produção&lt;/li&gt;
&lt;li&gt;Cenário 1 — Sem GraalVM: HotSpot JIT puro&lt;/li&gt;
&lt;li&gt;Cenário 2 — GraalVM modo JIT&lt;/li&gt;
&lt;li&gt;Cenário 3 — GraalVM Native Image&lt;/li&gt;
&lt;li&gt;Decisão rápida&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Referências Bibliográficas&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Seção 1 — O Problema Original
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Por que o Java era lento e, como ele resolveu isso&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  A cena que todo dev Java já viveu
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Você mede a performance de um método logo que a aplicação sobe: &lt;strong&gt;200ms&lt;/strong&gt;.&lt;br&gt;
Mede de novo 30 segundos depois: &lt;strong&gt;8ms&lt;/strong&gt;.&lt;br&gt;
O que aconteceu? A aplicação estava "esquentando".&lt;br&gt;
Isso tem nome, tem mecanismo e, a partir do Java 25, tem solução definitiva.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Java compila código-fonte (&lt;code&gt;.java&lt;/code&gt;) para &lt;strong&gt;bytecode&lt;/strong&gt; (&lt;code&gt;.class&lt;/code&gt;) — um formato intermediário, agnóstico de plataforma. A JVM interpreta esse bytecode em qualquer máquina. Isso é o famoso &lt;em&gt;write once, run anywhere&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O custo: interpretação instrução por instrução é lenta. Em 1996, Java rodava &lt;strong&gt;10 a 20× mais lento&lt;/strong&gt; que C.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparativo das abordagens
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abordagem&lt;/th&gt;
&lt;th&gt;Portabilidade&lt;/th&gt;
&lt;th&gt;Performance&lt;/th&gt;
&lt;th&gt;Exemplo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compilado nativo&lt;/td&gt;
&lt;td&gt;❌ Binário por SO&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ Máxima&lt;/td&gt;
&lt;td&gt;C / C++&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interpretado puro&lt;/td&gt;
&lt;td&gt;✅ Bytecode universal&lt;/td&gt;
&lt;td&gt;⭐ Baixa&lt;/td&gt;
&lt;td&gt;Java 1.0 (1996)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JIT — híbrido&lt;/td&gt;
&lt;td&gt;✅ Bytecode universal&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ Alta&lt;/td&gt;
&lt;td&gt;Java 1.3+ (2000)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AOT Cache (Leyden)&lt;/td&gt;
&lt;td&gt;✅ Bytecode universal&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ Alta + startup rápido&lt;/td&gt;
&lt;td&gt;Java 24+ (2024)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;A pergunta que originou o JIT:&lt;/strong&gt; e se a JVM pudesse &lt;strong&gt;aprender enquanto roda&lt;/strong&gt; quais partes merecem ser compiladas para código nativo — sem abrir mão da portabilidade?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Seção 2 — Just-In-Time Compilation
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Como a JVM observa, decide e compila em tempo real&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O JIT é o mecanismo pelo qual a HotSpot JVM &lt;strong&gt;observa o código em execução&lt;/strong&gt; e, quando identifica trechos chamados com frequência (&lt;em&gt;hot spots&lt;/em&gt;), os compila para código de máquina nativo — em uma thread separada, sem parar a aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  O processo completo de um método na JVM
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Passo 1 — Execução interpretada (Tier 0)
&lt;/h4&gt;

&lt;p&gt;A JVM começa interpretando o bytecode linha a linha. Lento, mas funciona imediatamente. Ao mesmo tempo, dois contadores são incrementados por método:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Method invocation count&lt;/strong&gt; — quantas vezes o método foi chamado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loop back-edge count&lt;/strong&gt; — quantas vezes os loops do método executaram&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Passo 2 — Compilação pelo C1, rápida e com profiling (Tiers 1–3)
&lt;/h4&gt;

&lt;p&gt;Quando os contadores cruzam o &lt;code&gt;Tier3CompileThreshold&lt;/code&gt; (padrão: &lt;strong&gt;2.000 invocações&lt;/strong&gt;), o método entra na fila JIT. O compilador C1 gera código nativo rapidamente e continua coletando dados de comportamento (profiling). A aplicação já roda mais rápido, mas ainda não no máximo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo 3 — Compilação pelo C2, otimização agressiva (Tier 4)
&lt;/h4&gt;

&lt;p&gt;Quando o método atinge o &lt;code&gt;Tier4CompileThreshold&lt;/code&gt; (padrão: &lt;strong&gt;15.000 invocações&lt;/strong&gt;), o C2 entra em ação. Ele usa os dados de profiling do C1 para aplicar otimizações impossíveis de fazer sem observar o comportamento real: inlining, devirtualization, escape analysis e muito mais.&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo 4 — Armazenamento no Code Cache
&lt;/h4&gt;

&lt;p&gt;O código nativo compilado pelo C2 vai para o &lt;strong&gt;Code Cache&lt;/strong&gt; — uma região especial da memória fora do heap. A partir daí, o método roda na velocidade máxima possível, sem interpretação, sem compilação, sem overhead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fluxo visual
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐     ┌──────────────────┐     ┌─────────────────┐     ┌──────────────┐
│   TIER 0    │ ──► │   TIERS 1 – 3    │ ──► │    TIER 4       │ ──► │  CODE CACHE  │
│             │     │                  │     │                 │     │              │
│ Interpretado│     │ C1 compila       │     │ C2 otimiza      │     │ Nativo em    │
│ puro        │     │ + coleta         │     │ agressivamente  │     │ memória      │
│             │     │ profiling        │     │                 │     │ especial     │
└─────────────┘     └──────────────────┘     └─────────────────┘     └──────────────┘
    Lento               Rápido                   Máximo                Ultra-rápido
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;O símbolo &lt;code&gt;%&lt;/code&gt; no output de &lt;code&gt;-XX:+PrintCompilation&lt;/code&gt; indica que o método está no Code Cache — o estado mais otimizado possível.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Por que a compilação não trava a aplicação?
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ A fila JIT e os compiladores rodam em &lt;strong&gt;threads separadas&lt;/strong&gt;. Enquanto um método está sendo compilado pelo C2, a JVM continua usando a versão C1 (ou interpretada) para atender requests. Quando a versão C2 fica pronta, a JVM faz o swap automaticamente — transparente para você.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ⚠️ Deoptimização — o que o curso não menciona
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ O C2 faz otimizações &lt;strong&gt;especulativas&lt;/strong&gt; baseadas no que observou até agora. Se o comportamento mudar (ex: um método que era sempre chamado com &lt;code&gt;Integer&lt;/code&gt; agora recebe &lt;code&gt;String&lt;/code&gt;), a JVM pode &lt;strong&gt;deoptimizar&lt;/strong&gt; o método — jogar fora a versão C2 e voltar para o C1 ou interpretado. Esse ciclo pode se repetir. Em produção, deoptimizações frequentes aparecem nos logs JIT como &lt;code&gt;made not entrant&lt;/code&gt; e são sinais de código com comportamento inconsistente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Seção 3 — Os Dois Compiladores: C1 e C2
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Filosofias opostas, usadas na ordem certa&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;C1 — Client Compiler&lt;/th&gt;
&lt;th&gt;C2 — Server Compiler&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tiers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1, 2, 3&lt;/td&gt;
&lt;td&gt;4 exclusivamente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Filosofia&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compila RÁPIDO, otimiza POUCO&lt;/td&gt;
&lt;td&gt;Compila DEVAGAR, otimiza MUITO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tempo de startup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Excelente&lt;/td&gt;
&lt;td&gt;Ruim isolado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Peak performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Boa&lt;/td&gt;
&lt;td&gt;Máxima&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coleta profiling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sim (tier 3)&lt;/td&gt;
&lt;td&gt;Usa o que o C1 coletou&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Escrito em&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;C++ (HotSpot) / Java (Graal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Caso ideal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apps curta duração, CLIs&lt;/td&gt;
&lt;td&gt;APIs, servidores, microsserviços&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;Analogia:&lt;/strong&gt; C1 é o mecânico que faz uma regulagem rápida para você sair logo. C2 é o engenheiro de F1 que passa a noite otimizando cada componente. A &lt;strong&gt;Tiered Compilation&lt;/strong&gt; usa os dois na ordem certa, sem que você precise decidir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Otimizações que o C2 aplica e o C1 não consegue
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Method Inlining
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes — chamada separada com overhead&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Depois — C2 inlina o corpo diretamente&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// chamada eliminada&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Elimina o overhead de chamada de método em hot paths. É a otimização mais impactante do C2.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  2. Escape Analysis
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes — parece precisar de alocação no heap&lt;/span&gt;
&lt;span class="nc"&gt;Point&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Depois — C2 detecta que p não escapa do método&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// objeto eliminado, zero alocação&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Se o objeto não sai do método, C2 pode alocar na stack ou eliminar completamente. Reduz pressão no GC.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  3. Devirtualization
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes — polimórfico: qual método chamar?&lt;/span&gt;
&lt;span class="n"&gt;animal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sound&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Dog? Cat? Bird?&lt;/span&gt;

&lt;span class="c1"&gt;// Depois — C2 observou: 99% das vezes é Dog&lt;/span&gt;
&lt;span class="n"&gt;dog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sound&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// chamada direta + inlining&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Se 99% das chamadas são para o mesmo tipo concreto, C2 inlina esse tipo e adiciona um guard raro.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  4. Loop Unrolling
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes — loop com overhead de controle&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// Depois — C2 desenrola o loop&lt;/span&gt;
&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Reduz iterações, habilita vetorização SIMD e elimina o custo do contador de loop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  5. Dead Code Elimination
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="no"&gt;DEBUG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;DEBUG&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;trace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"calculando..."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// nunca vai rodar&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Depois — C2 remove o bloco morto completamente&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  6. Range Check Elimination
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes — Java verifica bounds a cada acesso&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;  &lt;span class="c1"&gt;// arr[i] verifica bounds toda vez&lt;/span&gt;

&lt;span class="c1"&gt;// Depois — C2 prova que o índice é sempre válido&lt;/span&gt;
&lt;span class="c1"&gt;// verificação eliminada no loop quente&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Seção 4 — Code Cache
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A região de memória que faz tudo isso funcionar e, que pode te trair&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Após compilação pelo C2, o código nativo vai para o &lt;strong&gt;Code Cache&lt;/strong&gt; — uma região de memória fora do heap Java, gerenciada separadamente. Métodos no Code Cache são executados diretamente pelo processador, sem qualquer overhead de interpretação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tamanhos padrão por versão
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Versão Java&lt;/th&gt;
&lt;th&gt;Tamanho padrão&lt;/th&gt;
&lt;th&gt;Observação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Java ≤ 7 (32-bit)&lt;/td&gt;
&lt;td&gt;32 MB&lt;/td&gt;
&lt;td&gt;JVM 32-bit — removida no JDK 24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java ≤ 7 (64-bit)&lt;/td&gt;
&lt;td&gt;48 MB&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 8+ (64-bit)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;240 MB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Padrão atual — adequado para a maioria&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ❌ O aviso mais temido em produção
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CodeCache is full. Compiler has been disabled.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A aplicação &lt;strong&gt;não cai&lt;/strong&gt;. Mas o JIT para. Novos métodos não são compilados. Métodos podem ser desalojados e recompilados em loop. Performance degrada silenciosamente e, sem esse aviso nos logs, você não vai saber por quê.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flags essenciais para diagnóstico e tuning
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ver o que está sendo compilado em tempo real&lt;/span&gt;
&lt;span class="nt"&gt;-XX&lt;/span&gt;:+PrintCompilation

&lt;span class="c"&gt;# Inspecionar tamanho atual do Code Cache&lt;/span&gt;
&lt;span class="nt"&gt;-XX&lt;/span&gt;:+PrintCodeCache

&lt;span class="c"&gt;# Log completo para arquivo (útil em servidores remotos)&lt;/span&gt;
&lt;span class="nt"&gt;-XX&lt;/span&gt;:+UnlockDiagnosticVMOptions &lt;span class="nt"&gt;-XX&lt;/span&gt;:+LogCompilation

&lt;span class="c"&gt;# Ajustar tamanho máximo do Code Cache&lt;/span&gt;
&lt;span class="nt"&gt;-XX&lt;/span&gt;:ReservedCodeCacheSize&lt;span class="o"&gt;=&lt;/span&gt;256m

&lt;span class="c"&gt;# Threads de compilação (1/3 para C1, 2/3 para C2)&lt;/span&gt;
&lt;span class="nt"&gt;-XX&lt;/span&gt;:CICompilerCount&lt;span class="o"&gt;=&lt;/span&gt;6

&lt;span class="c"&gt;# Threshold de invocações (só funciona sem Tiered Compilation)&lt;/span&gt;
&lt;span class="nt"&gt;-XX&lt;/span&gt;:CompileThreshold&lt;span class="o"&gt;=&lt;/span&gt;10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚠️ Detalhe importante sobre o CompileThreshold
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;O &lt;code&gt;-XX:CompileThreshold=10000&lt;/code&gt; é amplamente citado mas &lt;strong&gt;quase nunca é o que a JVM usa&lt;/strong&gt;. Com Tiered Compilation ativa (padrão desde o Java 8), a JVM usa thresholds por tier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Tier3CompileThreshold = 2.000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Tier4CompileThreshold = 15.000&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;code&gt;CompileThreshold&lt;/code&gt; genérico só é relevante quando você &lt;strong&gt;desativa&lt;/strong&gt; a Tiered Compilation com &lt;code&gt;-XX:-TieredCompilation&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Seção 5 — GraalVM
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Um terceiro compilador e, uma alternativa radical ao JIT&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O GraalVM não é "só uma JVM mais rápida". É uma plataforma com &lt;strong&gt;duas abordagens fundamentalmente diferentes&lt;/strong&gt; — que você precisa entender separadamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1 Graal JIT — substituto do C2, mesmo modelo JIT
&lt;/h3&gt;

&lt;p&gt;O compilador Graal pode substituir o C2 dentro da HotSpot JVM usando a interface &lt;strong&gt;JVMCI&lt;/strong&gt; (disponível desde o Java 9). Nesse modo, tudo continua igual: Tiered Compilation, Code Cache, profiling só o compilador do tier 4 muda.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-XX&lt;/span&gt;:+UseJVMCICompiler    &lt;span class="c"&gt;# ativa o Graal JIT no lugar do C2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Graal JIT é escrito em &lt;strong&gt;Java&lt;/strong&gt; (não em C++ como o C2), o que permite otimizações mais sofisticadas e facilita evolução. Em benchmarks específicos, ele supera o C2 em throughput de pico.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 Native Image — AOT total, sem JVM em runtime
&lt;/h3&gt;

&lt;p&gt;A opção mais radical do GraalVM: compilação &lt;strong&gt;AOT (Ahead-Of-Time) completa&lt;/strong&gt;. O bytecode vira um executável nativo antes da execução. Não há JVM em runtime. Não há JIT. Não há warmup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Gerar executável nativo&lt;/span&gt;
native-image &lt;span class="nt"&gt;-jar&lt;/span&gt; minha-aplicacao.jar

&lt;span class="c"&gt;# Resultado: binário nativo (~50ms startup, memória mínima)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Comparativo: JIT clássico vs GraalVM Native Image
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;JIT (HotSpot padrão)&lt;/th&gt;
&lt;th&gt;GraalVM Native Image&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Startup&lt;/td&gt;
&lt;td&gt;Segundos (warmup necessário)&lt;/td&gt;
&lt;td&gt;~50ms (instantâneo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak performance&lt;/td&gt;
&lt;td&gt;Máxima — C2 adaptativo&lt;/td&gt;
&lt;td&gt;Inferior — sem JIT em runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uso de memória&lt;/td&gt;
&lt;td&gt;Maior (JVM + heap)&lt;/td&gt;
&lt;td&gt;Muito menor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reflexão dinâmica&lt;/td&gt;
&lt;td&gt;✅ Suportada nativamente&lt;/td&gt;
&lt;td&gt;⚠️ Requer &lt;code&gt;reflect-config.json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spring Boot simples&lt;/td&gt;
&lt;td&gt;✅ Funciona out of the box&lt;/td&gt;
&lt;td&gt;✅ Funciona (GraalVM plugin)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spring Boot complexo&lt;/td&gt;
&lt;td&gt;✅ Funciona sempre&lt;/td&gt;
&lt;td&gt;⚠️ Pode precisar de ajustes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caso ideal&lt;/td&gt;
&lt;td&gt;APIs, microsserviços com estado&lt;/td&gt;
&lt;td&gt;Serverless, CLIs, functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build time&lt;/td&gt;
&lt;td&gt;Padrão&lt;/td&gt;
&lt;td&gt;Muito mais longa (5–15 min)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ❌ Por que Native Image tem peak performance menor?
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;O JIT é &lt;strong&gt;adaptativo&lt;/strong&gt;: ele observa o comportamento real em runtime e aplica otimizações especulativas baseadas nesse comportamento. O Native Image compila tudo &lt;strong&gt;antes&lt;/strong&gt;, sem dados de runtime. Otimizações como devirtualization especulativa e inlining agressivo de chamadas polimórficas ficam comprometidas. Para cargas variáveis e código polimórfico, o C2 vence no longo prazo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Seção 6 — Project Leyden
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A solução definitiva para o warmup — sem abrir mão do JIT&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O warmup do JIT sempre foi o calcanhar de Aquiles do Java em ambientes cloud-native. Containers que sobem a cada scale-out, funções serverless, pods Kubernetes, todos começam do zero, sem cache JIT. O Project Leyden resolve isso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como funciona — em dois passos
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Passo 1 — Training Run (executado uma única vez)
&lt;/h4&gt;

&lt;p&gt;A JVM roda a aplicação normalmente e salva em um arquivo &lt;code&gt;.aot&lt;/code&gt; tudo que normalmente faria no startup e warmup: classes carregadas e linkadas, perfis de invocação, código JIT compilado para os hot spots identificados.&lt;/p&gt;

&lt;h4&gt;
  
  
  Passo 2 — Execuções de Produção (usam o cache)
&lt;/h4&gt;

&lt;p&gt;Todos os starts subsequentes carregam o cache. Classes já linkadas, hot spots já identificados, código C2 já compilado para os métodos críticos. A aplicação começa com &lt;strong&gt;performance de pico desde o primeiro request&lt;/strong&gt; — sem warmup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Passo 1: Training run (uma vez, fora de produção)&lt;/span&gt;
java &lt;span class="nt"&gt;-XX&lt;/span&gt;:AOTCacheOutput&lt;span class="o"&gt;=&lt;/span&gt;app.aot &lt;span class="nt"&gt;-jar&lt;/span&gt; app.jar

&lt;span class="c"&gt;# Passo 2: Todas as execuções em produção&lt;/span&gt;
java &lt;span class="nt"&gt;-XX&lt;/span&gt;:AOTCache&lt;span class="o"&gt;=&lt;/span&gt;app.aot &lt;span class="nt"&gt;-jar&lt;/span&gt; app.jar

&lt;span class="c"&gt;# Spring Boot 3.3+ já integra esse workflow nativamente&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Linha do tempo dos JEPs do Leyden
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Versão&lt;/th&gt;
&lt;th&gt;Ano&lt;/th&gt;
&lt;th&gt;JEP&lt;/th&gt;
&lt;th&gt;O que entrega&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JDK 24&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;JEP 483&lt;/td&gt;
&lt;td&gt;AOT Class Loading &amp;amp; Linking — classes pre-carregadas. Spring PetClinic &lt;strong&gt;42% mais rápido&lt;/strong&gt; no startup.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JDK 25&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2025&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;JEP 515&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AOT Method Profiling — perfis JIT no cache. Warmup praticamente eliminado.&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JDK 26&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;JEP 516&lt;/td&gt;
&lt;td&gt;Cache universal, agnóstico de GC. Suporte a ZGC e Shenandoah. Cache baseline incluído no JDK — zero config.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Comparativo final: os três mundos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────┬────────────────────────────┬──────────────────────────┐
│    JIT CLÁSSICO          │   GRAALVM NATIVE IMAGE     │   PROJECT LEYDEN         │
│    (HotSpot)             │                            │   (JDK 25+)              │
├──────────────────────────┼────────────────────────────┼──────────────────────────┤
│ ✓ Portabilidade total    │ ✓ Startup instantâneo      │ ✓ Startup ~42% mais      │
│ ✓ Peak performance max   │ ✓ Memória mínima           │   rápido                 │
│ ✓ Reflexão dinâmica      │ ✓ Ideal para serverless    │ ✓ Warmup eliminado       │
│ ✓ Sem mudanças no código │                            │ ✓ Peak performance max   │
│                          │ ✗ Sem JIT em runtime       │ ✓ Reflexão dinâmica      │
│ ✗ Startup lento          │ ✗ Peak performance menor   │ ✓ Sem mudanças no código │
│ ✗ Warmup (código frio)   │ ✗ Reflexão = config manual │                          │
│                          │ ✗ Build demorada           │ ✗ Requer training run    │
└──────────────────────────┴────────────────────────────┴──────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ A frase que resume tudo
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;GraalVM Native Image &lt;strong&gt;substitui&lt;/strong&gt; o JIT — você abre mão de otimizações adaptativas em troca de startup instantâneo.&lt;/p&gt;

&lt;p&gt;Project Leyden &lt;strong&gt;preserva&lt;/strong&gt; o JIT — você tem startup rápido &lt;strong&gt;e&lt;/strong&gt; peak performance máxima, sem abrir mão de nada.&lt;/p&gt;

&lt;p&gt;Para sistemas bancários com Spring Boot, Hibernate e cargas variáveis, &lt;strong&gt;Leyden é a resposta certa&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Seção 7 — Quando Parar de se Preocupar com Warmup
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A resposta direta, versão por versão&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Versão&lt;/th&gt;
&lt;th&gt;O que muda&lt;/th&gt;
&lt;th&gt;Impacto real no warmup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Java 8&lt;/td&gt;
&lt;td&gt;Tiered Compilation padrão&lt;/td&gt;
&lt;td&gt;JIT mais inteligente. Warmup ainda existe, mas bem gerenciado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 11&lt;/td&gt;
&lt;td&gt;AppCDS estável&lt;/td&gt;
&lt;td&gt;Startup ~10–20% mais rápido. Warmup JIT inalterado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 17&lt;/td&gt;
&lt;td&gt;AppCDS aprimorado + ZGC estável&lt;/td&gt;
&lt;td&gt;Startup melhorado. Warmup JIT inalterado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 21&lt;/td&gt;
&lt;td&gt;Virtual Threads estáveis&lt;/td&gt;
&lt;td&gt;⚠️ NÃO resolve warmup. Resolve throughput I/O-bound. São problemas diferentes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 24&lt;/td&gt;
&lt;td&gt;Leyden: AOT Class Loading&lt;/td&gt;
&lt;td&gt;Startup 40%+ mais rápido. Warmup parcialmente melhorado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Java 25&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Leyden: AOT Method Profiling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;✅ WARMUP PRATICAMENTE ELIMINADO.&lt;/strong&gt; JIT começa otimizando do primeiro request.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 26&lt;/td&gt;
&lt;td&gt;AOT Cache universal + ZGC&lt;/td&gt;
&lt;td&gt;Zero configuração extra. Cache baseline no JDK. Solução madura e completa.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ✅ Resposta direta: Java 25+ com AOT Method Profiling (JEP 515)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;A partir do &lt;strong&gt;Java 25&lt;/strong&gt;, o warmup do JIT deixa de ser uma preocupação para a grande maioria das aplicações. O AOT Cache armazena os perfis de execução dos métodos quentes, permitindo que o C2 compile os hot spots imediatamente no startup, sem precisar observar execuções repetidas. Para quem usa Spring Boot 3.3+, o suporte já está integrado com configuração mínima.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Contexto prático para Kubernetes e auto-scaling
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sem Leyden:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada novo pod sobe sem cache JIT&lt;/li&gt;
&lt;li&gt;Os primeiros requests recebem latências elevadas&lt;/li&gt;
&lt;li&gt;Em ambientes com escala horizontal frequente, isso impacta diretamente o p95 e p99 de latência&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Com Leyden (JDK 25+):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O pod sobe com o AOT Cache&lt;/li&gt;
&lt;li&gt;Hot spots já identificados, código C2 já compilado&lt;/li&gt;
&lt;li&gt;Performance de pico desde o primeiro request&lt;/li&gt;
&lt;li&gt;O AOT Cache pode ser incluído na imagem Docker — sem step extra em runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Para ambientes bancários com Spring Boot + Kubernetes:&lt;/strong&gt; JDK 25 com AOT Method Profiling é o caminho. Não exige mudanças no código, preserva todo o ecossistema Spring, mantém a performance máxima do C2 e elimina o problema de cold start que existe hoje.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Seção 8 — Linha do Tempo e Resumo Executivo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Evolução completa da performance JVM
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Versão&lt;/th&gt;
&lt;th&gt;Ano&lt;/th&gt;
&lt;th&gt;Marco&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Java 1.0&lt;/td&gt;
&lt;td&gt;1996&lt;/td&gt;
&lt;td&gt;Interpretado puro — 10–20× mais lento que C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 1.1&lt;/td&gt;
&lt;td&gt;1997&lt;/td&gt;
&lt;td&gt;Primeiro JIT experimental — ainda muito básico&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 1.3&lt;/td&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;HotSpot JVM como padrão — JIT adaptativo com C1 e C2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 7&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;Tiered Compilation disponível como opção&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 8&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;Tiered Compilation &lt;strong&gt;padrão&lt;/strong&gt; — C1+C2 automático&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 9&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;JVMCI: suporte ao Graal JIT como alternativa ao C2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 11&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;AppCDS estável — startup melhorado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 21&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;Virtual Threads estáveis — throughput I/O-bound resolvido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 24&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Project Leyden: AOT Class Loading — startup 42% mais rápido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Java 25&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2025&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Project Leyden: AOT Method Profiling — warmup eliminado na prática&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 26&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;AOT Cache universal + ZGC — solução madura e completa&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Resumo executivo — referência rápida
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Conceito&lt;/th&gt;
&lt;th&gt;O que você precisa saber&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JIT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A JVM compila hot spots para código nativo em runtime, em thread separada, sem parar a aplicação.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hot spot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Método com alto número de invocações ou iterações de loop — candidato à compilação JIT.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;C1 (tiers 1–3)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compila rápido com otimizações básicas. Coleta profiling para o C2.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;C2 (tier 4)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compila profundo com otimizações agressivas: inlining, escape analysis, devirtualization, loop unrolling.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tiered Compilation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Estratégia padrão desde Java 8: usa C1 primeiro (startup rápido) e C2 depois (peak performance).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Cache&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Região de memória onde vive o código nativo compilado. 240 MB padrão no Java 8+. Cheio = problema grave.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deoptimização&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JVM joga fora a versão C2 se o comportamento mudar. Normal, mas frequência alta indica código inconsistente.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Graal JIT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Substituto do C2 escrito em Java. Mesmo modelo JIT, otimizações diferentes. Ativo via &lt;code&gt;-XX:+UseJVMCICompiler&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GraalVM Native Image&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AOT total: sem JVM em runtime, sem warmup, mas sem JIT adaptativo. Ideal para serverless/CLIs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Project Leyden&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AOT Cache: treina uma vez, usa sempre. JDK 25 elimina warmup sem abrir mão do JIT ou do código atual.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quando resolver&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Java 25+ para enterprise/Spring. GraalVM Native Image para serverless/CLIs simples.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  GraalVM vs sem GraalVM — análise com dados reais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que os dados dizem sobre adoção em produção
&lt;/h3&gt;

&lt;p&gt;Antes de entrar nos cenários, é importante calibrar as expectativas com números verificados.&lt;/p&gt;

&lt;p&gt;O relatório &lt;strong&gt;New Relic State of the Java Ecosystem 2024&lt;/strong&gt; — baseado em dados de observabilidade de centenas de milhares de aplicações em produção — não registrou GraalVM Native Image como uma categoria de uso relevante entre as aplicações monitoradas. O relatório rastreia versões de JDK, vendors e GCs, mas o Native Image sequer aparece como item mensurável, o que por si só indica adoção marginal no universo enterprise geral. ¹&lt;/p&gt;

&lt;p&gt;O relatório &lt;strong&gt;Azul State of Java 2025&lt;/strong&gt; — com mais de 2.000 profissionais Java respondentes globalmente, confirma que 99% das organizações pesquisadas utilizam Java ativamente, com quase 70% delas tendo mais da metade de suas aplicações rodando na JVM. O foco absoluto das empresas continua sendo JVM clássica com HotSpot. ²&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;InfoQ Java Trends Report 2024&lt;/strong&gt; classifica o GraalVM Native Image para startup rápido na categoria "Early Majority" o que significa que a tecnologia existe e funciona, mas ainda não é mainstream. Para contexto, "Early Majority" no modelo de adoção de tecnologia representa algo entre 16% e 50% do mercado potencial, mas isso descreve o estágio de maturidade da tecnologia, não sua penetração real em produção. ³&lt;/p&gt;

&lt;p&gt;Um dado de produção concreto vem do blog &lt;strong&gt;BackendBytes&lt;/strong&gt; (fevereiro de 2026), que documentou migrações reais de equipes Spring Boot para Native Image: startup caindo de 7 segundos para 80ms, memória de 480 MB para 130 MB, mas com throughput em steady state &lt;strong&gt;10 a 25% menor&lt;/strong&gt; em comparação ao JIT. Esse número de queda de throughput é consistente entre múltiplas equipes migradas. ⁴&lt;/p&gt;

&lt;p&gt;Um dado importante de contexto estratégico: em setembro de 2025, a &lt;strong&gt;Oracle anunciou o desacoplamento do GraalVM do Java SE&lt;/strong&gt;, descontinuando o GraalVM Native Image para clientes do Java SE Product (Oracle JDK pago). O argumento oficial é que os objetivos de startup rápido e menor footprint serão perseguidos pelo Project Leyden como parte padrão do OpenJDK. Clientes usando o Graal JIT foram orientados a migrar de volta ao HotSpot JIT padrão. ⁵&lt;/p&gt;

&lt;p&gt;O GraalVM Native Image continua disponível pela GraalVM Community Edition (mantida pela Oracle Labs e pela comunidade), mas o sinal estratégico é claro: a Oracle apostou no Leyden como caminho padrão, não no Native Image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Os três cenários com benefícios e trade-offs reais
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Cenário 1 — Sem GraalVM: HotSpot JIT puro
&lt;/h4&gt;

&lt;p&gt;É o padrão atual de produção da grande maioria das aplicações Java no mundo. Você usa o C1 e o C2 da HotSpot, com Tiered Compilation ativa desde o Java 8.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefícios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Peak performance máxima no longo prazo, o C2 faz otimizações adaptativas impossíveis de reproduzir em AOT&lt;/li&gt;
&lt;li&gt;Funciona com qualquer biblioteca, framework ou padrão de reflexão sem configuração extra&lt;/li&gt;
&lt;li&gt;Todo o ecossistema Spring, Hibernate, Jackson, Kafka funciona sem ressalvas&lt;/li&gt;
&lt;li&gt;Deoptimização e recompilação automáticas quando o comportamento do código muda&lt;/li&gt;
&lt;li&gt;Suporte e documentação amplíssimos, é a JVM que todos conhecem&lt;/li&gt;
&lt;li&gt;Build time idêntico ao padrão, nenhuma etapa adicional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Startup lento: aplicações Spring Boot complexas levam de 4 a 11 segundos para estar prontas&lt;/li&gt;
&lt;li&gt;Warmup necessário: os primeiros requests são mais lentos enquanto o JIT "aprende"&lt;/li&gt;
&lt;li&gt;Em Kubernetes com auto-scaling, cada novo pod começa do zero sem cache JIT&lt;/li&gt;
&lt;li&gt;Uso de memória maior, a JVM, o heap e o Code Cache consomem mais RAM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quando usar:&lt;/strong&gt; APIs enterprise, microsserviços com Spring Boot complexo, sistemas com Hibernate ou qualquer uso intenso de reflexão, cargas variáveis onde o C2 adaptativo faz diferença. Ou seja: a maioria das aplicações bancárias em produção hoje.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cenário 2 — GraalVM modo JIT (Graal no lugar do C2)
&lt;/h4&gt;

&lt;p&gt;A JVM continua sendo a HotSpot. Tiered Compilation, Code Cache, profiling,  tudo igual. Só o compilador do tier 4 muda: o C2 é substituído pelo Graal, ativado com &lt;code&gt;-XX:+UseJVMCICompiler&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefícios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comportamento idêntico para o desenvolvedor, nenhuma mudança no código ou no processo de build&lt;/li&gt;
&lt;li&gt;O compilador Graal é escrito em Java (não em C++), o que permite algoritmos de otimização mais sofisticados&lt;/li&gt;
&lt;li&gt;Em workloads específicos com código muito regular e previsível, pode superar o C2 em throughput de pico&lt;/li&gt;
&lt;li&gt;Mantém todas as vantagens do JIT: deoptimização, profiling adaptativo, reflexão dinâmica&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em setembro de 2025, a Oracle orientou explicitamente que clientes do Oracle JDK migrem &lt;strong&gt;de volta&lt;/strong&gt; ao HotSpot JIT padrão, sinalizando que esse caminho não é o futuro ⁵&lt;/li&gt;
&lt;li&gt;Benefício de performance não é garantido, em muitos workloads o desempenho é equivalente ou ligeiramente inferior ao C2&lt;/li&gt;
&lt;li&gt;Menos testado em produção que o C2, ecossistema de suporte mais restrito&lt;/li&gt;
&lt;li&gt;O Graal JIT continua disponível na GraalVM CE, mas fora do mainstream Oracle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quando usar:&lt;/strong&gt; experimentos de performance em workloads muito específicos, pesquisa, ou contextos onde você já usa GraalVM CE e quer avaliar. Não recomendado como estratégia padrão de produção após o desacoplamento anunciado pela Oracle.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cenário 3 — GraalVM Native Image (AOT total)
&lt;/h4&gt;

&lt;p&gt;O bytecode vira um executável nativo antes de rodar. Não há JVM em runtime. Não há JIT. Não há warmup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefícios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Startup instantâneo: de 4–11 segundos para 40–120ms em migrações documentadas ⁴&lt;/li&gt;
&lt;li&gt;Uso de memória drasticamente menor: redução de 60–70% em casos reais (480 MB → 130 MB) ⁴&lt;/li&gt;
&lt;li&gt;Ideal para ambientes com SLA de startup agressivo no Kubernetes, resolve o problema de pods perdendo a janela de readiness&lt;/li&gt;
&lt;li&gt;Binário auto-contido: não depende de JVM instalada no ambiente de execução&lt;/li&gt;
&lt;li&gt;Superfície de ataque reduzida: código morto removido na análise estática de build time&lt;/li&gt;
&lt;li&gt;Menor custo em funções serverless cobradas por tempo de execução e memória&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Throughput em steady state &lt;strong&gt;10–25% menor&lt;/strong&gt; que o JIT em produção real, dado documentado em múltiplas migrações ⁴&lt;/li&gt;
&lt;li&gt;A "closed-world assumption" exige que todo o código acessível seja conhecido em build time, reflexão dinâmica, proxies e carregamento dinâmico de classes precisam de configuração explícita&lt;/li&gt;
&lt;li&gt;Spring Boot, Hibernate, Jackson e similares funcionam, mas exigem hints de reflexão no &lt;code&gt;reflect-config.json&lt;/code&gt; ou anotações específicas, o Spring Native/GraalVM plugin automatiza parte disso, mas não tudo&lt;/li&gt;
&lt;li&gt;Build time muito mais longa: de 5 a 15 minutos para aplicações médias, dependendo do tamanho do classpath&lt;/li&gt;
&lt;li&gt;Debugging em produção é mais limitado, sem JVM, sem JVMTI, ferramentas como JFR e Async Profiler têm suporte parcial&lt;/li&gt;
&lt;li&gt;Sem deoptimização: se o comportamento mudar, não há mecanismo de correção automática em runtime&lt;/li&gt;
&lt;li&gt;A descontinuação para clientes Oracle JDK cria incerteza sobre o suporte de longo prazo fora da GraalVM CE ⁵&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quando usar:&lt;/strong&gt; serviços serverless (AWS Lambda, Google Cloud Run), CLIs distribuídas como executável, microsserviços muito simples sem reflexão complexa, ambientes com SLA de startup impossível de cumprir com JVM clássica.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decisão rápida
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sua aplicação é...

  API enterprise / Spring Boot complexo / reflexão / carga variável?
  └─► HotSpot JIT puro  (+ Leyden no JDK 25+ para resolver o warmup)

  Serverless / CLI / startup crítico / memória muito restrita?
  └─► GraalVM Native Image  (com validação cuidadosa de reflexão)

  Quero experimentar Graal JIT sem mudar nada?
  └─► -XX:+UseJVMCICompiler  (mas avalie o desacoplamento Oracle antes)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Referências Bibliográficas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;[1]&lt;/strong&gt; NEW RELIC. &lt;em&gt;2024 State of the Java Ecosystem Report&lt;/em&gt;. San Francisco: New Relic, 2024. Disponível em: &lt;a href="https://newrelic.com/resources/report/2024-state-of-the-java-ecosystem" rel="noopener noreferrer"&gt;https://newrelic.com/resources/report/2024-state-of-the-java-ecosystem&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[2]&lt;/strong&gt; AZUL SYSTEMS. &lt;em&gt;Azul 2025 State of Java Survey &amp;amp; Report&lt;/em&gt;. Sunnyvale: Azul, jan. 2025. Disponível em: &lt;a href="https://www.azul.com/newsroom/azul-2025-state-of-java-survey-report/" rel="noopener noreferrer"&gt;https://www.azul.com/newsroom/azul-2025-state-of-java-survey-report/&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[3]&lt;/strong&gt; INFOQ EDITORIAL TEAM. &lt;em&gt;InfoQ Java Trends Report — December 2024&lt;/em&gt;. InfoQ, dez. 2024. Disponível em: &lt;a href="https://www.infoq.com/articles/java-trends-report-2024/" rel="noopener noreferrer"&gt;https://www.infoq.com/articles/java-trends-report-2024/&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[4]&lt;/strong&gt; BACKENDBYTES. &lt;em&gt;GraalVM Native Images in Production: From 5-Second Startup to 50ms&lt;/em&gt;. BackendBytes, fev. 2026. Disponível em: &lt;a href="https://backendbytes.com/articles/graalvm-native-images-java-production/" rel="noopener noreferrer"&gt;https://backendbytes.com/articles/graalvm-native-images-java-production/&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[5]&lt;/strong&gt; ORACLE. &lt;em&gt;Detaching GraalVM from the Java Ecosystem Train&lt;/em&gt;. Oracle Java Blog, set. 2025. Disponível em: &lt;a href="https://blogs.oracle.com/java/detaching-graalvm-from-the-java-ecosystem-train" rel="noopener noreferrer"&gt;https://blogs.oracle.com/java/detaching-graalvm-from-the-java-ecosystem-train&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[6]&lt;/strong&gt; OPENJDK. &lt;em&gt;JEP 483: Ahead-of-Time Class Loading &amp;amp; Linking&lt;/em&gt;. OpenJDK, 2024. Disponível em: &lt;a href="https://openjdk.org/jeps/483" rel="noopener noreferrer"&gt;https://openjdk.org/jeps/483&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[7]&lt;/strong&gt; OPENJDK. &lt;em&gt;JEP 514: Ahead-of-Time Command-Line Ergonomics&lt;/em&gt;. OpenJDK, 2025. Disponível em: &lt;a href="https://openjdk.org/jeps/514" rel="noopener noreferrer"&gt;https://openjdk.org/jeps/514&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[8]&lt;/strong&gt; OPENJDK. &lt;em&gt;JEP 515: Ahead-of-Time Method Profiling&lt;/em&gt;. OpenJDK, 2025. Disponível em: &lt;a href="https://openjdk.org/jeps/515" rel="noopener noreferrer"&gt;https://openjdk.org/jeps/515&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[9]&lt;/strong&gt; OPENJDK. &lt;em&gt;JEP 516: Ahead-of-Time Cache&lt;/em&gt;. OpenJDK, 2026. Disponível em: &lt;a href="https://openjdk.org/jeps/516" rel="noopener noreferrer"&gt;https://openjdk.org/jeps/516&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[10]&lt;/strong&gt; BAELDUNG. &lt;em&gt;JVM Tiered Compilation&lt;/em&gt;. Baeldung, 2024. Disponível em: &lt;a href="https://www.baeldung.com/jvm-tiered-compilation" rel="noopener noreferrer"&gt;https://www.baeldung.com/jvm-tiered-compilation&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[11]&lt;/strong&gt; ORACLE GRAAL TEAM. &lt;em&gt;Announcing Oracle GraalVM for JDK 24&lt;/em&gt;. Oracle Graal Blog, 2024. Disponível em: &lt;a href="https://blogs.oracle.com/graal/oracle-graalvm-for-jdk-24" rel="noopener noreferrer"&gt;https://blogs.oracle.com/graal/oracle-graalvm-for-jdk-24&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[12]&lt;/strong&gt; GRAALVM. &lt;em&gt;Native Image Documentation&lt;/em&gt;. GraalVM, 2025. Disponível em: &lt;a href="https://www.graalvm.org/latest/docs/" rel="noopener noreferrer"&gt;https://www.graalvm.org/latest/docs/&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[13]&lt;/strong&gt; INFOQ EDITORIAL TEAM. &lt;em&gt;InfoQ Java Trends Report 2025&lt;/em&gt;. InfoQ, dez. 2025. Disponível em: &lt;a href="https://www.infoq.com/articles/java-trends-report-2025/" rel="noopener noreferrer"&gt;https://www.infoq.com/articles/java-trends-report-2025/&lt;/a&gt;. Acesso em: jun. 2025.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Documento de estudo pessoal · Diego Brandão · 2025&lt;/em&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>performance</category>
      <category>graalvm</category>
      <category>jit</category>
    </item>
    <item>
      <title>Migração do Java 11 para Java 17: Benefícios e Trade-offs com Evidências Técnicas</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Sun, 07 Sep 2025 18:45:03 +0000</pubDate>
      <link>https://dev.to/diegobrandao/migracao-do-java-11-para-java-17-beneficios-e-trade-offs-com-evidencias-tecnicas-302n</link>
      <guid>https://dev.to/diegobrandao/migracao-do-java-11-para-java-17-beneficios-e-trade-offs-com-evidencias-tecnicas-302n</guid>
      <description>&lt;h2&gt;
  
  
  Índice
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Resumo&lt;/li&gt;
&lt;li&gt;
Benefícios da Migração

&lt;ul&gt;
&lt;li&gt;1.1 Melhorias de Performance
&lt;/li&gt;
&lt;li&gt;1.2 Novos Recursos de Linguagem
&lt;/li&gt;
&lt;li&gt;1.3 Melhorias de Segurança
&lt;/li&gt;
&lt;li&gt;1.4 Suporte Long-Term Support (LTS)
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Trade-offs e Desafios

&lt;ul&gt;
&lt;li&gt;2.1 Questões de Compatibilidade
&lt;/li&gt;
&lt;li&gt;2.2 Desafios Específicos da Migração
&lt;/li&gt;
&lt;li&gt;2.3 Custos de Migração
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Casos de Estudo Reais

&lt;ul&gt;
&lt;li&gt;3.1 Salesforce
&lt;/li&gt;
&lt;li&gt;3.2 Halodoc
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Recomendações Práticas

&lt;ul&gt;
&lt;li&gt;4.1 Estratégia de Migração
&lt;/li&gt;
&lt;li&gt;4.2 Alternativas Graduais
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;A migração do Java 11 para Java 17 representa uma atualização estratégica significativa para aplicações enterprise. Java 17 é uma versão Long-Term Support (LTS) que oferece melhorias substanciais em performance, segurança e recursos de linguagem, com suporte Oracle Premier até setembro de 2026. Este artigo apresenta uma análise técnica baseada em evidências sobre os benefícios e trade-offs desta migração.&lt;/p&gt;

&lt;p&gt;Estudos de benchmark demonstram ganhos de performance de 6-26% com Java 17, enquanto novos recursos como Records, Sealed Classes e melhor tratamento de NullPointerException melhoram significativamente a produtividade do desenvolvedor. Os principais trade-offs incluem questões de compatibilidade com bibliotecas legadas e a necessidade de atualização de dependências.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Benefícios da Migração
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Melhorias de Performance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Evidências de Benchmark Independentes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A OptaPlanner conduziu benchmarks extensivos comparando Java 11, 16 e 17, utilizando hardware estável (Intel Xeon Silver 4116 @ 2.1 GHz, 128 GiB RAM) em problemas de otimização reais durante 5 minutos cada. Os resultados demonstraram melhorias consistentes de performance.&lt;/p&gt;

&lt;p&gt;A Azul Systems reportou em benchmarks de 2025 que OpenJDK 17 foi 6% mais rápido que a baseline, enquanto soluções otimizadas como Azul Platform Prime alcançaram 26% de melhoria.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Melhorias no Garbage Collection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Java 17 introduz melhorias no garbage collector, particularmente em situações de baixa memória, resultando em ganhos de performance para aplicações que lidam com grandes datasets ou operações intensivas de memória.&lt;/p&gt;

&lt;p&gt;O G1 garbage collector tornou-se padrão a partir do Java 9, oferecendo performance mais consistente e tempos de resposta mais previsíveis. &lt;strong&gt;ZGC (Z Garbage Collector) tornou-se production-ready no JDK 17&lt;/strong&gt;, oferecendo coleta de lixo de baixa latência (sub-10ms) para heaps de até vários terabytes. &lt;strong&gt;Shenandoah está disponível em builds específicos como Red Hat OpenJDK e Amazon Corretto&lt;/strong&gt;, mas não faz parte do Oracle JDK oficial.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 Novos Recursos de Linguagem
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Records&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Records permitem criar classes de dados imutáveis especificando apenas os campos necessários; todos os outros métodos são gerados automaticamente. Records atuam como classes de dados onde todos os campos são final, garantindo imutabilidade da referência. &lt;strong&gt;Importante&lt;/strong&gt;: Records são imutáveis por contrato apenas se usados com tipos imutáveis. O fato dos campos serem &lt;code&gt;final&lt;/code&gt; garante imutabilidade da referência, mas não garante thread-safety absoluto se o campo for um objeto mutável.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Java 11 - Classe tradicional&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DataClass&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;DataClass&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="nf"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* implementação */&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* implementação */&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Java 17 - Record&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;DataClass&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// Cuidado: Records com objetos mutáveis&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;PersonRecord&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="nc"&gt;PersonRecord&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PersonRecord&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"João"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;());&lt;/span&gt;
&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hobbies&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"futebol"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Modifica o estado interno!&lt;/span&gt;
&lt;span class="c1"&gt;// Para verdadeira imutabilidade, use List.copyOf() ou Collections.unmodifiableList()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sealed Classes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sealed Classes foram adicionadas à linguagem Java, restringindo quais outras classes ou interfaces podem estendê-las ou implementá-las, melhorando a segurança de tipos e organização do código.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern Matching e Switch Expressions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Switch expressions melhoradas permitem sintaxe mais concisa e segura. O operador instanceof também foi aprimorado, permitindo verificação de tipo e cast em uma única linha. &lt;strong&gt;A principal vantagem é legibilidade e segurança de tipo&lt;/strong&gt;, eliminando a necessidade de casts explícitos e reduzindo a possibilidade de ClassCastException.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Melhor Tratamento de NullPointerException&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma atualização incrivelmente útil no Java 17 são as NullPointerExceptions melhoradas! Finalmente, nos logs de stack trace, é possível ver qual campo específico causou a NullPointerException.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Java 17 - NPE melhorada&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Exception output:&lt;/span&gt;
&lt;span class="c1"&gt;// java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" &lt;/span&gt;
&lt;span class="c1"&gt;// because "s" is null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.3 Melhorias de Segurança
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Atualizações Regulares de Segurança&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O modelo de lançamento de segurança Java mudou para estar alinhado com o cronograma Oracle Critical Patch Update (CPU), onde releases CPU são lançados na terceira terça-feira de janeiro, abril, julho e outubro.&lt;/p&gt;

&lt;p&gt;JDK 17 introduziu melhorias significativas de segurança incluindo modo de validação segura XML habilitado por default, algoritmos SHA-1 desabilitados por padrão em assinaturas XML, e melhorias no suporte OCSP com requisições HTTP GET para performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encapsulamento Forte de Internals do JDK&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;JEP 403 fortalece o encapsulamento de internals do JDK. Java 17 é fortemente encapsulado por padrão, então reflexão para internals do JDK não é mais permitida. Código que acessa campos e métodos não-públicos de APIs java.* lançará InaccessibleObjectException.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4 Suporte Long-Term Support (LTS)
&lt;/h3&gt;

&lt;p&gt;Java 17 é uma versão LTS com Oracle Premier Support até setembro de 2026, proporcionando estabilidade e atualizações de segurança por período estendido. O processo de LTS garante que essas versões tornem-se mais estáveis e seguras devido a correções de bugs, melhorias de performance e patches de segurança.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Trade-offs e Desafios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Questões de Compatibilidade
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Deprecação e Remoção de APIs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Provavelmente a mudança mais significativa relacionada à segurança no JDK 17 é JEP 411: Deprecate the Security Manager for Removal. JDK 17 inicia esse processo depreciando várias APIs do Security Manager.&lt;/p&gt;

&lt;p&gt;Vários parâmetros JVM foram removidos ou depreciados até o Java 17. Se sua aplicação dependia das funcionalidades experimentais AOT ou Graal JIT no Java 11, considere a transição para GraalVM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problemas com Bibliotecas de Terceiros&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nem todas as bibliotecas e frameworks de terceiros têm garantia de suporte ao Java 17 imediatamente. Verificar compatibilidade e atualizações é crucial. Ferramentas de build (Maven, Gradle) e IDEs devem ser atualizadas para suportar Java 17.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Desafios Específicos da Migração
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problemas com Lombok&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um problema recorrente em migrações é incompatibilidade com versões antigas do Lombok. Um erro comum é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A solução prática é atualizar o Lombok para uma versão compatível (por exemplo, &amp;gt;= 1.18.22) e validar a compilação/annotation-processing em ambientes CI e locais. Em casos extremos, configure o --add-opens temporariamente apenas para testes, mas prefira atualizar bibliotecas e remover dependências de internals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuração de Garbage Collection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Embora coletores de lixo mais novos como G1 ofereçam melhor performance, eles podem requerer ajustes. Aplicações com configurações customizadas de GC precisarão revisitar essas configurações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modularização (Opcional)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importante&lt;/strong&gt;: A modularização NÃO é obrigatória para Java 17. Aplicações podem continuar usando o classpath tradicional exatamente como em Java 11. A migração para o Module System (JPMS) é &lt;strong&gt;completamente opcional&lt;/strong&gt; e só deve ser considerada se você quiser benefícios específicos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encapsulamento mais forte de pacotes internos&lt;/li&gt;
&lt;li&gt;Dependências explícitas entre módulos&lt;/li&gt;
&lt;li&gt;Redução de footprint de memória em aplicações modulares&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A grande maioria das aplicações enterprise pode migrar para Java 17 sem qualquer mudança no sistema de módulos.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Custos de Migração
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Testes Extensivos Necessários&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes de migrar microserviços Java do JDK 11 para JDK 17, é essencial garantir que todos os testes unitários, de integração e de sistema passem com sucesso. Este passo é necessário para verificar que a aplicação funciona como esperado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tempo de Desenvolvimento&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A Salesforce reportou que a migração do JDK 11 para JDK 17 levou três anos de planejamento com sete meses de desenvolvimento ativo. &lt;strong&gt;Importante&lt;/strong&gt;: Este prazo reflete o tamanho massivo do ecossistema Salesforce (Sales Cloud, Service Cloud, Marketing Cloud) com milhares de aplicações e microserviços. Empresas menores terão prazos significativamente mais curtos - a maioria das organizações pode completar a migração em algumas semanas ou meses, dependendo da complexidade da arquitetura.&lt;/p&gt;

&lt;p&gt;No entanto, as lições aprendidas pela Salesforce permitirão que futuras migrações, como JDK 21, sejam completadas em apenas um ano, demonstrando o valor do aprendizado organizacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Casos de Estudo Reais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Salesforce
&lt;/h3&gt;

&lt;p&gt;A Salesforce liderou uma migração desafiadora do JDK 11 para JDK 17 para garantir performance e escalabilidade das aplicações principais, incluindo Sales Cloud, Service Cloud e Marketing Cloud. A migração entregou melhorias significativas de performance, possibilitando processamento mais rápido.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Halodoc
&lt;/h3&gt;

&lt;p&gt;A Halodoc migrou seus microserviços backend Java do JDK 11 para JDK 17, enfrentando desafios específicos como conflitos entre dependências Redisson e Jackson, que foram resolvidos através de cuidadoso exame das versões de dependências e ajustes necessários para garantir compatibilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Recomendações Práticas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Estratégia de Migração
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Análise de Dependências&lt;/strong&gt;: Analisar dependências do projeto para garantir compatibilidade com Java 17. Atualizar bibliotecas ou frameworks desatualizados para versões que suportem a nova versão Java.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ambiente de Testes&lt;/strong&gt;: Testar aplicação em ambiente especial de testes com JDK atualizado. Revisar e atualizar todas as dependências e ferramentas de build para versões compatíveis com JDK 17.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Análise Estática&lt;/strong&gt;: Executar verificação estática de código para identificar onde problemas podem ocorrer. Ferramentas como Checkstyle, PMD, ou SpotBugs podem ser utilizadas.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4.2 Alternativas Graduais
&lt;/h3&gt;

&lt;p&gt;Para organizações não prontas para migração completa, alguns fornecedores de JDK oferecem soluções otimizadas que podem combinar versões de API com JVMs mais recentes. &lt;strong&gt;É recomendável avaliar benchmarks específicos para seu caso de uso&lt;/strong&gt; antes de adotar soluções comerciais que prometem melhorias de performance específicas.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Conclusão
&lt;/h2&gt;

&lt;p&gt;A migração do Java 11 para Java 17 oferece benefícios substanciais e mensuráveis:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefícios Principais:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Melhorias de performance de 6-26% conforme benchmarks independentes&lt;/li&gt;
&lt;li&gt;Recursos de linguagem modernos como Records, Sealed Classes e melhor tratamento de exceções (NPE melhoradas desde Java 14)&lt;/li&gt;
&lt;li&gt;Melhorias significativas de segurança e encapsulamento forte&lt;/li&gt;
&lt;li&gt;Suporte LTS: Oracle Premier até 2026, Extended até 2029, com alternativas de suporte de outros fornecedores&lt;/li&gt;
&lt;li&gt;ZGC production-ready para aplicações que necessitam baixa latência&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs Principais:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Necessidade de atualização de dependências e ferramentas&lt;/li&gt;
&lt;li&gt;Problemas específicos com bibliotecas como Lombok&lt;/li&gt;
&lt;li&gt;Investimento em tempo de desenvolvimento e testes&lt;/li&gt;
&lt;li&gt;Configurações de GC podem requerer ajustes dependendo do perfil da aplicação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Graças à forte compatibilidade retroativa do Java, a migração do 11 para o 17 tende a ser incremental e de baixo risco, especialmente em comparação com saltos maiores (ex: 8 → 17).&lt;/strong&gt; A compatibilidade permite mudar para Java 17 sem alterações de código obrigatórias (&lt;strong&gt;modularização é opcional&lt;/strong&gt;) e aproveitar todos os recursos atualizados. A versão 17 é Long-term Support, garantindo atualizações de segurança por período estendido com múltiplas opções de fornecedores.&lt;/p&gt;

&lt;p&gt;Para organizações enterprise, a migração é altamente recomendada, especialmente considerando que aplicações de grande escala e alta carga verão definitivamente melhor performance, tempo de inicialização mais rápido e menor footprint de memória após a migração.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Referências
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;HashStudioz Technologies. (2024). &lt;em&gt;Java Project Migration: Step-by-Step Guide from Java 11 to 17&lt;/em&gt;. Retrieved from &lt;a href="https://www.hashstudioz.com/blog/java-11-to-java-17-migration-guide/" rel="noopener noreferrer"&gt;https://www.hashstudioz.com/blog/java-11-to-java-17-migration-guide/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bell-SW. (2024). &lt;em&gt;How to Migrate from Java 11 to Java 17: Step-by-Step Tutorial&lt;/em&gt;. Retrieved from &lt;a href="https://bell-sw.com/blog/migration-from-java-11-to-java-17/" rel="noopener noreferrer"&gt;https://bell-sw.com/blog/migration-from-java-11-to-java-17/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HackerNoon. (2023). &lt;em&gt;Is Migrating From Java 11 to Java 17 Worth It?&lt;/em&gt; Retrieved from &lt;a href="https://hackernoon.com/is-migrating-from-java-11-to-java-17-worth-it" rel="noopener noreferrer"&gt;https://hackernoon.com/is-migrating-from-java-11-to-java-17-worth-it&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Medium - Pradeep Chirumamilla. (2024). &lt;em&gt;Java 11 to Java 17 Migration: A Guide with Key Features and Code Implementation&lt;/em&gt;. Retrieved from &lt;a href="https://medium.com/@pradeepchirumamilla01/java-11-to-java-17-migration-a-guide-with-key-features-and-code-implementation-dd63e0bd79e3" rel="noopener noreferrer"&gt;https://medium.com/@pradeepchirumamilla01/java-11-to-java-17-migration-a-guide-with-key-features-and-code-implementation-dd63e0bd79e3&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Halodoc Engineering. (2023). &lt;em&gt;A Practical Guide to Migrating from JDK 11 to JDK 17&lt;/em&gt;. Retrieved from &lt;a href="https://blogs.halodoc.io/jdk-17-migration/" rel="noopener noreferrer"&gt;https://blogs.halodoc.io/jdk-17-migration/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zenesys. (2024). &lt;em&gt;Migrating a Project From Java 11 to Java 17: A Step-by-Step Guide&lt;/em&gt;. Retrieved from &lt;a href="https://www.zenesys.com/migrating-a-project-from-java-11-to-java-17-a-step-by-step-guide" rel="noopener noreferrer"&gt;https://www.zenesys.com/migrating-a-project-from-java-11-to-java-17-a-step-by-step-guide&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Medium - Alex Klimenko. (2025). &lt;em&gt;Migrating from Java 8 to Java 17: What Changed and Potential Issues&lt;/em&gt;. Retrieved from &lt;a href="https://medium.com/@alxkm/migrating-from-java-8-to-java-17-what-changed-and-potential-issues-85d2e85fc1ca" rel="noopener noreferrer"&gt;https://medium.com/@alxkm/migrating-from-java-8-to-java-17-what-changed-and-potential-issues-85d2e85fc1ca&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DEV Community - NIX. (2022). &lt;em&gt;Migrating a Project From Java 11 to Java 17: A Step-by-Step Guide for Developers&lt;/em&gt;. Retrieved from &lt;a href="https://dev.to/nix/migrating-a-project-from-java-11-to-java-17-a-step-by-step-guide-for-developers-42n"&gt;https://dev.to/nix/migrating-a-project-from-java-11-to-java-17-a-step-by-step-guide-for-developers-42n&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Salesforce Engineering. (2025). &lt;em&gt;Behind Salesforce's JDK 11 to JDK 17 Migration&lt;/em&gt;. Retrieved from &lt;a href="https://engineering.salesforce.com/behind-salesforces-jdk-11-to-jdk-17-migration-lessons-for-modernizing-large-scale-java-applications/" rel="noopener noreferrer"&gt;https://engineering.salesforce.com/behind-salesforces-jdk-11-to-jdk-17-migration-lessons-for-modernizing-large-scale-java-applications/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Medium - Alex Klimenko. (2024). &lt;em&gt;Modernizing Legacy Java: A Practical Guide to Migrating to Java 17/21+&lt;/em&gt;. Retrieved from &lt;a href="https://medium.com/@alxkm/modernizing-legacy-java-a-practical-guide-to-migrating-to-java-17-21-b3ab6a215f1f" rel="noopener noreferrer"&gt;https://medium.com/@alxkm/modernizing-legacy-java-a-practical-guide-to-migrating-to-java-17-21-b3ab6a215f1f&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OptaPlanner. (2021). &lt;em&gt;How much faster is Java 17?&lt;/em&gt; Retrieved from &lt;a href="https://www.optaplanner.org/blog/2021/09/15/HowMuchFasterIsJava17.html" rel="noopener noreferrer"&gt;https://www.optaplanner.org/blog/2021/09/15/HowMuchFasterIsJava17.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oracle. (2021). &lt;em&gt;JDK 17 Release Notes, Important Changes, and Information&lt;/em&gt;. Retrieved from &lt;a href="https://www.oracle.com/java/technologies/javase/17-relnote-issues.html" rel="noopener noreferrer"&gt;https://www.oracle.com/java/technologies/javase/17-relnote-issues.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub - Ionut Balosin. (2024). &lt;em&gt;JVM Performance Benchmarks&lt;/em&gt;. Retrieved from &lt;a href="https://github.com/ionutbalosin/jvm-performance-benchmarks" rel="noopener noreferrer"&gt;https://github.com/ionutbalosin/jvm-performance-benchmarks&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Azul Systems. (2025). &lt;em&gt;Benchmarks Show Faster Java Performance Improvement&lt;/em&gt;. Retrieved from &lt;a href="https://www.azul.com/blog/benchmarks-show-faster-java-performance-improvement/" rel="noopener noreferrer"&gt;https://www.azul.com/blog/benchmarks-show-faster-java-performance-improvement/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oracle. (2014). &lt;em&gt;Avoiding Benchmarking Pitfalls on the JVM&lt;/em&gt;. Retrieved from &lt;a href="https://www.oracle.com/technical-resources/articles/java/architect-benchmarking.html" rel="noopener noreferrer"&gt;https://www.oracle.com/technical-resources/articles/java/architect-benchmarking.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;oj! Algorithms. (2022). &lt;em&gt;JDK17 Benchmark&lt;/em&gt;. Retrieved from &lt;a href="https://www.ojalgo.org/2021/11/jdk17-benchmark/" rel="noopener noreferrer"&gt;https://www.ojalgo.org/2021/11/jdk17-benchmark/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oracle. (2024). &lt;em&gt;Overview of Java SE Subscription Enterprise Performance Pack&lt;/em&gt;. Retrieved from &lt;a href="https://docs.oracle.com/en/java/java-components/enterprise-performance-pack/epp-user-guide/overview.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/java/java-components/enterprise-performance-pack/epp-user-guide/overview.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ionut Balosin. (2023). &lt;em&gt;JVM Performance Comparison for JDK 17&lt;/em&gt;. Retrieved from &lt;a href="https://ionutbalosin.com/2023/03/jvm-performance-comparison-for-jdk-17/" rel="noopener noreferrer"&gt;https://ionutbalosin.com/2023/03/jvm-performance-comparison-for-jdk-17/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pretius. (2022). &lt;em&gt;Java 17 features: A comparison between versions 8 and 17&lt;/em&gt;. Retrieved from &lt;a href="https://pretius.com/blog/java-17-features" rel="noopener noreferrer"&gt;https://pretius.com/blog/java-17-features&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oracle. (2021). &lt;em&gt;JDK Releases&lt;/em&gt;. Retrieved from &lt;a href="https://www.java.com/releases/" rel="noopener noreferrer"&gt;https://www.java.com/releases/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oracle. (2024). &lt;em&gt;Consolidated JDK 17 Release Notes&lt;/em&gt;. Retrieved from &lt;a href="https://www.oracle.com/java/technologies/javase/17all-relnotes.html" rel="noopener noreferrer"&gt;https://www.oracle.com/java/technologies/javase/17all-relnotes.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oracle. (2025). &lt;em&gt;Oracle Java SE Support Roadmap&lt;/em&gt;. Retrieved from &lt;a href="https://www.oracle.com/java/technologies/java-se-support-roadmap.html" rel="noopener noreferrer"&gt;https://www.oracle.com/java/technologies/java-se-support-roadmap.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Baeldung. (2024). &lt;em&gt;New Features in Java 17&lt;/em&gt;. Retrieved from &lt;a href="https://www.baeldung.com/java-17-new-features" rel="noopener noreferrer"&gt;https://www.baeldung.com/java-17-new-features&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oracle. (2024). &lt;em&gt;Java™ SE Development Kit 17, 17.0.15 Release Notes&lt;/em&gt;. Retrieved from &lt;a href="https://www.oracle.com/java/technologies/javase/17-0-15-relnotes.html" rel="noopener noreferrer"&gt;https://www.oracle.com/java/technologies/javase/17-0-15-relnotes.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oracle. (2024). &lt;em&gt;Java Security Resource Center&lt;/em&gt;. Retrieved from &lt;a href="https://www.oracle.com/java/technologies/security.html" rel="noopener noreferrer"&gt;https://www.oracle.com/java/technologies/security.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wikipedia. (2025). &lt;em&gt;Java version history&lt;/em&gt;. Retrieved from &lt;a href="https://en.wikipedia.org/wiki/Java_version_history" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Java_version_history&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sean Mullan. (2021). &lt;em&gt;JDK 17 Security Enhancements&lt;/em&gt;. Retrieved from &lt;a href="https://seanjmullan.org/blog/2021/09/14/jdk17" rel="noopener noreferrer"&gt;https://seanjmullan.org/blog/2021/09/14/jdk17&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Red Hat. (2024). &lt;em&gt;OpenJDK Life Cycle and Support Policy&lt;/em&gt;. Retrieved from &lt;a href="https://access.redhat.com/articles/1299013" rel="noopener noreferrer"&gt;https://access.redhat.com/articles/1299013&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oracle. (2021). &lt;em&gt;Java Platform, Standard Edition Oracle JDK Migration Guide, Release 11&lt;/em&gt;. Retrieved from &lt;a href="https://docs.oracle.com/en/java/javase/11/migrate/index.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/java/javase/11/migrate/index.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Oracle. (2024). &lt;em&gt;Migrating From JDK 8 to Later JDK Releases&lt;/em&gt;. Retrieved from &lt;a href="https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Java Records vs Lombok: Guia Definitivo para Escolher a Ferramenta Certa</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Mon, 21 Jul 2025 23:23:42 +0000</pubDate>
      <link>https://dev.to/diegobrandao/java-records-vs-lombok-guia-definitivo-para-escolher-a-ferramenta-certa-47ij</link>
      <guid>https://dev.to/diegobrandao/java-records-vs-lombok-guia-definitivo-para-escolher-a-ferramenta-certa-47ij</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A eterna busca por reduzir o código boilerplate em Java ganhou duas ferramentas poderosas: &lt;strong&gt;Java Records&lt;/strong&gt; (introduzidos no Java 14 e estabilizados no Java 16) e &lt;strong&gt;Lombok&lt;/strong&gt; (biblioteca amplamente adotada há anos). Embora ambos ataquem o mesmo problema - a verbosidade do Java - eles fazem isso de maneiras fundamentalmente diferentes, com implicações importantes para o design e arquitetura do seu código.&lt;/p&gt;

&lt;p&gt;Este artigo vai além da comparação superficial de sintaxe e mergulha nas diferenças semânticas, casos de uso práticos e trade-offs de cada abordagem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Records Java: Mais que Redução de Boilerplate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são Records?
&lt;/h3&gt;

&lt;p&gt;Records não são apenas uma forma concisa de criar classes - eles são &lt;strong&gt;tipos de produto&lt;/strong&gt; com semântica específica. Segundo a JEP 395:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Records são portadores transparentes de dados imutáveis"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A palavra-chave aqui é &lt;strong&gt;transparente&lt;/strong&gt;. Records seguem o princípio:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A API de um record modela o estado, todo o estado, e nada além do estado"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Exemplo Básico
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes: 40+ linhas de código boilerplate&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* implementação */&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* implementação */&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* implementação */&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Depois: 1 linha&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Características dos Records
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Imutabilidade por Design&lt;/strong&gt;: Todos os campos são &lt;code&gt;private final&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparência&lt;/strong&gt;: Não há estado oculto&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Construtores Canônicos&lt;/strong&gt;: Gerados automaticamente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Métodos Padrão&lt;/strong&gt;: &lt;code&gt;equals()&lt;/code&gt;, &lt;code&gt;hashCode()&lt;/code&gt;, &lt;code&gt;toString()&lt;/code&gt; implementados automaticamente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acessores&lt;/strong&gt;: Métodos com o mesmo nome dos componentes&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Lombok: Flexibilidade Através de Anotações
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é Lombok?
&lt;/h3&gt;

&lt;p&gt;Lombok é uma biblioteca que &lt;strong&gt;gera código&lt;/strong&gt; em tempo de compilação através de anotações. Não impõe semântica específica - é pura redução de boilerplate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo com Lombok
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;preco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Método personalizado&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;aplicarDesconto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;desconto&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;preco&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;desconto&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Principais Anotações
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@Data&lt;/code&gt;: Gera getters, setters, &lt;code&gt;equals()&lt;/code&gt;, &lt;code&gt;hashCode()&lt;/code&gt;, &lt;code&gt;toString()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Value&lt;/code&gt;: Classe imutável (equivalente a um record)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Builder&lt;/code&gt;: Padrão Builder&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Slf4j&lt;/code&gt;: Injeção de logger&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Getter/@Setter&lt;/code&gt;: Getters e setters específicos&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparação Detalhada
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;Records&lt;/th&gt;
&lt;th&gt;Lombok&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Semântica&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tipos de produto transparentes&lt;/td&gt;
&lt;td&gt;Geração de código&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Imutabilidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Por padrão&lt;/td&gt;
&lt;td&gt;Opcional (@Value)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flexibilidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limitada&lt;/td&gt;
&lt;td&gt;Alta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Herança&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não suportada&lt;/td&gt;
&lt;td&gt;Suportada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Estado Oculto&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Proibido&lt;/td&gt;
&lt;td&gt;Permitido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dependência Externa&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Versão Java&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;14+ (estável no 16+)&lt;/td&gt;
&lt;td&gt;Qualquer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desempenho&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nativo&lt;/td&gt;
&lt;td&gt;Geração em tempo de compilação&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Quando Usar Records
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Use Records para:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. DTOs (Data Transfer Objects)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;UsuarioDTO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;LocalDate&lt;/span&gt; &lt;span class="n"&gt;nascimento&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Objetos de Valor
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Dinheiro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;moeda&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Respostas de API
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Configurações Imutáveis
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;DatabaseConfig&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5. Entidades JPA Simples (com limitações)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nd"&gt;@Id&lt;/span&gt; &lt;span class="nd"&gt;@GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GenerationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;preco&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ❌ Evite Records quando:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Precisar de mutabilidade&lt;/li&gt;
&lt;li&gt;Necessitar de herança&lt;/li&gt;
&lt;li&gt;Requerer estado oculto&lt;/li&gt;
&lt;li&gt;Trabalhar com frameworks que exigem construtores sem argumentos&lt;/li&gt;
&lt;li&gt;Precisar de métodos de ciclo de vida JPA complexos&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quando Usar Lombok
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Use Lombok para:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Entidades JPA Complexas
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="nd"&gt;@NoArgsConstructor&lt;/span&gt;
&lt;span class="nd"&gt;@AllArgsConstructor&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="nd"&gt;@GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GenerationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@OneToMany&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mappedBy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"usuario"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cascade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CascadeType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ALL&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Pedido&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pedidos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Modelos de Negócio com Comportamento
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="nd"&gt;@Slf4j&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ContaBancaria&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sacar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sacando {} da conta {}"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subtract&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Saldo insuficiente"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Builders Complexos
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Builder&lt;/span&gt;
&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Relatorio&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;titulo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;LocalDate&lt;/span&gt; &lt;span class="n"&gt;dataInicio&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;LocalDate&lt;/span&gt; &lt;span class="n"&gt;dataFim&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;colunas&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;parametros&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Uso&lt;/span&gt;
&lt;span class="nc"&gt;Relatorio&lt;/span&gt; &lt;span class="n"&gt;relatorio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Relatorio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;titulo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Vendas Mensais"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dataInicio&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;LocalDate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;minusMonths&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dataFim&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;LocalDate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;colunas&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"produto"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"quantidade"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"valor"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ❌ Evite Lombok quando:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O projeto exigir zero dependências externas&lt;/li&gt;
&lt;li&gt;Houver problemas de compatibilidade com IDEs&lt;/li&gt;
&lt;li&gt;A equipe não estiver familiarizada com a biblioteca&lt;/li&gt;
&lt;li&gt;Precisar de garantias semânticas específicas&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Casos de Uso Práticos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cenário 1: Sistema de E-commerce
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// DTO para resposta da API - USE RECORD&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;ProdutoResponse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;preco&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;categoria&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// Entidade JPA com comportamento - USE LOMBOK&lt;/span&gt;
&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="nd"&gt;@NoArgsConstructor&lt;/span&gt;
&lt;span class="nd"&gt;@AllArgsConstructor&lt;/span&gt;
&lt;span class="nd"&gt;@Builder&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="nd"&gt;@GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GenerationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;preco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;categoria&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;estoque&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;reduzirEstoque&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estoque&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Estoque insuficiente"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;estoque&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cenário 2: Sistema Bancário
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Objeto de valor imutável - USE RECORD&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Moeda&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;codigo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;simbolo&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// Entidade complexa com estado mutável - USE LOMBOK&lt;/span&gt;
&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="nd"&gt;@EqualsAndHashCode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onlyExplicitlyIncluded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@NoArgsConstructor&lt;/span&gt;
&lt;span class="nd"&gt;@Slf4j&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="nd"&gt;@EqualsAndHashCode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Include&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;titular&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@OneToMany&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mappedBy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"conta"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cascade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CascadeType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ALL&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Transacao&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;transacoes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;transferir&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;destino&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Transferindo {} de {} para {}"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;destino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica de transferência&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Híbrido: Usando Records e Lombok Juntos
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Record com anotações do Lombok para funcionalidades adicionais&lt;/span&gt;
&lt;span class="nd"&gt;@Slf4j&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;ProcessamentoResult&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nc"&gt;LocalDateTime&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;sucesso&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ProcessamentoResult&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Resultado do processamento {}: {}"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sucesso&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;"SUCESSO"&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"FALHA"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O Futuro: Spring Data Commons Recomenda Records
&lt;/h2&gt;

&lt;p&gt;O Spring Framework oficialmente recomenda Records para DTOs e projeções:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Recomendação oficial do Spring Data&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;NamesOnly&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;firstname&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;lastname&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

&lt;span class="c1"&gt;// Em vez de usar Lombok&lt;/span&gt;
&lt;span class="nd"&gt;@Value&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NamesOnly&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;firstname&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lastname&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Diretrizes para Tomada de Decisão
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Escolha Records quando:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Estiver no Java 16+&lt;/li&gt;
&lt;li&gt;✅ Precisar de objetos imutáveis&lt;/li&gt;
&lt;li&gt;✅ Quiser garantias semânticas fortes&lt;/li&gt;
&lt;li&gt;✅ Criar DTOs ou objetos de valor&lt;/li&gt;
&lt;li&gt;✅ Buscar máxima performance (sem overhead de biblioteca)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Escolha Lombok quando:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Precisar de flexibilidade máxima&lt;/li&gt;
&lt;li&gt;✅ Trabalhar com herança&lt;/li&gt;
&lt;li&gt;✅ Requerer mutabilidade&lt;/li&gt;
&lt;li&gt;✅ Usar versões antigas do Java&lt;/li&gt;
&lt;li&gt;✅ Precisar de funcionalidades como &lt;a class="mentioned-user" href="https://dev.to/builder"&gt;@builder&lt;/a&gt; ou @Slf4j&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Ambos quando:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Records para DTOs e objetos de valor&lt;/li&gt;
&lt;li&gt;✅ Lombok para entidades e modelos de negócio&lt;/li&gt;
&lt;li&gt;✅ Aproveitar o melhor de cada abordagem&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Migração Gradual
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Estratégia de Migração para Records:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identifique candidatos&lt;/strong&gt;: DTOs, objetos de valor, classes imutáveis simples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migre gradualmente&lt;/strong&gt;: Comece com classes menos críticas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste thoroughly&lt;/strong&gt;: Verifique serialização e frameworks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitore performance&lt;/strong&gt;: Records podem ter características diferentes&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Exemplo de Migração:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes (Lombok)&lt;/span&gt;
&lt;span class="nd"&gt;@Value&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Endereco&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;rua&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cep&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Depois (Record)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Endereco&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;rua&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cep&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Considerações de Performance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Records:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Sem overhead de biblioteca&lt;/li&gt;
&lt;li&gt;✅ Otimizações do compilador&lt;/li&gt;
&lt;li&gt;⚠️ Criação de objetos em atualizações (imutabilidade)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Lombok:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Código gerado otimizado&lt;/li&gt;
&lt;li&gt;⚠️ Dependência de bibliotecas externas&lt;/li&gt;
&lt;li&gt;⚠️ Possível overhead de reflection em algumas situações&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A escolha entre Records e Lombok não é uma questão de "melhor" ou "pior", mas sim de &lt;strong&gt;adequação ao contexto&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Records&lt;/strong&gt; brilham quando você precisa de semântica forte, imutabilidade e transparência&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lombok&lt;/strong&gt; excele quando você precisa de flexibilidade, mutabilidade e compatibilidade com versões antigas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A tendência é usar &lt;strong&gt;ambos estrategicamente&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Records para DTOs, objetos de valor e dados imutáveis&lt;/li&gt;
&lt;li&gt;Lombok para entidades complexas e modelos de negócio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o Java evoluindo e mais projetos adotando versões recentes, Records estão se tornando a escolha padrão para muitos casos de uso. No entanto, Lombok continuará relevante para cenários que demandam máxima flexibilidade.&lt;/p&gt;

&lt;p&gt;A chave é entender que essas ferramentas resolvem problemas similares de maneiras diferentes, e a escolha certa depende das necessidades específicas do seu projeto, versão do Java e arquitetura da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências Bibliográficas
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://medium.com/@umeshcapg/replace-some-lombok-features-with-record-in-java-17-a-modern-alternative-50b25aed3478" rel="noopener noreferrer"&gt;Replace Some Lombok Features with record in Java 17: A Modern Alternative&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//Recommend%20Java%20records%20instead%20of%20Lombok%20for%20class-based%20projections."&gt;https://github.com/spring-projects/spring-data-commons/commit/959bde4d37b10342d963cf47d0bbf1b68000ff6a&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.toRecomenda%C3%A7%C3%A3o%20oficial%20do%20Spring%20Data"&gt;https://github.com/spring-projects/spring-data-commons/pull/2794&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.toRecords%20ou%20Lombok?%20Qual%20a%20melhor%20escolha%20para%20seu%20projeto%20Java?"&gt;https://medium.com/@fabio.alvaro/records-ou-lombok-qual-a-melhor-escolha-para-o-seu-projeto-java-b0d1fde468f2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.toJava%20Records%20vs%20JPA%20Entities%20and%20Lombok"&gt;https://javatechonline.com/java-records-vs-jpa-entities-and-lombok/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Por que Abandonar @Autowired em Campos e Adotar Injeção via Construtor</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Tue, 15 Jul 2025 00:55:48 +0000</pubDate>
      <link>https://dev.to/diegobrandao/por-que-abandonar-autowired-em-campos-e-adotar-injecao-via-construtor-5198</link>
      <guid>https://dev.to/diegobrandao/por-que-abandonar-autowired-em-campos-e-adotar-injecao-via-construtor-5198</guid>
      <description>&lt;p&gt;A injeção de dependência via construtor representa uma evolução natural das práticas de desenvolvimento com Spring Framework. Este documento apresenta os fundamentos técnicos que justificam essa transição e como implementá-la efetivamente em projetos modernos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contextualização
&lt;/h2&gt;

&lt;p&gt;O Spring Framework oferece três formas principais de injeção de dependência: por campo (field injection), por setter e por construtor. Embora a injeção por campo seja visualmente mais limpa e requeira menos código, ela apresenta limitações significativas que impactam a qualidade, manutenibilidade e robustez das aplicações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais Benefícios da Injeção via Construtor
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Transparência e Dependências Explícitas
&lt;/h3&gt;

&lt;p&gt;A injeção via construtor expõe claramente todas as dependências de uma classe em sua assinatura. Esta transparência facilita a compreensão do código, permitindo que desenvolvedores identifiquem rapidamente quais componentes uma classe necessita para funcionar corretamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Injeção por campo - dependências ocultas&lt;/span&gt;
&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="n"&gt;userRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// Dependências não são evidentes na assinatura da classe&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Injeção por construtor - dependências explícitas&lt;/span&gt;
&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="n"&gt;userRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="n"&gt;userRepository&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;userRepository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;emailService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Testabilidade Aprimorada
&lt;/h3&gt;

&lt;p&gt;A injeção via construtor elimina a dependência do contexto Spring durante os testes unitários. As classes podem ser instanciadas diretamente, com mocks injetados como parâmetros do construtor, resultando em testes mais rápidos e independentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vantagens nos testes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eliminação da necessidade de reflection&lt;/li&gt;
&lt;li&gt;Testes mais performáticos&lt;/li&gt;
&lt;li&gt;Maior simplicidade na configuração de mocks&lt;/li&gt;
&lt;li&gt;Independência do framework Spring nos testes unitários&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Princípio Fail-Fast
&lt;/h3&gt;

&lt;p&gt;A injeção por campo permite a criação de objetos mesmo quando dependências obrigatórias não estão disponíveis, resultando em &lt;code&gt;NullPointerException&lt;/code&gt; apenas durante a execução. A injeção via construtor impede a criação do objeto sem suas dependências, tornando problemas visíveis imediatamente durante a inicialização da aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Imutabilidade e Thread Safety
&lt;/h3&gt;

&lt;p&gt;Apenas através da injeção via construtor é possível definir campos de dependência como &lt;code&gt;final&lt;/code&gt;. Esta imutabilidade oferece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Segurança de thread&lt;/strong&gt;: Campos final são thread-safe por natureza&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevenção de efeitos colaterais&lt;/strong&gt;: Impossibilita modificações acidentais das dependências&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clareza conceitual&lt;/strong&gt;: Facilita o raciocínio sobre o estado dos objetos&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Detecção Precoce de Dependências Circulares
&lt;/h3&gt;

&lt;p&gt;Ciclos de dependência são detectados imediatamente durante a inicialização dos beans quando se utiliza injeção via construtor. Com injeção por campo, esses problemas podem permanecer ocultos até a execução específica do código afetado.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Incentivo ao Bom Design
&lt;/h3&gt;

&lt;p&gt;A injeção via construtor evidencia classes com muitas dependências, naturalmente incentivando a aplicação do &lt;strong&gt;Princípio da Responsabilidade Única (SRP)&lt;/strong&gt;. Construtores com muitos parâmetros sinalizam a necessidade de refatoração e decomposição de responsabilidades.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Alinhamento com Práticas Modernas do Spring
&lt;/h3&gt;

&lt;p&gt;Desde o Spring 4.3, o framework suporta injeção automática via construtor para classes com construtor único, dispensando a anotação &lt;code&gt;@Autowired&lt;/code&gt;. Esta é a abordagem oficialmente recomendada pela equipe do Spring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementação Prática
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Padrão Recomendado (Sem Lombok)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;OrderRepository&lt;/span&gt; &lt;span class="n"&gt;orderRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;NotificationService&lt;/span&gt; &lt;span class="n"&gt;notificationService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;OrderService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OrderRepository&lt;/span&gt; &lt;span class="n"&gt;orderRepository&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
                       &lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                       &lt;span class="nc"&gt;NotificationService&lt;/span&gt; &lt;span class="n"&gt;notificationService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orderRepository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;orderRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paymentService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;notificationService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;notificationService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// métodos da classe...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Com Lombok (Quando Apropriado)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="nd"&gt;@RequiredArgsConstructor&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;OrderRepository&lt;/span&gt; &lt;span class="n"&gt;orderRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;NotificationService&lt;/span&gt; &lt;span class="n"&gt;notificationService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// métodos da classe...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Estratégia de Migração
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Para Código Legado
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Priorização&lt;/strong&gt;: Inicie por classes críticas e com maior cobertura de testes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refatoração gradual&lt;/strong&gt;: Migre uma classe por vez para minimizar riscos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes de regressão&lt;/strong&gt;: Garanta que a funcionalidade permanece inalterada&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validação&lt;/strong&gt;: Verifique se não há dependências circulares expostas&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Para Novos Desenvolvimentos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Adote injeção via construtor como padrão desde o início&lt;/li&gt;
&lt;li&gt;Configure linters e ferramentas de análise estática para detectar uso de &lt;code&gt;@Autowired&lt;/code&gt; em campos&lt;/li&gt;
&lt;li&gt;Estabeleça como prática obrigatória em code reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Considerações Especiais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dependências Opcionais
&lt;/h3&gt;

&lt;p&gt;Para dependências opcionais, utilize &lt;code&gt;@Autowired(required = false)&lt;/code&gt; no construtor ou considere padrões como Optional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;UserRepository&lt;/span&gt; &lt;span class="n"&gt;userRepository&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
                   &lt;span class="nd"&gt;@Autowired&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;CacheService&lt;/span&gt; &lt;span class="n"&gt;cacheService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;userRepository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cacheService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofNullable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cacheService&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;A injeção via construtor não apresenta overhead significativo em relação à injeção por campo. Os benefícios em qualidade e manutenibilidade superam amplamente qualquer diferença marginal de performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A adoção da injeção via construtor representa um investimento na qualidade de longo prazo do código. Os benefícios em testabilidade, clareza, robustez e alinhamento com as melhores práticas do Spring justificam plenamente essa transição.&lt;/p&gt;

&lt;p&gt;Esta mudança não é apenas uma questão de preferência pessoal, mas uma evolução natural em direção a um código mais robusto, testável e maintível, alinhado com os princípios modernos de desenvolvimento de software.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências Bibliográficas
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.baeldung.com/java-spring-field-injection-cons" rel="noopener noreferrer"&gt;Why Field Injection is Not Recommended - Baeldung&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@umeshcapg/why-spring-developers-prefers-constructor-injection-vs-3816f3972d71" rel="noopener noreferrer"&gt;Why Spring Developers Prefer Constructor Injection - Umesh Kumar Yadav&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@mesfandiari77/a-deep-dive-into-why-autowired-can-harm-your-spring-application-77481ffb9574" rel="noopener noreferrer"&gt;A Deep Dive Into Why @Autowired Can Harm Your Spring Application - MEsfandiari&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@himanshu675/stop-using-autowired-in-spring-heres-why-it-s-doing-more-harm-than-good-e0399a9ac292" rel="noopener noreferrer"&gt;Stop Using @Autowired in Spring - Himanshu&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@kariapratham/why-you-should-stop-using-autowired-in-spring-7b2335e0e6cf" rel="noopener noreferrer"&gt;Why You Should Stop Using @Autowired in Spring - Pratham Karia&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@dulanjayasandaruwan1998/spring-doesnt-recommend-autowired-anymore-05fc05309dad" rel="noopener noreferrer"&gt;Spring Doesn't Recommend @Autowired Anymore - Dulan Jaya Sandaruwan&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Maratona de Testes Automatizados — Step 1: Testes Unitários</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Sun, 08 Jun 2025 16:55:13 +0000</pubDate>
      <link>https://dev.to/diegobrandao/maratona-de-testes-automatizados-step-1-testes-unitarios-1kee</link>
      <guid>https://dev.to/diegobrandao/maratona-de-testes-automatizados-step-1-testes-unitarios-1kee</guid>
      <description>&lt;h1&gt;
  
  
  Maratona de Testes em Java: Da Teoria à Prática
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Step 1: Testes Unitários - A Base Sólida da Pirâmide de Testes
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Índice
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Por que testes unitários são fundamentais?&lt;/li&gt;
&lt;li&gt;O que realmente define um teste unitário?&lt;/li&gt;
&lt;li&gt;O que exatamente devemos testar?&lt;/li&gt;
&lt;li&gt;Estruturando seus testes com clareza&lt;/li&gt;
&lt;li&gt;As ferramentas do ofício: JUnit e Mockito&lt;/li&gt;
&lt;li&gt;Exemplo completo: Testando um Controller REST&lt;/li&gt;
&lt;li&gt;Solitary vs. Sociable: Duas abordagens&lt;/li&gt;
&lt;li&gt;DRY vs. DAMP nos testes&lt;/li&gt;
&lt;li&gt;Evitando armadilhas comuns&lt;/li&gt;
&lt;li&gt;Práticas avançadas e técnicas eficazes&lt;/li&gt;
&lt;li&gt;Integração Contínua&lt;/li&gt;
&lt;li&gt;Lições finais&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;li&gt;Recursos recomendados&lt;/li&gt;
&lt;li&gt;Referências Bibliográficas&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Por que testes unitários são fundamentais?
&lt;/h3&gt;

&lt;p&gt;Testes unitários são como os alicerces de um edifício: invisíveis para o usuário final, mas absolutamente essenciais para a integridade e sustentação de todo o sistema. Eles são a base da "Pirâmide de Testes", um conceito desenvolvido por Mike Cohn que organiza os testes em camadas de diferentes granularidades, indicando também quantos testes devemos ter em cada uma dessas camadas.&lt;/p&gt;

&lt;p&gt;No artigo "The Practical Test Pyramid", Ham Vocke destaca que "seus testes unitários serão muito rápidos. Em uma máquina razoável, você poderá rodar milhares deles em poucos minutos." Esta velocidade é crucial para o desenvolvimento ágil, permitindo que você obtenha feedback praticamente instantâneo sobre suas alterações de código.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que realmente define um teste unitário?
&lt;/h3&gt;

&lt;p&gt;Um teste unitário eficaz possui estas características essenciais:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;th&gt;Por quê isso importa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⚡ Rápido&lt;/td&gt;
&lt;td&gt;Executa em milissegundos&lt;/td&gt;
&lt;td&gt;Permite feedback imediato durante o desenvolvimento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧩 Isolado&lt;/td&gt;
&lt;td&gt;Sem dependência externa (rede, banco, disco)&lt;/td&gt;
&lt;td&gt;Evita falhas por causas externas à unidade testada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄 Determinístico&lt;/td&gt;
&lt;td&gt;Sempre produz o mesmo resultado&lt;/td&gt;
&lt;td&gt;Elimina testes "flaky" (instáveis)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎯 Focado&lt;/td&gt;
&lt;td&gt;Verifica uma única lógica ou comportamento&lt;/td&gt;
&lt;td&gt;Facilita identificar exatamente o que falhou&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📖 Legível&lt;/td&gt;
&lt;td&gt;Clara separação entre cenário e verificação&lt;/td&gt;
&lt;td&gt;Permite manutenção e entendimento a longo prazo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Como Ham Vocke menciona, "teste pequenas partes da sua base de código em isolamento e evite acessar bancos de dados, o sistema de arquivos ou fazer requisições HTTP." Este isolamento é o que torna os testes unitários verdadeiramente "unitários".&lt;/p&gt;

&lt;h3&gt;
  
  
  O que exatamente devemos testar?
&lt;/h3&gt;

&lt;p&gt;Segundo Vocke, "você pode escrever testes unitários para todas as classes do seu código de produção, independentemente da funcionalidade delas." Isso significa que quase tudo pode e deve ser testado unitariamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Classes de domínio&lt;/strong&gt; com regras de negócio&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Controllers&lt;/strong&gt; (testar mapeamentos e respostas)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Services&lt;/strong&gt; (testar fluxos e orquestrações)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Repositórios&lt;/strong&gt; com lógica própria&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Utils, validators, formatters&lt;/strong&gt; (funções de propósito específico)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O importante é focar no &lt;em&gt;comportamento observável&lt;/em&gt; da unidade, não em sua implementação interna. Como Vocke recomenda, devemos "testar para o comportamento observável em vez de refletir a estrutura interna do código em nossos testes."&lt;/p&gt;

&lt;h3&gt;
  
  
  Estruturando seus testes com clareza
&lt;/h3&gt;

&lt;p&gt;Ham Vocke destaca duas formas eficazes de estruturar testes, que ele chama de "uma boa estrutura para todos os seus testes":&lt;/p&gt;

&lt;h4&gt;
  
  
  📐 1. Arrange → Act → Assert
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveCalcularValorTotalComDesconto&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Arrange - Prepara o cenário&lt;/span&gt;
    &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Notebook"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2000.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;clienteVip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"João"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;TipoCliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VIP&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Act - Executa a ação&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valorFinal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculadoraPreco&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calcular&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clienteVip&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Assert - Verifica o resultado&lt;/span&gt;
    &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1800.0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valorFinal&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  💬 2. Given → When → Then (estilo BDD)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;clienteVipDeveReceberDescontoEspecial&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Given - Dado um cliente VIP e um produto&lt;/span&gt;
    &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;clienteVip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Maria"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;TipoCliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VIP&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Smartphone"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1000.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// When - Quando calcular o preço final&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valorFinal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculadoraPreco&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calcular&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clienteVip&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Then - Então deve aplicar 10% de desconto&lt;/span&gt;
    &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;900.0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valorFinal&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vocke sugere que este padrão "pode ser aplicado a outros testes de nível mais alto também. Em todos os casos, eles garantem que seus testes permaneçam fáceis e consistentes de ler."&lt;/p&gt;

&lt;h3&gt;
  
  
  As ferramentas do ofício: JUnit e Mockito
&lt;/h3&gt;

&lt;h4&gt;
  
  
  JUnit 5
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.junit.jupiter.api.Test&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.junit.jupiter.api.BeforeEach&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.junit.jupiter.api.DisplayName&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;junit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jupiter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Assertions&lt;/span&gt;&lt;span class="o"&gt;.*;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CalculadoraTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@BeforeEach&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;calc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="nd"&gt;@DisplayName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Soma de dois números positivos"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveSomarDoisNumerosPositivos&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Act&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;somar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Assert&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="nd"&gt;@DisplayName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Divisão por zero deve lançar exceção"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveLancarExcecaoAoDividirPorZero&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Assert + Act (verificando exceção)&lt;/span&gt;
        &lt;span class="n"&gt;assertThrows&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ArithmeticException&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dividir&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;});&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Mockito
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.junit.jupiter.api.Test&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.junit.jupiter.api.extension.ExtendWith&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mockito.InjectMocks&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mockito.Mock&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mockito.junit.jupiter.MockitoExtension&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mockito&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Mockito&lt;/span&gt;&lt;span class="o"&gt;.*;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;junit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jupiter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Assertions&lt;/span&gt;&lt;span class="o"&gt;.*;&lt;/span&gt;

&lt;span class="nd"&gt;@ExtendWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MockitoExtension&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PedidoServiceTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Mock&lt;/span&gt;
    &lt;span class="nc"&gt;DescontoService&lt;/span&gt; &lt;span class="n"&gt;descontoService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Mock&lt;/span&gt;
    &lt;span class="nc"&gt;EmailService&lt;/span&gt; &lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@InjectMocks&lt;/span&gt;
    &lt;span class="nc"&gt;PedidoService&lt;/span&gt; &lt;span class="n"&gt;pedidoService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveAplicarDescontoAoFinalizarPedido&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Arrange&lt;/span&gt;
        &lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Pedido&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1L&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;descontoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calcularDesconto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="o"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;thenReturn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Act&lt;/span&gt;
        &lt;span class="n"&gt;pedidoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;finalizarPedido&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Assert&lt;/span&gt;
        &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;90.0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getValorTotal&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;verify&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emailService&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;enviarConfirmacao&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exemplo completo: Testando um Controller REST
&lt;/h3&gt;

&lt;p&gt;Vamos ver um exemplo prático de como testar um controller REST em Spring Boot:&lt;/p&gt;

&lt;h4&gt;
  
  
  O Controller em produção
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/produtos"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProdutoController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ProdutoService&lt;/span&gt; &lt;span class="n"&gt;produtoService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ProdutoController&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProdutoService&lt;/span&gt; &lt;span class="n"&gt;produtoService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;produtoService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;produtoService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProdutoDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;buscarPorId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;produtoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buscarPorId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProdutoDTO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;notFound&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@PostMapping&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProdutoDTO&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;criar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestBody&lt;/span&gt; &lt;span class="nd"&gt;@Valid&lt;/span&gt; &lt;span class="nc"&gt;ProdutoRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;produtoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;criar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPreco&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;created&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/produtos/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProdutoDTO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Teste unitário com MockMVC
&lt;/h4&gt;

&lt;p&gt;Ham Vocke explica que ferramentas como MockMVC são importantes porque "Spring MVC's controller faz uso intensivo de anotações para declarar em quais caminhos eles estão escutando, quais verbos HTTP usar, quais parâmetros eles analisam do caminho da URL ou parâmetros de consulta e assim por diante. Simplesmente invocar um método do controller em seus testes unitários não testará todas essas coisas cruciais."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ExtendWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MockitoExtension&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProdutoControllerTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;MockMvc&lt;/span&gt; &lt;span class="n"&gt;mockMvc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Mock&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;ProdutoService&lt;/span&gt; &lt;span class="n"&gt;produtoService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@InjectMocks&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;ProdutoController&lt;/span&gt; &lt;span class="n"&gt;produtoController&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@BeforeEach&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mockMvc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MockMvcBuilders&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;standaloneSetup&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produtoController&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveRetornarProdutoQuandoExistir&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Arrange&lt;/span&gt;
        &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Teclado Mecânico"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;350.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1L&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produtoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buscarPorId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1L&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenReturn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

        &lt;span class="c1"&gt;// Act &amp;amp; Assert&lt;/span&gt;
        &lt;span class="n"&gt;mockMvc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;perform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/produtos/1"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;isOk&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"$.nome"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Teclado Mecânico"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"$.preco"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;350.0&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveRetornarNotFoundQuandoProdutoNaoExistir&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Arrange&lt;/span&gt;
        &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produtoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buscarPorId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;99L&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenReturn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;empty&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

        &lt;span class="c1"&gt;// Act &amp;amp; Assert&lt;/span&gt;
        &lt;span class="n"&gt;mockMvc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;perform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/produtos/99"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;isNotFound&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveCriarNovoProduto&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Arrange&lt;/span&gt;
        &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produtoParaSalvar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Mouse"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;89.9&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produtoSalvo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Mouse"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;89.9&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;produtoSalvo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42L&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produtoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;criar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenReturn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produtoSalvo&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Act &amp;amp; Assert&lt;/span&gt;
        &lt;span class="n"&gt;mockMvc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;perform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/produtos"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contentType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION_JSON&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{\"nome\":\"Mouse\",\"preco\":89.9}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;isCreated&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;string&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Location"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/api/produtos/42"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"$.nome"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Mouse"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
            &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;andExpect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jsonPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"$.preco"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;89.9&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Solitary vs. Sociable: Duas abordagens para testes unitários
&lt;/h3&gt;

&lt;p&gt;Segundo Vocke, "alguns argumentam que todos os colaboradores da sua unidade sob teste devem ser substituídos por mocks ou stubs", enquanto "outros argumentam que apenas colaboradores que são lentos ou têm efeitos colaterais maiores deveriam ser substituídos por stubs ou mocks."&lt;/p&gt;

&lt;p&gt;Este conceito foi criado por Jay Fields em seu livro "Working Effectively with Unit Tests", que cunhou os termos "testes unitários solitários" para testes que substituem todos os colaboradores, e "testes unitários sociáveis" para testes que permitem interações com colaboradores reais.&lt;/p&gt;

&lt;p&gt;Ham Vocke confessa: "Eu me vejo usando ambas as abordagens o tempo todo. Se se torna estranho usar colaboradores reais, usarei mocks e stubs generosamente. Se eu sentir que envolver o colaborador real me dá mais confiança em um teste, apenas faço stub das partes mais externas do meu serviço."&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo de teste solitário (com mocks)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveCalcularImpostoSobreVendaComMocks&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Arrange&lt;/span&gt;
    &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valorBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1000.00"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Mockando todas as dependências&lt;/span&gt;
    &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aliquotaService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buscarAliquota&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SP"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenReturn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"0.18"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

    &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;descontoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calcularDesconto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valorBase&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenReturn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"100.00"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

    &lt;span class="c1"&gt;// Act&lt;/span&gt;
    &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;imposto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculadoraImpostoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calcular&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valorBase&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"SP"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Assert&lt;/span&gt;
    &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"162.00"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;imposto&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// (1000 - 100) * 0.18&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Exemplo de teste sociável (com colaboradores reais)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveCalcularImpostoSobreVendaComColaboradoresReais&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Arrange&lt;/span&gt;
    &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valorBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1000.00"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Usando implementação real do serviço de desconto&lt;/span&gt;
    &lt;span class="nc"&gt;DescontoService&lt;/span&gt; &lt;span class="n"&gt;descontoServiceReal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DescontoServiceImpl&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Ainda mockando o serviço de alíquota (externo)&lt;/span&gt;
    &lt;span class="nc"&gt;AliquotaService&lt;/span&gt; &lt;span class="n"&gt;aliquotaMock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mock&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AliquotaService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;when&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aliquotaMock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;buscarAliquota&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SP"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thenReturn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"0.18"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

    &lt;span class="c1"&gt;// Injetando uma mistura de dependências reais e mockadas&lt;/span&gt;
    &lt;span class="nc"&gt;CalculadoraImpostoService&lt;/span&gt; &lt;span class="n"&gt;calculadora&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CalculadoraImpostoServiceImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;descontoServiceReal&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aliquotaMock&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Act&lt;/span&gt;
    &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;imposto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculadora&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calcular&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valorBase&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"SP"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Assert&lt;/span&gt;
    &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"180.00"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;imposto&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Considerando que o desconto real é 0&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  DRY vs. DAMP nos testes: Equilibrando clareza e repetição
&lt;/h3&gt;

&lt;p&gt;Ham Vocke alerta: "Não tente ser excessivamente DRY (Don't Repeat Yourself). Duplicação é aceitável se melhorar a legibilidade."&lt;/p&gt;

&lt;p&gt;Em testes, muitas vezes é melhor priorizar a clareza em vez da não-repetição. Um acrônimo útil para recordar é DAMP: &lt;strong&gt;D&lt;/strong&gt;escriptive &lt;strong&gt;A&lt;/strong&gt;nd &lt;strong&gt;M&lt;/strong&gt;eaningful &lt;strong&gt;P&lt;/strong&gt;hrases.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo questionável (muito DRY):
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Definição central, reusada em todos os testes&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;clienteVip&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produtoPadrao&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@BeforeEach&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;clienteVip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"João"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;TipoCliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VIP&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;produtoPadrao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Item"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveAplicarDescontoVipEmProduto&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;90.0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calculadoraPreco&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calcular&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produtoPadrao&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clienteVip&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveIncluirFreteGratisPara&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;beneficioService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;temFreteGratis&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clienteVip&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;produtoPadrao&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Exemplo melhor (mais DAMP):
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveAplicarDescontoVipEmProduto&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Arrange - Dados específicos para este teste&lt;/span&gt;
    &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;clienteVip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"João"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;TipoCliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VIP&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;notebook&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Notebook"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2000.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Act&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valorComDesconto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculadoraPreco&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calcular&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;notebook&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clienteVip&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Assert - Expectativa clara&lt;/span&gt;
    &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1800.0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valorComDesconto&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
                &lt;span class="s"&gt;"Cliente VIP deve receber 10% de desconto"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveIncluirFreteGratisPara&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Arrange - Dados específicos para este teste&lt;/span&gt;
    &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;clienteVip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Maria"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;TipoCliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VIP&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;smartTV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Smart TV"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1500.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Act&lt;/span&gt;
    &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;temFreteGratis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;beneficioService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;temFreteGratis&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clienteVip&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;smartTV&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Assert - Expectativa clara&lt;/span&gt;
    &lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temFreteGratis&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
              &lt;span class="s"&gt;"Cliente VIP deve ter frete grátis independente do produto"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Evitando armadilhas comuns
&lt;/h3&gt;

&lt;h4&gt;
  
  
  "Mas eu preciso testar este método privado!"
&lt;/h4&gt;

&lt;p&gt;Ham Vocke alerta: "Se você já se encontrou em uma situação em que realmente precisa testar um método privado, você deve dar um passo atrás e se perguntar por quê." Ele continua: "Estou bastante certo de que isso é mais um problema de design do que um problema de escopo."&lt;/p&gt;

&lt;p&gt;Quando você sente essa necessidade, geralmente há um problema de design da classe — ela provavelmente está fazendo muitas coisas e violando o princípio da responsabilidade única.&lt;/p&gt;

&lt;p&gt;A solução mais elegante:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Antes: Classe grande com método privado complexo&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FaturamentoService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;calcular&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica...&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;calcularImpostos&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valorBase&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// método privado complexo&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;calcularImpostos&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica complexa de cálculo de impostos&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Depois: Extrair para uma classe dedicada com interface pública&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FaturamentoService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ImpostoCalculator&lt;/span&gt; &lt;span class="n"&gt;impostoCalculator&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;FaturamentoService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ImpostoCalculator&lt;/span&gt; &lt;span class="n"&gt;impostoCalculator&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;impostoCalculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;impostoCalculator&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;calcular&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica...&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;impostoCalculator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;calcular&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valorBase&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Agora é público!&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ImpostoCalculator&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;calcular&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// mesma lógica complexa, agora testável&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  "Preciso ter 100% de cobertura!"
&lt;/h4&gt;

&lt;p&gt;Vocke argumenta contra testar código trivial: "Sim, você deve testar a interface pública. Mais importante, no entanto, você não testa código trivial. Não se preocupe, Kent Beck disse que tudo bem. Você não ganhará nada testando getters ou setters simples ou outras implementações triviais."&lt;/p&gt;

&lt;p&gt;Focar em cobertura por si só pode levar a testes ruins que não adicionam valor. Busque qualidade em vez de quantidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Práticas avançadas e técnicas eficazes
&lt;/h3&gt;

&lt;p&gt;À medida que você ganha experiência em testes unitários, algumas técnicas avançadas podem ajudar a tornar seus testes mais elegantes, legíveis e fáceis de manter. Vejamos três técnicas importantes que podem elevar significativamente a qualidade da sua suite de testes.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Dados de teste expressivos
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;O que é:&lt;/strong&gt; Métodos de fábrica (factory methods) ou objetos builders que criam dados de teste com nomes semânticos, em vez de usar configurações inline de objetos diretamente nos testes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando usar:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando os objetos de teste têm muitas propriedades que precisam ser configuradas&lt;/li&gt;
&lt;li&gt;Quando você repete a mesma configuração de objetos em vários testes&lt;/li&gt;
&lt;li&gt;Quando a configuração obscurece a intenção principal do teste&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefícios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foco no "o quê" está sendo testado, não no "como" os objetos são criados&lt;/li&gt;
&lt;li&gt;Leitura mais natural - o nome do método descreve o cenário&lt;/li&gt;
&lt;li&gt;Encapsulamento de detalhes irrelevantes para a intenção do teste&lt;/li&gt;
&lt;li&gt;Fácil reutilização entre testes similares
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ruim: Dados aleatórios desconexos&lt;/span&gt;
&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveAprovarCreditoParaClienteBomPagador&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;cliente&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"X123"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setScoreCredito&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;750&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRendaMensal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5000.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;aprovado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;creditoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;analisarCredito&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10000.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aprovado&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Melhor: Nome do método de fábrica expressivo&lt;/span&gt;
&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveAprovarCreditoParaClienteBomPagador&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;clienteBomPagador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;criarClienteComBomHistoricoCredito&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;aprovado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;creditoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;analisarCredito&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clienteBomPagador&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10000.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aprovado&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="nf"&gt;criarClienteComBomHistoricoCredito&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;cliente&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Maria"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setScoreCredito&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;750&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRendaMensal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5000.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode evoluir para padrões mais sofisticados como builders fluentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Usando um builder expressivo&lt;/span&gt;
&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveAprovarCreditoParaClienteBomPagador&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;clienteBomPagador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ClienteBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;padrao&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;comBomHistoricoCredito&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;comRendaAdequada&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;aprovado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;creditoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;analisarCredito&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clienteBomPagador&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;10000.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aprovado&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Assertion libraries expressivas
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;O que são:&lt;/strong&gt; Bibliotecas que oferecem uma sintaxe mais fluente e legível para verificações, substituindo os métodos padrão do JUnit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando usar:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para verificações complexas ou múltiplas em um único objeto&lt;/li&gt;
&lt;li&gt;Quando se deseja uma leitura mais próxima da linguagem natural&lt;/li&gt;
&lt;li&gt;Para verificações de coleções, onde se quer verificar múltiplos aspectos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bibliotecas populares:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AssertJ: fluente e orientada a objetos&lt;/li&gt;
&lt;li&gt;Hamcrest: baseada em matchers&lt;/li&gt;
&lt;li&gt;Truth (Google): alternativa simples e expressiva&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefícios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testes mais legíveis, quase como frases em inglês&lt;/li&gt;
&lt;li&gt;Mensagens de erro mais descritivas quando falham&lt;/li&gt;
&lt;li&gt;Encadeamento de verificações reduz duplicação&lt;/li&gt;
&lt;li&gt;Maior expressividade para casos complexos
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// JUnit padrão - Funcionais mas menos expressivas&lt;/span&gt;
&lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"item1"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isAtivo&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// AssertJ - Mais fluente e expressivo&lt;/span&gt;
&lt;span class="n"&gt;assertThat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasSize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"item1"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;doesNotContain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"item99"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;assertThat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isAtivo&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;isTrue&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando um teste falha, a mensagem de erro com AssertJ é mais informativa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected size:&amp;lt;3&amp;gt; but was:&amp;lt;2&amp;gt;
Expected to contain:&amp;lt;"item1"&amp;gt; but did not
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Testes parametrizados para casos similares
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;O que são:&lt;/strong&gt; Testes que executam o mesmo código com diferentes entradas e expectativas de saída, gerando automaticamente múltiplos casos de teste a partir de uma única definição.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando usar:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para testar múltiplas variações de um mesmo caso (comportamento com diferentes entradas)&lt;/li&gt;
&lt;li&gt;Para regras de negócio que têm muitos casos específicos (ex: cálculos tributários)&lt;/li&gt;
&lt;li&gt;Quando a lógica é a mesma, mas os dados variam&lt;/li&gt;
&lt;li&gt;Para evitar duplicação de código em testes semelhantes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefícios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redução drástica de código duplicado&lt;/li&gt;
&lt;li&gt;Facilidade para adicionar novos casos de teste&lt;/li&gt;
&lt;li&gt;Documentação clara de todos os casos suportados&lt;/li&gt;
&lt;li&gt;Facilita identificar quais casos específicos falharam
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ParameterizedTest&lt;/span&gt;
&lt;span class="nd"&gt;@CsvSource&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt;
    &lt;span class="s"&gt;"SP, 0.18"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"RJ, 0.20"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"MG, 0.17"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"RS, 0.17"&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;deveCalcularImpostoCorretoPorEstado&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;aliquotaEsperada&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Arrange&lt;/span&gt;
    &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Genérico"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Act&lt;/span&gt;
    &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;aliquota&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;impostoService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;obterAliquota&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Assert&lt;/span&gt;
    &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aliquotaEsperada&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aliquota&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O JUnit 5 suporta múltiplas fontes de dados para testes parametrizados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@ValueSource&lt;/code&gt;: para listas simples de valores (&lt;code&gt;@ValueSource(ints = {1, 2, 3})&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@CsvSource&lt;/code&gt;: para pares ou tuplas de valores como mostrado acima&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@EnumSource&lt;/code&gt;: para testar com valores de um enum&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@MethodSource&lt;/code&gt;: para casos complexos onde os dados são gerados por um método&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@ArgumentsSource&lt;/code&gt;: para implementações personalizadas de geradores de dados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas técnicas avançadas são particularmente úteis quando sua base de código cresce e você precisa manter um conjunto grande de testes. Elas ajudam a reduzir a duplicação, melhorar a legibilidade e facilitar a manutenção a longo prazo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integração Contínua: Executando testes unitários automaticamente
&lt;/h3&gt;

&lt;p&gt;Os testes unitários devem ser executados:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Localmente&lt;/strong&gt; antes de commit/push&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Na CI&lt;/strong&gt; em cada push para qualquer branch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antes de merge&lt;/strong&gt; para branches principais&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este feedback rápido é possível graças à velocidade dos testes unitários.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lições finais
&lt;/h3&gt;

&lt;p&gt;Ham Vocke resume bem: "Uma vez que você pegar o jeito de escrever testes unitários, você se tornará cada vez mais fluente em escrevê-los. Substitua colaboradores externos por stubs, configure alguns dados de entrada, chame seu assunto sob teste e verifique se o valor retornado é o que você esperava."&lt;/p&gt;

&lt;p&gt;Testes unitários são um investimento que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏱️ Economiza tempo a longo prazo&lt;/li&gt;
&lt;li&gt;🔒 Permite refatorações com segurança&lt;/li&gt;
&lt;li&gt;📚 Documenta o comportamento esperado&lt;/li&gt;
&lt;li&gt;💻 Melhora o design do código&lt;/li&gt;
&lt;li&gt;🧠 Reduz a carga cognitiva ao desenvolver&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Como resumido no artigo de referência: "O código de teste é tão importante quanto o código de produção. Dê a ele o mesmo nível de cuidado e atenção. 'Isso é apenas código de teste' não é uma desculpa válida para justificar código desleixado."&lt;/p&gt;

&lt;p&gt;Ao dominar a arte dos testes unitários, você estabelece a base sólida para construir um sistema robusto e confiável, que pode evoluir com segurança ao longo do tempo.&lt;/p&gt;

&lt;p&gt;No próximo passo da nossa maratona, abordaremos testes de integração - a camada intermediária da pirâmide de testes que verifica como seus componentes trabalham juntos.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recursos recomendados
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📕 "Working Effectively with Unit Tests" por Jay Fields&lt;/li&gt;
&lt;li&gt;📗 "Test Driven Development: By Example" por Kent Beck&lt;/li&gt;
&lt;li&gt;📘 "Clean Code" por Robert C. Martin (capítulo sobre testes)&lt;/li&gt;
&lt;li&gt;🌐 Documentação oficial do JUnit 5&lt;/li&gt;
&lt;li&gt;🌐 Documentação oficial do Mockito&lt;/li&gt;
&lt;li&gt;🌐 Documentação oficial do AssertJ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Referências Bibliográficas
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Vocke, Ham. (2018). "The Practical Test Pyramid". &lt;em&gt;Martin Fowler&lt;/em&gt;. Disponível em: &lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/practical-test-pyramid.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cohn, Mike. (2009). "Succeeding with Agile: Software Development Using Scrum". Addison-Wesley Professional.&lt;/li&gt;
&lt;li&gt;Fields, Jay. (2014). "Working Effectively with Unit Tests". Leanpub.&lt;/li&gt;
&lt;li&gt;Beck, Kent. (2002). "Test Driven Development: By Example". Addison-Wesley Professional.&lt;/li&gt;
&lt;li&gt;Martin, Robert C. (2008). "Clean Code: A Handbook of Agile Software Craftsmanship". Prentice Hall.&lt;/li&gt;
&lt;li&gt;Fowler, Martin. (2006). "Mocks Aren't Stubs". &lt;em&gt;MartinFowler.com&lt;/em&gt;. Disponível em: &lt;a href="https://martinfowler.com/articles/mocksArentStubs.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/mocksArentStubs.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Spring Framework Documentation. "Testing". Disponível em: &lt;a href="https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html" rel="noopener noreferrer"&gt;https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JUnit 5 User Guide. Disponível em: &lt;a href="https://junit.org/junit5/docs/current/user-guide/" rel="noopener noreferrer"&gt;https://junit.org/junit5/docs/current/user-guide/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Mockito Reference Documentation. Disponível em: &lt;a href="https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html" rel="noopener noreferrer"&gt;https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AssertJ Documentation. Disponível em: &lt;a href="https://assertj.github.io/doc/" rel="noopener noreferrer"&gt;https://assertj.github.io/doc/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>testing</category>
    </item>
    <item>
      <title>Maratona de Testes Automatizados — Step 0: Fundamentos, Importância e a Pirâmide de Testes</title>
      <dc:creator>Diego de Sousa Brandão</dc:creator>
      <pubDate>Tue, 06 May 2025 02:55:38 +0000</pubDate>
      <link>https://dev.to/diegobrandao/maratona-de-testes-automatizados-step-0-fundamentos-importancia-e-a-piramide-de-testes-3i6n</link>
      <guid>https://dev.to/diegobrandao/maratona-de-testes-automatizados-step-0-fundamentos-importancia-e-a-piramide-de-testes-3i6n</guid>
      <description>&lt;h2&gt;
  
  
  Step 0: Fundamentos, Importância e a Pirâmide de Testes
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Índice
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Por que testamos software?&lt;/li&gt;
&lt;li&gt;Entendendo a Pirâmide de Testes&lt;/li&gt;
&lt;li&gt;O Anti-padrão: O Sorvete de Testes&lt;/li&gt;
&lt;li&gt;Duplicação Inteligente vs. Duplicação Desnecessária&lt;/li&gt;
&lt;li&gt;DRY vs. DAMP em Testes&lt;/li&gt;
&lt;li&gt;Testes de Caixa Branca vs. Caixa Preta&lt;/li&gt;
&lt;li&gt;Princípios Essenciais para Todos os Níveis&lt;/li&gt;
&lt;li&gt;O que vem a seguir?&lt;/li&gt;
&lt;li&gt;Referências Bibliográficas&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Por que testamos software?
&lt;/h3&gt;

&lt;p&gt;Testar software transcende a simples busca por defeitos — é fundamentalmente um ato de &lt;strong&gt;construir confiança&lt;/strong&gt;. Testes automatizados proporcionam a liberdade de evoluir o código sem receio, realizar refatorações profundas, validar integrações complexas, e entregar continuamente com a segurança de um sistema verificado.&lt;/p&gt;

&lt;p&gt;Como Ham Vocke observa no artigo "The Practical Test Pyramid":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Automating your repetitive tests can be a big game changer in your life as a software developer. Automate these tests and you no longer have to mindlessly follow click protocols in order to check if your software still works correctly. Automate your tests and you can change your codebase without batting an eye."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Automatizar seus testes repetitivos pode ser um grande divisor de águas na sua vida como desenvolvedor de software. Automatize esses testes e você não precisará mais seguir protocolos de cliques sem pensar para verificar se seu software ainda funciona corretamente. Automatize seus testes e você poderá mudar sua base de código sem piscar."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A automação de testes é transformadora precisamente porque liberta desenvolvedores de tarefas repetitivas e tediosas, convertendo-as em verificações automáticas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Testes manuais → Repetitivos → Tediosos → Propensos a erros → Lentos
Testes automatizados → Consistentes → Confiáveis → Rápidos → Confortantes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O impacto disso vai além da qualidade do software; reflete diretamente na qualidade de vida do desenvolvedor e na dinâmica das equipes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Entendendo a Pirâmide de Testes
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Pirâmide de Testes&lt;/strong&gt; (Test Pyramid) foi introduzida por &lt;strong&gt;Mike Cohn&lt;/strong&gt; em seu livro &lt;em&gt;Succeeding with Agile&lt;/em&gt;. Trata-se de uma metáfora visual poderosa que orienta a construção de uma suíte de testes balanceada, rápida e sustentável a longo prazo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkncykfgi8417hgvcxih3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkncykfgi8417hgvcxih3.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A pirâmide nos comunica dois conceitos fundamentais:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Diferentes níveis de granularidade&lt;/strong&gt;: Os testes são agrupados em categorias que variam de escopo, desde pequenos métodos isolados até o sistema completo integrado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Distribuição ideal&lt;/strong&gt;: Quanto mais subimos na pirâmide, menor deve ser a quantidade de testes, seguindo o princípio de "muitos testes rápidos e baratos na base, poucos testes caros e lentos no topo".&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Como Ham Vocke explica:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Write lots of small and fast unit tests. Write some more coarse-grained tests and very few high-level tests that test your application from end to end."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Escreva muitos testes unitários pequenos e rápidos. Escreva alguns testes mais abrangentes e muito poucos testes de alto nível que testem sua aplicação de ponta a ponta."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A estrutura contemporânea da pirâmide consiste em:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nível&lt;/th&gt;
&lt;th&gt;Tipo de Teste&lt;/th&gt;
&lt;th&gt;Características&lt;/th&gt;
&lt;th&gt;Quantidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;td&gt;Testes Unitários&lt;/td&gt;
&lt;td&gt;Rápidos, isolados, confiáveis&lt;/td&gt;
&lt;td&gt;Muitos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meio&lt;/td&gt;
&lt;td&gt;Testes de Integração&lt;/td&gt;
&lt;td&gt;Verificam comunicação entre componentes&lt;/td&gt;
&lt;td&gt;Moderada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Topo&lt;/td&gt;
&lt;td&gt;Testes E2E/UI&lt;/td&gt;
&lt;td&gt;Simulam comportamento do usuário&lt;/td&gt;
&lt;td&gt;Poucos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Esta distribuição não é acidental — reflete o equilíbrio econômico entre &lt;strong&gt;velocidade de feedback&lt;/strong&gt;, &lt;strong&gt;cobertura de cenários&lt;/strong&gt; e &lt;strong&gt;custo de manutenção&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nota sobre a Evolução da Pirâmide de Testes
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Esta seção complementa o entendimento sobre a Pirâmide de Testes, explicando sua evolução histórica.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É importante destacar que a Pirâmide de Testes que apresentamos neste artigo representa uma versão mais contemporânea e refinada do conceito original introduzido por Mike Cohn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Pirâmide Original de Cohn (2009)&lt;/strong&gt; consistia em três camadas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Base&lt;/strong&gt;: Testes Unitários (Unit Tests)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meio&lt;/strong&gt;: Testes de Serviço (Service Tests)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Topo&lt;/strong&gt;: Testes de Interface do Usuário (UI Tests)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkeuawovx25ut86oxnyv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkeuawovx25ut86oxnyv2.png" alt=" " width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O termo "Service Tests" usado por Cohn era um tanto ambíguo e causou confusão na comunidade de desenvolvimento. Ele se referia a testes que verificavam a funcionalidade sem passar pela interface do usuário, mas que podiam envolver múltiplos componentes ou módulos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Pirâmide Moderna&lt;/strong&gt; que apresentamos evoluiu para oferecer maior clareza e se adaptar às práticas atuais de desenvolvimento:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Base&lt;/strong&gt;: Testes Unitários (Unit Tests)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meio&lt;/strong&gt;: Testes de Integração (Integration Tests)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Topo&lt;/strong&gt;: Testes E2E/UI (End-to-End/UI Tests)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Por que a mudança?
&lt;/h3&gt;

&lt;p&gt;Esta evolução não foi apenas uma questão de terminologia, mas reflete mudanças fundamentais nas práticas de desenvolvimento:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maior granularidade&lt;/strong&gt;: A camada intermediária agora é geralmente subdividida para acomodar diferentes tipos de integrações (API, componentes, contratos).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Arquiteturas distribuídas&lt;/strong&gt;: Com a popularização de microsserviços e sistemas distribuídos, o conceito de "Service Tests" se tornou insuficiente para capturar a complexidade das integrações modernas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DevOps e CI/CD&lt;/strong&gt;: A automação completa de pipelines de entrega contínua demandou uma categorização mais precisa dos testes para otimizar velocidade e eficiência.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Práticas ágeis maduras&lt;/strong&gt;: A experiência acumulada nas últimas décadas permitiu refinar o modelo para melhor servir aos fluxos de trabalho modernos.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Martin Fowler e outros influentes profissionais da área contribuíram para esta evolução, resultando em uma pirâmide mais detalhada e adaptada às necessidades contemporâneas de desenvolvimento de software.&lt;/p&gt;

&lt;p&gt;A essência da metáfora original de Cohn permanece intacta: muitos testes rápidos na base, poucos testes lentos no topo. O refinamento da pirâmide representa nossa compreensão mais sofisticada de como implementar este princípio em contextos diversos e complexos.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Anti-padrão: O Sorvete de Testes
&lt;/h3&gt;

&lt;p&gt;Enquanto a pirâmide aponta para a estabilidade e eficiência, seu anti-padrão é o &lt;strong&gt;"Sorvete de Testes"&lt;/strong&gt; (Test Ice Cream Cone), termo cunhado por &lt;strong&gt;Alberto Savoia&lt;/strong&gt; e popularizado por &lt;strong&gt;Martin Fowler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvbmgm7zxcvdok8tg6ev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvbmgm7zxcvdok8tg6ev.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No sorvete de testes, a distribuição é invertida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A base (testes unitários) é pequena ou inexistente&lt;/li&gt;
&lt;li&gt;O meio (integração) é moderado&lt;/li&gt;
&lt;li&gt;O topo (UI/E2E) é excessivamente volumoso&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ham Vocke alerta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Watch out that you don't end up with a test ice-cream cone that will be a nightmare to maintain and takes way too long to run."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Tenha cuidado para não acabar com um sorvete de testes que será um pesadelo para manter e demorará muito tempo para executar."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As consequências desta distorção são severas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Feedback lento&lt;/strong&gt;: O ciclo de desenvolvimento se torna arrastado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagnóstico difícil&lt;/strong&gt;: Falhas são complexas de isolar e corrigir&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fragilidade&lt;/strong&gt;: Pequenas mudanças causam falhas em cascata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alto custo&lt;/strong&gt;: A manutenção consome recursos desproporcionais&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A regra prática é: quanto mais alto o teste na pirâmide, maior o custo de manutenção, tempo de execução e propensão a falhas intermitentes ("flaky tests").&lt;/p&gt;

&lt;h3&gt;
  
  
  Duplicação Inteligente vs. Duplicação Desnecessária
&lt;/h3&gt;

&lt;p&gt;Um equívoco comum é assumir que qualquer forma de duplicação de cobertura de testes é inaceitável. Ham Vocke apresenta uma visão mais equilibrada sobre este tema:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If a higher-level test gives you more confidence that your application works correctly, you should have it. Writing a unit test for a Controller class helps to test the logic within the Controller itself. Still, this won't tell you whether the REST endpoint this Controller provides actually responds to HTTP requests."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Se um teste de nível superior lhe dá mais confiança de que sua aplicação funciona corretamente, você deve tê-lo. Escrever um teste unitário para uma classe Controller ajuda a testar a lógica dentro do Controller em si. Ainda assim, isso não dirá se o endpoint REST que este Controller fornece realmente responde a requisições HTTP."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Existem dois tipos de duplicação em testes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duplicação inteligente&lt;/strong&gt;: Testa o mesmo comportamento, mas sob perspectivas diferentes e complementares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teste unitário: valida a lógica interna&lt;/li&gt;
&lt;li&gt;Teste de integração: valida a comunicação entre componentes&lt;/li&gt;
&lt;li&gt;Teste E2E: valida o fluxo completo sob a perspectiva do usuário&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Duplicação desnecessária&lt;/strong&gt;: Testa exatamente o mesmo aspecto em múltiplos níveis, sem valor agregado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repetir todos os casos de borda e condicionais em todos os níveis da pirâmide&lt;/li&gt;
&lt;li&gt;Duplicar testes de validação em múltiplas camadas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ham Vocke recomenda:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If you have tested all conditions confidently on a lower-level test, there's no need to keep a higher-level test in your test suite."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Se você testou todas as condições com confiança em um teste de nível inferior, não há necessidade de manter um teste de nível superior em sua suíte de testes."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isto nos leva a duas regras práticas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Se um teste de nível superior encontra um erro e não há teste de nível inferior falhando, &lt;strong&gt;você precisa escrever um teste de nível inferior&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Priorize a implementação de testes nos &lt;strong&gt;níveis mais baixos da pirâmide, sempre que possível.&lt;/strong&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  DRY vs. DAMP em Testes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DRY (Don't Repeat Yourself)&lt;/strong&gt; é um princípio fundamental da engenharia de software, mas em testes, existe uma tensão com outro princípio: &lt;strong&gt;DAMP (Descriptive And Meaningful Phrases)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ham Vocke observa:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Don't try to be overly DRY. Duplication is okay, if it improves readability. Try to find a balance between DRY and DAMP code."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Não tente ser excessivamente DRY. Duplicação é aceitável, se melhorar a legibilidade. Tente encontrar um equilíbrio entre código DRY e DAMP."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esta visão reflete uma maturidade na abordagem dos testes automatizados:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Princípio&lt;/th&gt;
&lt;th&gt;Foco&lt;/th&gt;
&lt;th&gt;Benefício&lt;/th&gt;
&lt;th&gt;Riscos se usado em excesso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DRY&lt;/td&gt;
&lt;td&gt;Evitar redundância&lt;/td&gt;
&lt;td&gt;Facilidade de manutenção&lt;/td&gt;
&lt;td&gt;Testes interdependentes e frágeis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DAMP&lt;/td&gt;
&lt;td&gt;Clareza e intenção&lt;/td&gt;
&lt;td&gt;Testes auto-documentados&lt;/td&gt;
&lt;td&gt;Admite certa repetição, desde que contribua para a clareza&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Em testes, clareza é frequentemente mais valiosa que concisão extrema, pois testes são lidos não apenas por quem os escreveu, mas por desenvolvedores investigando falhas ou entendendo o comportamento esperado do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testes de Caixa Branca vs. Caixa Preta
&lt;/h3&gt;

&lt;p&gt;Para compreender melhor os diferentes níveis da pirâmide, é útil relacioná-los com dois paradigmas clássicos de teste:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testes de Caixa Branca (White Box)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilizam conhecimento da estrutura interna do código&lt;/li&gt;
&lt;li&gt;Testam caminhos de execução, cobertura de branches, lógica interna&lt;/li&gt;
&lt;li&gt;Focam em "como" o sistema implementa comportamentos&lt;/li&gt;
&lt;li&gt;Predominantes em: &lt;strong&gt;testes unitários&lt;/strong&gt; e &lt;strong&gt;testes de integração&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Testes de Caixa Preta (Black Box)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tratam o sistema como uma "caixa fechada"&lt;/li&gt;
&lt;li&gt;Testam apenas as interfaces públicas e o comportamento observável&lt;/li&gt;
&lt;li&gt;Focam em "o que" o sistema faz, não em como faz&lt;/li&gt;
&lt;li&gt;Predominantes em: &lt;strong&gt;testes E2E&lt;/strong&gt; e &lt;strong&gt;testes de aceitação&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existe também uma abordagem híbrida:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testes de Caixa Cinza (Grey Box)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Combinam conhecimento da estrutura interna com teste via interfaces externas&lt;/li&gt;
&lt;li&gt;Usam conhecimento do design para testar de forma mais eficiente&lt;/li&gt;
&lt;li&gt;Comuns em: &lt;strong&gt;testes de integração&lt;/strong&gt; e &lt;strong&gt;testes de API&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nível da Pirâmide&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Abordagem Predominante&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base&lt;/td&gt;
&lt;td&gt;Unitários&lt;/td&gt;
&lt;td&gt;Caixa Branca&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meio&lt;/td&gt;
&lt;td&gt;Integração/Contratos&lt;/td&gt;
&lt;td&gt;Caixa Cinza&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Topo&lt;/td&gt;
&lt;td&gt;UI, E2E, Aceitação&lt;/td&gt;
&lt;td&gt;Caixa Preta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Princípios Essenciais para Todos os Níveis
&lt;/h3&gt;

&lt;p&gt;Independentemente do nível da pirâmide, alguns princípios fundamentais devem ser observados:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Teste comportamento, não implementação&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Foque no "o quê", não no "como"&lt;/li&gt;
&lt;li&gt;Isso permite refatoração sem quebrar testes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;"Test for observable behavior instead." - Ham Vocke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Teste o comportamento observável, em vez disso." - Ham Vocke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Código de teste é código de produção&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Aplique as mesmas práticas de qualidade&lt;/li&gt;
&lt;li&gt;Refatore e mantenha limpo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;"Test code is as important as production code. Give it the same level of care and attention." - Ham Vocke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"O código de teste é tão importante quanto o código de produção. Dê a ele o mesmo nível de cuidado e atenção." - Ham Vocke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Estruture claramente&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Use padrão "Arrange-Act-Assert" ou "Given-When-Then"&lt;/li&gt;
&lt;li&gt;Mantenha o teste focado em um único aspecto&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;"A good structure for all your tests is this one: Set up the test data, Call your method under test, Assert that the expected results are returned." - Ham Vocke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Uma boa estrutura para todos os seus testes é esta: Configure os dados de teste, Chame seu método sob teste, Verifique que os resultados esperados são retornados." - Ham Vocke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Priorize feedback rápido&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Coloque testes rápidos nos primeiros estágios do pipeline&lt;/li&gt;
&lt;li&gt;Testes lentos em estágios posteriores&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;"A good build pipeline tells you that you messed up as quick as possible." - Ham Vocke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Um bom pipeline de build informa que você errou o mais rápido possível." - Ham Vocke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Evite duplicação desnecessária&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Se já está bem testado em nível mais baixo, um teste mais alto deve focar em novos aspectos&lt;/li&gt;
&lt;li&gt;Seja implacável eliminando testes que não agregam valor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;"I delete high-level tests that are already covered on a lower level (given they don't provide extra value)." - Ham Vocke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tradução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Eu excluo testes de alto nível que já estão cobertos em um nível inferior (desde que não forneçam valor adicional)." - Ham Vocke&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  O que vem a seguir?
&lt;/h3&gt;

&lt;p&gt;No &lt;strong&gt;Step 1&lt;/strong&gt; da nossa maratona, mergulharemos a fundo na base da pirâmide: os &lt;strong&gt;testes unitários&lt;/strong&gt;. Exploraremos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A definição precisa de uma "unidade" de teste&lt;/li&gt;
&lt;li&gt;A diferença entre testes "sociáveis" e "solitários"&lt;/li&gt;
&lt;li&gt;O uso eficaz de Mocks e Stubs&lt;/li&gt;
&lt;li&gt;A estruturação ideal de testes unitários&lt;/li&gt;
&lt;li&gt;Exemplos práticos em Java utilizando JUnit e Mockito&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prepare-se para construir uma base sólida que permitirá que seu código evolua com segurança e confiança!&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências Bibliográficas
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Vocke, Ham. (2018). "The Practical Test Pyramid". &lt;em&gt;Martin Fowler&lt;/em&gt;. Disponível em: &lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html" rel="noopener noreferrer"&gt;https://martinfowler.com/articles/practical-test-pyramid.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cohn, Mike. (2009). "Succeeding with Agile: Software Development Using Scrum". Addison-Wesley Professional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fowler, Martin. (2012). "Test Pyramid". &lt;em&gt;MartinFowler.com&lt;/em&gt;. Disponível em: &lt;a href="https://martinfowler.com/bliki/TestPyramid.html" rel="noopener noreferrer"&gt;https://martinfowler.com/bliki/TestPyramid.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Freeman, Steve; Pryce, Nat. (2009). "Growing Object-Oriented Software, Guided by Tests". Addison-Wesley Professional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Meszaros, Gerard. (2007). "xUnit Test Patterns: Refactoring Test Code". Addison-Wesley Professional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Khorikov, Vladimir. (2020). "Unit Testing: Principles, Practices, and Patterns". Manning Publications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Osherove, Roy. (2013). "The Art of Unit Testing: With Examples in .NET". Manning Publications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Beck, Kent. (2002). "Test Driven Development: By Example". Addison-Wesley Professional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fields, Jay. (2014). "Working Effectively with Unit Tests". Leanpub.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Savoia, Alberto. (2011). "The Way of Testivus". Disponível em: &lt;a href="https://www.artima.com/weblogs/viewpost.jsp?thread=203994" rel="noopener noreferrer"&gt;https://www.artima.com/weblogs/viewpost.jsp?thread=203994&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
