Pular para o conteúdo principal

Criação de Dados de Teste

A criação de dados de teste (mocking) é essencial para desenvolver e testar workflows sem depender de dados reais ou APIs externas. Esta seção aborda como gerar dados sintéticos realistas para diferentes cenários de teste.


Visão Geral​

Dados de teste permitem desenvolver workflows de forma segura e eficiente, simulando cenários reais sem comprometer dados de produção ou sistemas externos. O n8n oferece ferramentas integradas e suporte para bibliotecas externas de geração de dados.


Tipos de Dados de Teste​

Dados Pessoais Realistas para Testes​

// Gerar dados de usuário brasileiro
const gerarUsuarioBR = () => {
  return {
    nome: 'João Silva',
    email: 'joao.silva@exemplo.com',
    cpf: gerarCPF(),
    telefone: '(11) 99999-9999'
  };
};

// Gerar CPF válido
const gerarCPF = () => {
  const numeros = Array.from({length: 9}, () => Math.floor(Math.random() * 10));
  
  // Calcular primeiro dígito verificador
  let soma = 0;
  for (let i = 0; i < 9; i++) {
    soma += numeros[i] * (10 - i);
  }

  const digito1 = ((soma * 10) % 11) % 10;
  numeros.push(digito1);
  
  // Calcular segundo dígito verificador
  soma = 0;
  for (let i = 0; i < 10; i++) {
    soma += numeros[i] * (11 - i);
  }

  const digito2 = ((soma * 10) % 11) % 10;
  numeros.push(digito2);
  
  return numeros.join('');
};

Dados de Negócios para Testes​

// Gerar dados de empresa brasileira
const gerarEmpresaBR = () => {
  return {
    razaoSocial: 'Empresa Exemplo LTDA',
    cnpj: gerarCNPJ(),
    email: 'contato@empresa.com',
    website: 'https://empresa.com'
  };
};

// Gerar CNPJ válido
const gerarCNPJ = () => {
  const numeros = Array.from({length: 12}, () => Math.floor(Math.random() * 10));
  
  // Calcular primeiro dígito verificador
  const pesos1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
  let soma = 0;
  for (let i = 0; i < 12; i++) {
    soma += numeros[i] * pesos1[i];
  }

  const digito1 = ((soma * 10) % 11) % 10;
  numeros.push(digito1);
  
  // Calcular segundo dígito verificador
  const pesos2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
  soma = 0;
  for (let i = 0; i < 13; i++) {
    soma += numeros[i] * pesos2[i];
  }

  const digito2 = ((soma * 10) % 11) % 10;
  numeros.push(digito2);
  
  return numeros.join('');
};

Dados Financeiros para Testes​

// Gerar dados de transação financeira
const gerarTransacao = () => {
  return {
    id: gerarUUID(),
    valor: (Math.random() * 1000).toFixed(2),
    data: new Date().toISOString(),
    tipo: ['credito', 'debito'][Math.floor(Math.random() * 2)]
  };
};

// Gerar dados de fatura
const gerarFatura = () => {
  const itens = Array.from({length: Math.floor(Math.random() * 5) + 1}, () => ({
    descricao: ['Produto A', 'Serviço B', 'Item C'][Math.floor(Math.random() * 3)],
    quantidade: Math.floor(Math.random() * 10) + 1,
    precoUnitario: (Math.random() * 100).toFixed(2)
  }));
  
  const subtotal = itens.reduce((acc, item) => 
    acc + (item.quantidade * parseFloat(item.precoUnitario)), 0);
  
  return {
    numero: gerarNumeroFatura(),
    dataEmissao: new Date().toISOString(),
    vencimento: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
    cliente: gerarUsuarioBR(),
    itens: itens,
    subtotal: subtotal.toFixed(2),
    impostos: (subtotal * 0.18).toFixed(2),
    total: (subtotal * 1.18).toFixed(2)
  };
};

Bibliotecas de Mocking​

Faker.js​

Use a biblioteca Faker.js para dados realistas:

// Configurar Faker.js para português brasileiro
const { faker } = require('@faker-js/faker/locale/pt_BR');

// Gerar dados de pessoa
const pessoa = {
  nome: faker.person.fullName(),
  email: faker.internet.email(),
  telefone: faker.phone.number('(##) #####-####'),
  cpf: faker.helpers.replaceSymbolWithNumber('###.###.###-##'),
  endereco: {
    rua: faker.location.street(),
    numero: faker.location.buildingNumber(),
    bairro: faker.location.county(),
    cidade: faker.location.city(),
    estado: faker.location.state(),
    cep: faker.location.zipCode('#####-###')
  }
};

// Gerar dados de empresa
const empresa = {
  razaoSocial: faker.company.name(),
  cnpj: faker.helpers.replaceSymbolWithNumber('##.###.###/####-##'),
  email: faker.internet.email(),
  website: faker.internet.url(),
  setor: faker.company.buzzNoun()
};

Chance.js​

Use Chance.js para dados mais específicos:

const Chance = require('chance');
const chance = new Chance();

// Gerar dados específicos
const dadosEspecificos = {
  // Dados brasileiros
  cpf: chance.cpf(),
  cnpj: chance.cnpj(),
  telefone: chance.phone({ country: 'br' }),
  cep: chance.zip(),
  
  // Dados de negócio
  empresa: chance.company(),
  profissao: chance.profession(),
  salario: chance.integer({ min: 1000, max: 50000 }),
  
  // Dados de localização
  cidade: chance.city(),
  estado: chance.state({ full: true }),
  pais: 'Brasil'
};

Cenários de Teste Comuns​

E-commerce​

// Gerar dados de e-commerce
const gerarPedidoEcommerce = () => {
  return {
    id: gerarUUID(),
    cliente: gerarUsuarioBR(),
    itens: Array.from({length: Math.floor(Math.random() * 5) + 1}, () => ({
      produto: gerarProduto(),
      quantidade: Math.floor(Math.random() * 5) + 1,
      preco: (Math.random() * 500).toFixed(2)
    })),
    enderecoEntrega: gerarEnderecoBR(),
    formaPagamento: ['Cartão', 'PIX', 'Boleto'][Math.floor(Math.random() * 3)]
  };
};

const gerarProduto = () => {
  return {
    id: gerarUUID(),
    nome: faker.commerce.productName(),
    preco: faker.commerce.price(),
    categoria: faker.commerce.department()
  };
};

CRM​

// Gerar dados de CRM
const gerarClienteCRM = () => {
  return {
    id: gerarUUID(),
    nome: faker.person.fullName(),
    email: faker.internet.email(),
    telefone: faker.phone.number(),
    empresa: faker.company.name(),
    oportunidades: Array.from({length: Math.floor(Math.random() * 3) + 1}, () => ({
      id: gerarUUID(),
      titulo: faker.company.catchPhrase(),
      valor: (Math.random() * 50000).toFixed(2),
      probabilidade: Math.floor(Math.random() * 100),
      etapa: ['Prospecção', 'Qualificação', 'Proposta', 'Negociação', 'Fechamento'][Math.floor(Math.random() * 5)]
    }))
  };
};

ERP​

// Gerar dados de ERP
const gerarDadosERP = () => {
  return {
    produtos: Array.from({length: Math.floor(Math.random() * 10) + 1}, () => ({
      codigo: gerarCodigoProduto(),
      nome: faker.commerce.productName(),
      preco: faker.commerce.price(),
      estoque: Math.floor(Math.random() * 1000),
      fornecedor: faker.company.name()
    })),
    fornecedor: {
      codigo: gerarCodigoFornecedor(),
      razaoSocial: faker.company.name(),
      cnpj: faker.helpers.replaceSymbolWithNumber('##.###.###/####-##'),
      contato: {
        nome: faker.person.fullName(),
        email: faker.internet.email(),
        telefone: faker.phone.number()
      }
    },
    cliente: {
      codigo: gerarCodigoCliente(),
      nome: faker.person.fullName(),
      tipo: ['PF', 'PJ'][Math.floor(Math.random() * 2)],
      documento: Math.random() > 0.5 ? 
        faker.helpers.replaceSymbolWithNumber('###.###.###-##') : 
        faker.helpers.replaceSymbolWithNumber('##.###.###/####-##'),
      email: faker.internet.email(),
      telefone: faker.phone.number()
    }
  };
};

Workflows de Teste​

Workflow Geração de Dados de Teste​

Workflow Teste de Performance​


Configuração de Ambiente de Teste​

Variáveis de Ambiente​

# Configurar ambiente de teste
export N8N_ENVIRONMENT=test
export N8N_DATABASE_URL=postgresql://test:test@localhost:5432/n8n_test
export N8N_MOCK_DATA_ENABLED=true
export N8N_TEST_API_URL=https://api-test.exemplo.com

Configuração de Dados de Teste​

// Configurar dados de teste
const configTeste = {
  ambiente: 'test',
  
  // Configurações de dados
  dados: {
    incluirDadosSensiveis: false,
    mascararDados: true,
    usarDadosRealistas: true
  },
  
  // Configurações de API
  api: {
    url: process.env.N8N_TEST_API_URL,
    timeout: 5000,
    retryAttempts: 3
  }
};

Validação de Dados de Teste​

Validação de Formato​

// Validar formato de dados brasileiros
const validarDadosBR = (dados) => {
  const erros = [];
  
  // Validar CNPJ
  if (dados.cnpj && !validarCNPJ(dados.cnpj)) {
    erros.push('CNPJ inválido');
  }

  // Validar email
  if (dados.email && !validarEmail(dados.email)) {
    erros.push('Email inválido');
  }

  // Validar telefone
  if (dados.telefone && !validarTelefone(dados.telefone)) {
    erros.push('Telefone inválido');
  }

  return {
    valido: erros.length === 0,
    erros: erros
  };
};

// Validar CPF
const validarCPF = (cpf) => {
  if (!/^\d{11}$/.test(cpf)) return false;
  
  // Calcular dígitos verificadores
  let soma = 0;
  for (let i = 0; i < 9; i++) {
    soma += parseInt(cpf[i]) * (10 - i);
  }

  const digito1 = ((soma * 10) % 11) % 10;
  
  soma = 0;
  for (let i = 0; i < 10; i++) {
    soma += parseInt(cpf[i]) * (11 - i);
  }

  const digito2 = ((soma * 10) % 11) % 10;
  
  return parseInt(cpf[9]) === digito1 && parseInt(cpf[10]) === digito2;
};

Validação de Consistência​

// Validar consistência de dados
const validarConsistencia = (dados) => {
  const inconsistencias = [];
  
  // Verificar se pedido tem itens
  if (dados.pedido && (!dados.pedido.itens || dados.pedido.itens.length === 0)) {
    inconsistencias.push('Pedido sem itens');
  }

  // Verificar se valores são positivos
  if (dados.valor && parseFloat(dados.valor) <= 0) {
    inconsistencias.push('Valor deve ser positivo');
  }

  return {
    consistente: inconsistencias.length === 0,
    inconsistencias: inconsistencias
  };
};

Próximos passos​

  1. Schema Preview - Entenda a estrutura dos dados
  2. Data Pinning - Fixe dados importantes
  3. Otimização de Performance - Melhore eficiência

Agora você domina técnicas de criação de dados de teste. Use essas habilidades para desenvolver workflows de forma segura e eficiente!


Dica Pro

Crie templates de dados de teste reutilizáveis para cenários comuns. Isso acelera o desenvolvimento de novos workflows.

Importante

Nunca use dados reais em ambiente de teste. Sempre mascare dados sensíveis e use dados sintéticos.

Recurso Adicional

Use bibliotecas como Faker.js e Chance.js para gerar dados realistas e consistentes com o contexto brasileiro.