DEV Community

Marlo Henrique
Marlo Henrique

Posted on

Criando um modulo xk6 para k6

Uma das grandes vantagens do K6 é sua capacidade de permitir a criação de módulos personalizados, os quais podem ser facilmente adicionados aos scripts de teste de performance, e até mesmo, se torna uma solução oficial para o K6.

Esse caminho de criação de módulos, abre novas possibilidades para a rápida disponibilização de soluções baseadas em pacotes Go.

Neste artigo, veremos como utilizar o XK6 para desenvolver um novo módulo, baseado em uma solução em Go.

Pré-requisitos📑

O problema👥

Para quem conduz testes no contexto brasileiro, é notavel que informações como CPF e CNPJ desempenham um papel crucial nos cenários de negócios de muitas aplicações.

Atualmente, o K6 não oferece um módulo que permita a geração de CPF para uso em scripts de teste de performance, o que restringe as opções de implementação de alguns scripts que necessitem de grandes volumes dessa massa.

A ausência desse recurso deixa os usuários sem alternativas além de recorrer a módulos Javascript, que podem apresentar desempenho inferior quando incorporados a scripts no K6.

Ao analisar as soluções disponíveis em Go, percebemos que a comunidade brasileira disponibiliza diversos pacotes para a geração e validação de CPF e CNPJ. Um exemplo notável é a biblioteca go-cpf, que oferece a possibilidade de geração de CPF com e sem mascara de formatação.

Criando um modulo XK6📚

Em um diretorio de sua preferencia, utilize o comando go mod init xk6-cpf para iniciar um novo modulo Go. Caso o modulo seja iniciado com sucesso, na raiz do seu diretorio, será criado um arquivo go.mod que registra as dependências do seu projeto, incluindo os módulos que você importa e suas versões.

Neste exemplo, nosso modulo foi iniciado em um diretorio de nome xk6-cpf.

No mesmo diretorio onde nosso modulo foi iniciado, vamos criar um arquivo de nome cpf.go, utilizaremos esse arquivo para realizar toda a configuração do nosso modulo.

Inicialmente vamos definir o nome do nosso pacote Go, para que ele possa ser utilizado por outros arquivos Go, bem como para ser usado em scripts Javascript com o k6.

package cpf 
Enter fullscreen mode Exit fullscreen mode

Em seguida, vamos importar os pacotes necessários para o nosso módulo. O pacote go-cpf fornece funcionalidades para a criação de CPFs com e sem máscara. Já o pacote k6/js/modules é utilizado para registrar módulos personalizados, permitindo seu uso em scripts Javascript com o k6.

import ( "github.com/mvrilo/go-cpf" "go.k6.io/k6/js/modules" ) 
Enter fullscreen mode Exit fullscreen mode

Um dos pontos importantes quando falamos em utilizar modulos XK6, é o registro do nosso modulo. Vamos utilizar a função especial init() do Go, para registramos o modulo xk6-cpf como k6/x/cpf, utilizando a função Register do pacote k6/js/modules:

func init() { modules.Register("k6/x/cpf", new(CPF)) } 
Enter fullscreen mode Exit fullscreen mode

Essa nomenclatura é utilizada para que o módulo possa ser importado no script de teste de performance, com uma sintaxe semelhante à seguinte: import cpf from 'k6/x/cpf'

Vamos definir uma estrutura do tipo CPF, que conterá as funções disponíveis para uso no Javascript.

type CPF struct{} 
Enter fullscreen mode Exit fullscreen mode

Precisamos criar uma função do tipo CPF que receba um argumento booleano. Esse argumento será usado para definir se o usuário deseja um CPF formatado ou não. A função de geração do nosso módulo será a seguinte:

func (*CPF) Cpf(formatado bool) string { if formatado { return cpf.GeneratePretty() } return cpf.Generate() } 
Enter fullscreen mode Exit fullscreen mode

Ao final, nosso arquivo cpf.go terá a seguinte estrutura:

package cpf import ( "github.com/mvrilo/go-cpf" "go.k6.io/k6/js/modules" ) func init() { modules.Register("k6/x/cpf", new(CPF)) } type CPF struct{} func (*CPF) Cpf(formatado bool) string { if formatado { return cpf.GeneratePretty() } return cpf.Generate() } 
Enter fullscreen mode Exit fullscreen mode

Para gerar uma versão do binário do k6 que contenha o módulo que acabamos de construir, podemos utilizar o seguinte comando xk6:

xk6 build --with xk6-cpf=. 
Enter fullscreen mode Exit fullscreen mode

Utilizando o modulo xk6-cpf👩‍💻

Para utilizar o módulo que acabamos de criar, podemos importá-lo em nosso script conforme definido no modules.Register. Na fase de inicialização, importamos nosso módulo xk6 com o seguinte comando:

import cpf from 'k6/x/cpf'; import { sleep } from 'k6'; 
Enter fullscreen mode Exit fullscreen mode

Na fase de configuração, vamos definir uma carga para observar a geração de CPFs utilizando nosso módulo xk6:

export const options = { vus: 1, duration: '3s', } 
Enter fullscreen mode Exit fullscreen mode

Na fase de execução, podemos utilizar a função Cpf do módulo XK6 para verificar a geração de CPFs válidos para uso em nosso script.

export default function () { console.log(`Gerando um novo CPF: ${cpf.cpf(false)}`); sleep(0.5); } 
Enter fullscreen mode Exit fullscreen mode

O argumento false informando na função cpf indica que queremos um cpf sem mascara de formatação.

Para executar nosso script, podemos utilizar o comando .\k6.exe run teste.js, podemos observar o resultado de saida:

 /\ |‾‾| /‾‾/ /‾‾/ /\ / \ | |/ / / / / \/ \ | ( / ‾‾\ / \ | |\ \ | (‾) | / __________ \ |__| \__\ \_____/ .io execution: local script: .\teste.js output: - scenarios: (100.00%) 1 scenario, 1 max VUs, 33s max duration (incl. graceful stop): * default: 1 looping VUs for 3s (gracefulStop: 30s) INFO[0000] Gerando um novo CPF: 73810645290 INFO[0000] Gerando um novo CPF: 87306215426 INFO[0001] Gerando um novo CPF: 48732015607 INFO[0001] Gerando um novo CPF: 83652407180 INFO[0002] Gerando um novo CPF: 58263410762 INFO[0002] Gerando um novo CPF: 81254037608 data_received........: 0 B 0 B/s data_sent............: 0 B 0 B/s iteration_duration...: avg=507.56ms min=500.64ms med=506.57ms max=516.19ms p(90)=514.37ms p(95)=515.28ms iterations...........: 6 1.970294/s vus..................: 1 min=1 max=1 vus_max..............: 1 min=1 max=1 
Enter fullscreen mode Exit fullscreen mode

Utilizando um modulo remoto☁️

No exemplo anterior, o nosso módulo XK6 foi gerado localmente. Uma alternativa de utilização é disponibilizar um módulo remoto para uso.

Para isso, na sua ferramenta de linha de comando, utilize o seguinte comando:

xk6 build --with github.com/marlo2222/xk6-cpf 
Enter fullscreen mode Exit fullscreen mode

Utilizando o script anteriomente contruido, podemos utilizar o seguinte comando para execução:

.\k6.exe run teste.js 
Enter fullscreen mode Exit fullscreen mode

E como resultado de saida teremos:

 /\ |‾‾| /‾‾/ /‾‾/ /\ / \ | |/ / / / / \/ \ | ( / ‾‾\ / \ | |\ \ | (‾) | / __________ \ |__| \__\ \_____/ .io execution: local script: .\teste.js output: - scenarios: (100.00%) 1 scenario, 1 max VUs, 33s max duration (incl. graceful stop): * default: 1 looping VUs for 3s (gracefulStop: 30s) INFO[0000] Gerando um novo CPF: 78153206435 source=console INFO[0000] Gerando um novo CPF: 57281364008 source=console INFO[0001] Gerando um novo CPF: 24567310853 source=console INFO[0001] Gerando um novo CPF: 20584713690 source=console INFO[0002] Gerando um novo CPF: 51068423790 source=console INFO[0002] Gerando um novo CPF: 62453071807 source=console data_received........: 0 B 0 B/s data_sent............: 0 B 0 B/s iteration_duration...: avg=506.57ms min=501.61ms med=507.81ms max=508.64ms p(90)=508.61ms p(95)=508.62ms iterations...........: 6 1.973951/s vus..................: 1 min=1 max=1 vus_max..............: 1 min=1 max=1 running (03.0s), 0/1 VUs, 6 complete and 0 interrupted iterations default ✓ [======================================] 1 VUs 3s 
Enter fullscreen mode Exit fullscreen mode

Conclusão❤️

Como podemos observar, o XK6 abre inúmeras possibilidades para criarmos nossos próprios módulos, preenchendo lacunas existentes na ferramenta atualmente.

Módulos populares no K6 surgiram como iniciativas da comunidade, e a equipe do K6 está sempre receptiva a novas sugestões de módulos para integrar à ferramenta.

Gostou do conteúdo e quer saber mais sobre testes de performance com K6? Então não deixe de conferir meu curso na Udemy:

Top comments (0)