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)