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.