Fala pessoal!
Participei recentemente de uma live no canal dotNET, junto ao meu amigo e lenda da área de desenvolvimento .NET, Renato Groffe, com o objetivo de apresentar, de forma prática, o uso do K6 em cenários de teste de carga envolvendo bancos de dados relacionais. A proposta foi demonstrar como a ferramenta pode ser utilizada não apenas para APIs ou aplicações web, mas também como um componente relevante em testes de desempenho, capacidade e geração de massa de dados em ambientes de dados.
Ao longo da live, exploramos conceitos técnicos, decisões de arquitetura, limitações encontradas e boas práticas observadas durante o uso do K6 em projetos reais.
Link de inscrição:
https://www.meetup.com/pt-BR/dotnet-sao-paulo/events/311572390/
Link da transmissão:
Motivação para utilização do K6
A escolha do K6 como ferramenta principal para os testes apresentados está relacionada, principalmente, à sua simplicidade de uso aliada a um bom nível de desempenho. Diferentemente de ferramentas mais tradicionais, o K6 permite a definição dos cenários de teste por meio de scripts em JavaScript, o que reduz significativamente a curva de aprendizado.
Além disso, o K6 é desenvolvido em Go, linguagem amplamente conhecida por seu bom suporte a paralelismo e eficiência em execução concorrente, características importantes em cenários de teste de carga.
Testes de carga além de APIs e aplicações web
Um ponto enfatizado durante a live foi a ampliação do uso do K6 para além de testes de API ou interface gráfica. Em muitos cenários, especialmente em projetos de dados, o gargalo não está na aplicação, mas no banco de dados.
Utilizar o K6 para testar diretamente bancos de dados relacionais permite avaliar aspectos como:
- Capacidade de ingestão de dados
- Comportamento sob concorrência
- Tempo médio de execução de operações
- Limites de infraestrutura antes da degradação do serviço
Esses testes são especialmente úteis em cenários de carga inicial, processamento em lote e simulações de ambiente produtivo.
Uso de extensões e drivers de banco de dados
Por padrão, o K6 suporta testes de API e navegação web. Para trabalhar com bancos de dados, é necessário gerar um executável customizado por meio do XK6, incorporando extensões específicas.
Durante a demonstração, apresentei o processo de build de um executável do K6 contendo:
- Extensão genérica para SQL
- Drivers específicos para SQL Server, PostgreSQL e MySQL
- Extensão para geração de dados fictícios (Faker)
Esse processo permite que o K6 execute comandos SQL diretamente, tornando o teste mais próximo da realidade de produção.
Geração de dados fictícios de forma controlada
Outro aspecto importante abordado foi a geração de dados fictícios. Em ambientes de teste, a criação manual de massa de dados frequentemente resulta em inconsistências e problemas de qualidade.
A utilização do Faker integrado ao K6 permite gerar dados coerentes, com estrutura consistente e sem riscos de conteúdo inadequado. Cada iteration do K6 representa uma execução completa de um cenário, como a inserção de um registro, facilitando a simulação de cargas concorrentes de forma controlada.
Esse tipo de abordagem é útil para:
- Criação rápida de massa de dados
- Testes de desempenho e volumetria
- Montagem de provas de conceito e demonstrações técnicas
Integração com pipelines e uso de contêineres
Durante a live, todas as demonstrações foram realizadas utilizando pipelines automatizados, com execução em contêineres oficiais dos bancos de dados. Essa escolha teve como objetivo aproximar o cenário de teste da realidade de ambientes corporativos.
Algumas decisões técnicas discutidas incluíram:
- Uso do SQL Server 2022 em contêiner Linux, devido à instabilidade de versões mais recentes
- Escolha criteriosa da versão do sistema operacional base para garantir disponibilidade de ferramentas como SQLCMD
- Parametrização de strings de conexão e variáveis sensíveis por meio de variáveis de ambiente e variable groups
Esses cuidados reduzem falhas em pipelines e facilitam a reprodutibilidade dos testes.
Resultados observados nos testes
Foram executados testes de carga em diferentes bancos de dados, com variações no número de usuários simultâneos e no volume de iterações. Os resultados demonstraram taxas elevadas de inserção e tempos médios de execução bastante reduzidos, mesmo em ambientes baseados em contêineres.
Mais relevante do que os números absolutos foi a possibilidade de medir, comparar e compreender o comportamento de cada banco sob diferentes níveis de carga, fornecendo subsídios para decisões técnicas e de infraestrutura.
Aplicações práticas do K6 em projetos de dados
Ao longo da live, destaquei que o K6 não deve ser visto apenas como uma ferramenta para testes extremos de carga. Ele pode ser utilizado em diversos contextos, como:
- Avaliação de capacidade antes de ir para produção
- Geração controlada de dados fictícios
- Testes de regressão de desempenho
- Apoio à tomada de decisão sobre dimensionamento de infraestrutura
Em projetos reais, esse tipo de teste permite antecipar problemas e justificar ajustes de capacidade com base em dados concretos.
ORM, banco de dados e alinhamento com o negócio
Na parte final da live, discutimos o papel dos ORMs e o momento adequado para intervenção mais profunda em banco de dados. A visão apresentada foi a de que ORMs são eficientes para operações simples de CRUD, mas apresentam limitações em consultas analíticas, relatórios complexos e cenários de grande volumetria.
Nesses casos, o uso de SQL explícito, views ou procedimentos específicos tende a oferecer melhor desempenho e maior controle. A decisão de otimizar, no entanto, deve sempre considerar o impacto no negócio. Nem todo problema técnico justifica investimento imediato; o foco deve estar nos pontos que afetam diretamente a operação.
Considerações finais
A live teve como objetivo demonstrar, de forma prática e transparente, como o K6 pode ser utilizado em cenários reais envolvendo banco de dados, testes de carga e automação. Mais do que apresentar uma ferramenta, a proposta foi discutir decisões técnicas, limitações e aplicações práticas.
Testes de carga bem executados fornecem dados objetivos que auxiliam na tomada de decisão, reduzem riscos e aumentam a previsibilidade do comportamento do ambiente em produção.
