Série Code Quality para Tech Leads
2026 · Em lançamento Série Code Qualitypara Tech Leads. Seis posts sobre as cinco métricas que descrevem a saúde do seu código — Cyclomatic,..
Tech Leads e Staff Engineers que escrevem testes raramente têm um critério objetivo para decidir quantos testes uma função precisa. Há um — e ele tem cinquenta anos de idade.
Cyclomatic Complexity conta quantos caminhos lineares independentes há no fluxo de uma função. Esse número é exatamente o de casos de teste necessários para cobrir todos os caminhos. Foi criado por Thomas McCabe em 1976 e ainda é o instrumento mais direto para medir testabilidade.
Cyclomatic Complexity conta quantos caminhos lineares independentes existem no fluxo de uma função. Esse número é exatamente o de casos de teste necessários para cobrir todos os caminhos. Foi criado por Thomas McCabe em 1976 e ainda é o instrumento mais direto para medir testabilidade.
Você abre um PR. O reviewer comenta: "falta cobertura de teste aqui". Você responde: "escrevi 3 testes, cobre o happy path e dois edge cases". Ele diz: "acho que falta um caso". Você acha que não.
Quem está certo?
Sem critério objetivo, vira opinião. Os dois saem da revisão com sensação ruim. A função sobe pra produção. Três meses depois, um caso não testado vira um incidente.
A Cyclomatic Complexity elimina essa discussão. Ela conta o número de caminhos lineares independentes que o fluxo de execução pode tomar. Esse número é a quantidade mínima de testes para cobrir todos os caminhos. Não é estimativa. É matemática.
Thomas McCabe propôs a fórmula em 1976. O cálculo é determinístico — cada construção que desvia o fluxo linear adiciona +1:
Uma função sem nenhum desvio (apenas instruções sequenciais e um return) tem complexidade 1. Cada bifurcação adiciona um caminho. O total é o número de testes necessários para cobrir todos os caminhos.
// Cyclomatic Complexity = 4
function classifyOrder(order) {
if (order.value > 1000) return 'PREMIUM'; // +1
if (order.value > 100) return 'STANDARD'; // +1
if (order.items.length > 10) return 'BULK'; // +1
return 'BASIC'; // path base = 1
}
// 4 caminhos = mínimo 4 testes para cobertura total
A fórmula resumida é: 1 (caminho base) + Σ ramificações. Some todas as construções que desviam o fluxo e adicione 1. O resultado é a sua Ciclomática — e a quantidade mínima de testes para cobertura total de caminhos.
Para uso operacional em revisão de código, três faixas funcionam bem como referência:
A métrica é puramente estrutural. Para a Ciclomática, quatro if independentes têm o mesmo peso de quatro if aninhados — porque o número de caminhos é o mesmo (4 em ambos os casos).
Mas qualquer engenheiro que já leu uma função aninhada em quatro níveis sabe: o custo cognitivo de seguir o fluxo aninhado é muito maior do que ler quatro funções if lineares. Para esse aspecto, existe uma métrica complementar — a Cognitive Complexity, que é o assunto do próximo post da série.
A Ciclomática, sozinha, responde uma pergunta específica: quantos caminhos esse código tem? E portanto, quantos testes a cobertura mínima exige.
Ciclomática alta numa função isolada é fricção. Quando ela passa de 10 em vários métodos do codebase, vira um passivo sistêmico: o código fica muito mais difícil de entender e testar, o time desacelera mesmo em tarefas que não tocam diretamente as funções complexas, e a probabilidade de introduzir bugs em qualquer mudança aumenta. Três coisas acontecem no time:
Fricção e lentidão na alteração. O dev precisa entender o fluxo inteiro antes de mexer. Métodos com 15+ caminhos exigem que o leitor mantenha em mente todas as combinações possíveis. O tempo de "entender antes de mudar" começa a dominar o de "mudar".
Medo de quebrar o que funciona. Quanto mais caminhos, menor a previsibilidade do efeito colateral de uma mudança. O time desenvolve cautela excessiva. Surge a frase clássica: "estava funcionando, eu nem mexi ali" — geralmente dita logo após mexer ali.
Maior incidência de bugs. Estruturas mal projetadas aumentam a chance de a intenção original do dev não ser refletida na implementação. Mais bifurcações = mais lugares onde a lógica pode divergir do intent.
“Comentários decoram a complexidade. Não a removem. A solução é modularizar com foco em localização da mudança.
A solução não é "adicionar comentários explicando o fluxo". Comentários decoram a complexidade, não a removem. A solução é modularização com foco em localização da mudança:
O resultado: o método orquestrador apresenta Ciclomática baixa (3–5). Cada método extraído também apresenta Ciclomática baixa. O total não diminui — mas a localização da mudança torna-se possível. Você pode mexer em um pedaço sem ler os outros.
A IA generativa (Copilot, Cursor, Claude Code) mantém — e frequentemente piora — o padrão do código em que opera. Não é defeito do modelo: é consequência de como ele toma decisões. Quando você pede "adiciona uma nova regra de classificação aqui", o LLM olha para o método existente, identifica o estilo (ifs sequenciais, condições aninhadas) e o replica. Em código com Ciclomática alta, cada prompt pode elevar a Ciclomática mais um pouco.
Ferramentas modernas de análise estática medem Ciclomática out-of-the-box: ESLint (com a rule complexity), Checkstyle (Java), radon (Python), gocyclo (Go), lizard (multi-language). A plataforma SQA da Codurance integra essa medição às outras quatro métricas desta série em um diagnóstico unificado — útil quando você quer ver a Ciclomática em contexto, não isolada.
if, case, for, &&, catch adiciona +1.A Ciclomática responde quantos caminhos. Mas ela não diz nada sobre quão difícil é seguir esses caminhos. Para isso, existe a Cognitive Complexity — e é por isso que duas funções com a mesma Ciclomática podem ter custos completamente diferentes.
A Codurance acompanha times de engenharia que querem instrumentar a saúde do código sem se tornarem gestores. Ajudamos Tech Leads e Staff Engineers a definir thresholds operacionais, integrar métricas como Ciclomática em pipelines de CI/CD e estabelecer rituais de revisão que sustentam a qualidade ao longo do tempo.
Se você quer aplicar essas práticas no seu time, entre em contato hoje.
Cyclomatic Complexity é uma métrica que conta o número de caminhos linearmente independentes em uma função. Ela importa porque define objetivamente quantos testes de unidade são necessários para cobrir todos os caminhos de execução — eliminando a subjetividade nas revisões de código.
A convenção mais amplamente adotada é: alertar quando a complexidade passa de 10 e bloquear (ou exigir refatoração) quando passa de 15. Esses valores podem ser ajustados conforme o contexto do time e a natureza do código.
Não. As duas métricas respondem perguntas diferentes. A Cyclomatic Complexity mede quantos caminhos existem — e, portanto, quantos testes são necessários. A Cognitive Complexity mede o esforço cognitivo necessário para entender o código. Use ambas: Ciclomática para cobertura de testes, Cognitive para decisões de refatoração.
2026 · Em lançamento Série Code Qualitypara Tech Leads. Seis posts sobre as cinco métricas que descrevem a saúde do seu código — Cyclomatic,..
Junte-se à nossa newsletter para obter dicas de especialistas e estudos de caso inspiradores
Junte-se à nossa newsletter para obter dicas de especialistas e estudos de caso inspiradores