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
- Schema Preview - Entenda a estrutura dos dados
- Data Pinning - Fixe dados importantes
- 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!
Crie templates de dados de teste reutilizáveis para cenários comuns. Isso acelera o desenvolvimento de novos workflows.
Nunca use dados reais em ambiente de teste. Sempre mascare dados sensíveis e use dados sintéticos.
Use bibliotecas como Faker.js e Chance.js para gerar dados realistas e consistentes com o contexto brasileiro.