CNPJ fake vs CNPJ válido: diferença e uso em testes
CNPJ fake vs CNPJ válido: diferença e uso em testes
CNPJ fake aparece em todo repositório de teste que cresceu rápido demais. Alguém hardcodou 11.222.333/0001-81, o CI passou, a feature foi para staging, e a integração com o gateway de pagamento devolveu 422 porque o dígito verificador estava errado. Não é um problema raro: é a regra.
Os dois tipos de CNPJ que aparecem em suítes de teste
Toda vez que uma fixture de teste contém um CNPJ, ele pertence a uma de três categorias.
CNPJ aleatório (falha no dígito verificador)
Sequências como 12.345.678/0001-00 têm formato visual de CNPJ mas falham no algoritmo mod-11. Qualquer validador de formulário, biblioteca de entrada de dados ou API externa detecta o problema no primeiro campo de validação. Fixtures assim quebram antes de chegar ao banco.
CNPJ matematicamente válido (passa mod-11, não existe na Receita)
Um CNPJ gerado por algoritmo respeita os dois dígitos verificadores. Passa em todos os validadores de formato. Não existe na base pública da Receita Federal porque foi construído proceduralmente. É a escolha correta para quase todos os cenários de teste. O gerador de CNPJ do FakeForge produz esse tipo.
CNPJ real ativo (existe na base pública da Receita Federal)
CNPJs de empresas reais retornam dados quando consultados em APIs como ReceitaWS ou CNPJ.ws. São necessários apenas quando o teste exercita uma consulta externa real, não a lógica interna da aplicação.
---
Como o algoritmo mod-11 determina validade
O CNPJ tem 14 dígitos: 12 de base e 2 verificadores. Os dígitos verificadores derivam da base via duas rodadas de mod-11.
Pesos e cálculo do primeiro dígito verificador
Multiplica-se cada dígito da base pela sequência de pesos [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]. Soma os produtos, divide por 11 e pega o resto. Se o resto for menor que 2, o dígito é 0. Caso contrário, o dígito é 11 - resto.
Pesos e cálculo do segundo dígito verificador
O segundo dígito usa os 13 caracteres anteriores (12 de base + primeiro verificador) com pesos [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]. A mesma regra de mod-11 se aplica.
Casos especiais: resultado 0 e 1
Quando o resto da divisão é 0 ou 1, o dígito verificador é 0. CNPJs com todos os dígitos iguais (ex: 11.111.111/1111-11) são inválidos por convenção, mesmo que matematicamente produzam um resultado.
Exemplo de implementação em TypeScript
function calcDigit(base: number[], weights: number[]): number {
const sum = base.reduce((acc, digit, i) => acc + digit * weights[i], 0);
const remainder = sum % 11;
return remainder < 2 ? 0 : 11 - remainder;
}
export function validateCNPJ(raw: string): boolean {
const digits = raw.replace(/\D/g, "");
if (digits.length !== 14) return false;
if (/^(\d)\1+$/.test(digits)) return false;
const base = digits.split("").map(Number);
const firstWeights = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const d1 = calcDigit(base.slice(0, 12), firstWeights);
if (d1 !== base[12]) return false;
const secondWeights = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const d2 = calcDigit(base.slice(0, 13), secondWeights);
return d2 === base[13];
}DICA: a função aceita CNPJ com ou sem máscara. replace(/\D/g, "") remove pontos, barras e hifens antes de qualquer cálculo.---
Por que CNPJ aleatório quebra testes antes mesmo de chegar ao banco
Falhas em CNPJ aleatório não ocorrem no banco de dados: ocorrem nas camadas anteriores.
Validators de formulário rejeitam na camada de UI
Componentes React com cpf-cnpj-validator, campos de formulário com schema Zod ou validação customizada via react-hook-form rejeitam o valor na entrada. O dado nunca é submetido.
Bibliotecas como cpf-cnpj-validator e validate-br bloqueiam na entrada
Ambas as bibliotecas implementam o algoritmo mod-11 e retornam false para qualquer sequência que não passe. Integrar um CNPJ aleatório em um teste de unidade que usa essas bibliotecas garante falha determinística.
APIs de terceiros (gateways de pagamento, NFe) retornam 422 imediato
Gateways como PagSeguro, Cielo e sistemas de emissão de NFe validam o CNPJ no payload antes de qualquer processamento. Um CNPJ inválido resulta em HTTP 422 com corpo descrevendo o campo. O teste falha na chamada, não no comportamento que deveria ser testado.
---
Quando o CNPJ válido (fictício) é a escolha correta
A maioria dos cenários de teste funciona com CNPJs gerados por algoritmo.
Testes unitários de regra de negócio
Qualquer teste que exercita lógica interna (cálculo de imposto, classificação de porte, regras de crédito) precisa apenas de um CNPJ que passe no validador de formato. O CNPJ não precisa existir na Receita.
Testes de integração contra banco de dados próprio
Fixtures de banco de dados, factories do Faker, seeds de staging: todos funcionam com CNPJs fictícios. O banco armazena a string; nenhuma consulta externa é feita.
Seeds e fixtures de staging
Ambientes de staging não devem conter dados reais. Seeds com CNPJs gerados por algoritmo cumprem os requisitos de formato e não expõem nenhuma empresa real.
Demonstrações de produto e treinamento interno
Demos com CNPJs reais de clientes existentes violam a LGPD mesmo que o CNPJ seja tecnicamente público. CNPJs fictícios eliminam esse risco sem comprometer o realismo visual da demo.
---
Quando você precisa de um CNPJ real ativo
Alguns cenários exigem um CNPJ que exista na Receita Federal.
Testes de consulta à API da Receita Federal (ReceitaWS, CNPJ.ws)
Se o teste valida a integração com uma API externa de consulta, o CNPJ precisa existir. Um CNPJ fictício retornará "CNPJ não encontrado" e o teste falhará por motivo errado.
Validação de crédito ou onboarding B2B em sandbox de parceiro
Alguns parceiros financeiros disponibilizam CNPJs de teste específicos em seus ambientes sandbox. Use os CNPJs fornecidos pela documentação do parceiro.
CNPJs públicos aceitáveis: órgãos federais com CNPJ publicado no DOU
CNPJs de órgãos públicos federais (Banco do Brasil: 00.000.000/0001-91) são publicados no Diário Oficial da União e podem ser usados em testes de integração que precisam de um CNPJ real, desde que o contexto não associe esses CNPJs a dados fictícios sensíveis.
---
LGPD e o uso de CNPJ de empresa real em testes
CNPJ de pessoa jurídica não é dado pessoal, mas o contexto importa
O CNPJ em si identifica a empresa, não a pessoa física. A LGPD (Lei 13.709/2018) define dado pessoal em seu Art. 5º, I como informação relacionada a pessoa natural identificada ou identificável. CNPJ de PJ, isolado, não se enquadra.
Quando o CNPJ aparece vinculado a sócio (CPF + CNPJ): LGPD Art. 5º, I entra em cena
O quadro societário da empresa vincula CPF de sócios ao CNPJ. Usar CNPJ real em um dataset de teste que inclua nome de sócio, CPF ou endereço residencial cria um conjunto de dados coberto pela LGPD Art. 5º, I. O tratamento precisa de base legal (LGPD Art. 7º, IX: legítimo interesse, com avaliação de impacto).
Regra prática: dado sintético em todo ambiente que não seja produção
Qualquer ambiente acessível por desenvolvedores, equipes de QA ou parceiros externos deve usar exclusivamente dados sintéticos. Isso inclui staging, homologação, dev, demos gravadas e documentação.
AVISO: um dump de produção carregado em staging para "facilitar os testes" viola a LGPD mesmo que o banco de dados não seja público. O acesso interno não-autorizado ao dado real já configura tratamento sem base legal adequada.
---
CNPJ Alfanumérico a partir de julho de 2026
A Receita Federal publicou a Instrução Normativa RFB 2.229/2024 estabelecendo o CNPJ alfanumérico com vigência a partir de 01/07/2026.
O que muda no formato: posições 1 a 12 aceitam A-Z e 0-9
As 8 posições da raiz e as 4 posições do sufixo passam a aceitar letras maiúsculas de A a Z além dos dígitos 0 a 9. Os 2 dígitos verificadores continuam sendo numéricos.
O algoritmo mod-11 permanece, apenas o alfabeto do input expande
Para calcular os dígitos verificadores de um CNPJ alfanumérico, converte-se cada caractere para seu valor numérico: dígitos mantêm seu valor; letras usam charCode - 48 (A = 17, B = 18, Z = 42). O restante do cálculo mod-11 é idêntico.
Impacto nos validadores e geradores existentes
Validadores que usam replace(/\D/g, "") antes de processar vão remover as letras e produzir resultados incorretos. É necessário atualizar a regex de sanitização e a lógica de conversão de caractere para valor numérico. O gerador de CNPJ Alfanumérico do FakeForge já implementa o formato novo.
---
Gerando CNPJ válido fictício no seu pipeline de testes
Usando a API FakeForge (/api/generate?type=cnpj&quantity=50&format=json)
A API REST do FakeForge gera CNPJs matematicamente válidos em lote. A camada gratuita permite 100 chamadas por dia sem autenticação. Planos pagos estão disponíveis em /pricing.
Gerando via linha de comando com curl e jq
curl -s "https://fakeforge.com.br/api/generate?type=cnpj&quantity=20&format=json" \
| jq '.data' \
> fixtures/cnpjs.jsonO arquivo fixtures/cnpjs.json conterá um array de 20 CNPJs prontos para uso em seeds ou testes.
Exportando fixtures prontos em SQL com CREATE TABLE incluído
curl -s "https://fakeforge.com.br/api/generate?type=cnpj&quantity=100&format=sql" \
> fixtures/seed_cnpjs.sql
psql "$DATABASE_URL" < fixtures/seed_cnpjs.sqlO output SQL inclui a instrução CREATE TABLE IF NOT EXISTS e os INSERT correspondentes. Pode ser aplicado diretamente em PostgreSQL, MySQL ou SQLite sem ajustes.
---
Implementar a validação mod-11 internamente: prós e contras
Vantagem: zero dependência externa, funciona offline
A lógica de mod-11 cabe em menos de 20 linhas de TypeScript. Sem npm install, sem CVEs de dependência transitiva, sem latência de rede. O código da seção anterior é suficiente para produção.
Desvantagem: manter para o CNPJ alfanumérico exige atualização em julho de 2026
Implementações que assumem entrada numérica vão precisar de refatoração antes de 01/07/2026. Quem mantiver a função validateCNPJ acima precisará adicionar a conversão de letra para valor numérico e ajustar a regex de sanitização.
Alternativa: delegar validação e geração a serviço dedicado
Para geração de fixtures em quantidade, delegar ao FakeForge via API reduz manutenção: quando o formato alfanumérico entrar em vigor, o serviço atualiza centralmente. O gerador mínimo abaixo ilustra a mecânica sem dependências externas:
function randomDigit(): number {
return Math.floor(Math.random() * 10);
}
function calcCNPJDigit(base: number[], weights: number[]): number {
const sum = base.reduce((acc, d, i) => acc + d * weights[i], 0);
const r = sum % 11;
return r < 2 ? 0 : 11 - r;
}
export function generateCNPJ(): string {
const base = Array.from({ length: 8 }, randomDigit);
const suffix = [0, 0, 0, 1]; // filial padrão
const all12 = [...base, ...suffix];
const d1 = calcCNPJDigit(all12, [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]);
const d2 = calcCNPJDigit([...all12, d1], [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]);
const d = [...all12, d1, d2];
return `${d.slice(0,2).join("")}.${d.slice(2,5).join("")}.${d.slice(5,8).join("")}/${d.slice(8,12).join("")}-${d.slice(12).join("")}`;
}Exemplo de seed Prisma usando CNPJs gerados:
import { PrismaClient } from "@prisma/client";
import { generateCNPJ } from "./utils/cnpj";
const prisma = new PrismaClient();
async function seed() {
const companies = Array.from({ length: 50 }, (_, i) => ({
cnpj: generateCNPJ(),
razaoSocial: `Empresa Fictícia ${i + 1} Ltda`,
ativo: true,
}));
await prisma.company.createMany({ data: companies, skipDuplicates: true });
await prisma.$disconnect();
}
seed();Para CNPJs já correlacionados com razão social, endereço e contato, o gerador de empresa entrega o conjunto completo em uma chamada.
---
Resumo
Tabela de decisão por camada de teste:
| Camada de teste | Tipo de CNPJ recomendado |
|---|---|
| Testes unitários de regra de negócio | CNPJ fictício (mod-11 válido) |
| Testes de integração contra banco próprio | CNPJ fictício (mod-11 válido) |
| Seeds e fixtures de staging | CNPJ fictício (mod-11 válido) |
| Integração com API da Receita Federal | CNPJ real ativo |
| Sandbox de parceiro financeiro | CNPJ fornecido pelo parceiro |
| Demos e documentação | CNPJ fictício (mod-11 válido) |
Checklist antes de commitar fixtures com CNPJ:
- Use /validar-cnpj ou
validateCNPJ()para confirmar que cada CNPJ passa no dígito verificador. - Confirme que nenhum CNPJ pertence a uma empresa real: consulte via ReceitaWS; se retornar dados, substitua.
- Ambientes não-produtivos não devem conter nenhum CNPJ associado a CPF, nome de sócio ou endereço real.
- Se o repositório for público, gere novos CNPJs a cada ciclo de CI em vez de commitar fixtures estáticas.
- Planeje a atualização dos validadores para suportar caracteres alfanuméricos antes de 01/07/2026.
- Para geração em lote, a API FakeForge elimina manutenção local e já cobre o formato alfanumérico.
Perguntas frequentes
Devo gerar um novo CNPJ fictício para cada teste ou posso reutilizar o mesmo?+
Reutilizar economiza tempo, mas dificulta isolamento para debug. Melhor prática: fixe um CNPJ por suite de testes via seed do Faker (--seed 12345), ou use factories com dados estáticos. CI roda com seed idêntica toda run. Testes end-to-end devem gerar novo a cada execução para cobertura de edge cases.
Como preparar meu validador de CNPJ para alfanumérico sem quebrar os testes atuais?+
Crie uma função paralela validateCNPJAlpha() em ramo feature. Teste com entrada mista (A1B2C3D4) em staging. Mantenha a função antiga funcionando até julho de 2026. Na produção, route por versão da API ou header. Evita migração de emergência e permite rollback.
Qual a chance real de um CNPJ fictício gerado aleatoriamente já existir na Receita Federal?+
Negligenciável. 8 dígitos da raiz = 100M combinações possíveis. Receita Federal tem ~60M CNPJs ativos. Sobreposição = ~0,06% mesmo sem mod-11. Com verificadores, cai mais. Risco aceitável para testes. Consulte via ReceitaWS apenas em prod.
CNPJ fictício válido passa em meu validador, mas pode quebrar em APIs de terceiros?+
Sim. Gateways de pagamento, NFe, consulta de crédito consultam a Receita Federal e retornam 'CNPJ inválido' se não encontrarem. Mock a API externa em testes unitários. Em testes de integração real, use CNPJ do sandbox do parceiro. Nunca assuma que fictício=seguro.
O gerador FakeForge me garante que os CNPJs gerados não existem na Receita Federal?+
Não há garantia 100%, mas probabilidade é negligenciável (<0,0001%). Se precisa de garantia absoluta, consulte a API pública da Receita contra o CNPJ antes de usar. Para testes e staging, o risco é aceitável e não justifica overhead.