Transformando testes de API com Postman em testes de performance com K6🏋️‍♂️
Tags: testing, postman, k6, qa
Published: 2023-04-05 12:18:02

Quando se trata de realizar testes de performance, uma das etapas essenciais é o planejamento cuidadoso dos testes. Durante essa fase, alguns pontos importantes devem ser definidos, tais como: 
- o endpoint que será testado
- a massa necessária para a realização dos testes
- a necessidade de autenticação 
- as validações necessárias para garantir a integridade dos resultados

É possível observar que algumas informações essenciais para a realização de testes de performance são semelhantes às informações necessárias para a execução de testes de API.

Neste artigo, você aprenderá como transformar seus testes de API, criados anteriormente em uma collection do Postman, em testes de performance com o K6.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/40726iq7aelinqc0h55p.png)

## Pré-requisitos📑
- [Postman instalado](https://www.postman.com/downloads/)
- [K6 instalado](https://k6.io/docs/get-started/installation/)
- [NodeJS instalado](https://nodejs.org/en/download)
- [Git instalado](https://git-scm.com/downloads)

## Mão na massa👩‍💻

### O que é uma collection postman🤔

As coleções ou collections no Postman são uma maneira de organizar e executar conjuntos de requisições HTTP para testar APIs.

Ao criar uma coleção, é possível adicionar variáveis de ambiente, scripts, testes e outras configurações para ajudar a automatizar e aprimorar seus testes de API. 

Isso permite que você personalize a sua coleção para atender às suas necessidades de teste específicas, permitindo que você execute uma variedade de testes.

### Entendendo nossa collection😎

Embora nossa collection contenha apenas um exemplo simples de requisição a uma API pública do K6, nós consideramos pontos importantes para a sua execução, tais como headers e base URL, definidos como parâmetros de ambiente. Na imagem a seguir, é possível visualizar nosso teste de API no Postman:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/egw332o039m30qapph73.png)



A collection está disponível no repositório [convert-postman-to-k6](https://github.com/marlo2222/convert-postman-to-k6), e pode ser clonada utilizando o seguinte comando:

```
git clone https://github.com/marlo2222/convert-postman-to-k6.git
```
Depois de clonar o repositório, entre no diretório utilizando o comando `cd convert-postman-to-k6`. A estrutura do projeto é simples e pode ser observada abaixo:

```
k6.json
README.md
```
 
### Instalando a ferramenta postman-to-k6🔨

A ferramenta `postman-to-k6` foi desenvolvida com o objetivo de simplificar a conversão de suas collections do Postman em testes de performance com o K6. Isso inclui a conversão de pontos importantes, como testes e variáveis globais expostas pelo Postman.

Para instalar a ferramenta, basta executar o seguinte comando:

```
npm install -g @apideck/postman-to-k6
```

### Convertendo nossa collection 🎭

Após instalar a ferramenta, é possível realizar a conversão de forma simples. Dentro do diretório do projeto `convert-postman-to-k6`, basta executar o seguinte comando:

```
postman-to-k6 k6.json -o k6-script.js
```

> No comando acima, estamos utilizando a biblioteca postman-to-k6, passando a nossa collection k6.json e definindo o parâmetro de saída -o para gerar o nosso script de testes de performance com o nome k6-script.js.

Com a conversão realizada com sucesso, nosso arquivo de saída terá o seguindo formato: 

```
// Auto-generated by the postman-to-k6 converter

import "./libs/shim/core.js";

export let options = { maxRedirects: 4 };

const Request = Symbol.for("request");
postman[Symbol.for("initial")]({
  options,
  collection: {
    base_url: "https://test-api.k6.io"
  }
});

export default function() {
  postman[Request]({
    name: "buscar todos os crocodilos",
    id: "093fd7fc-646c-4982-af32-dcd2f1701760",
    method: "GET",
    address: "https://test-api.k6.io/public/crocodiles/",
    headers: {
      "Content-Type": ""
    }
  });
}
```

### Executando nosso teste de performance🚀

Para executar o nosso teste de performance gerado a partir da collection do Postman, o processo é bastante simples. Basta executar o seguinte comando:

```
k6 run .\k6-script.js
```

Como o script gerado a partir da nossa collection do Postman não possui configurações padrão de carga de usuários ou duração, podemos definir essas configurações diretamente no script gerado ou passá-las pela CLI usando o seguinte comando:

```
k6 run -d 3s -u 2 .\k6-script.js
```

E teremos como o seguinte resultado de saída: 

```

          /\      |‾‾| /‾‾/   /‾‾/
     /\  /  \     |  |/  /   /  /
    /  \/    \    |     (   /   ‾‾\
   /          \   |  |\  \ |  (‾)  |
  / __________ \  |__| \__\ \_____/ .io

  execution: local
     script: .\k6-script.js
     output: -

  scenarios: (100.00%) 1 scenario, 2 max VUs, 33s max duration (incl. graceful stop):
           * default: 2 looping VUs for 3s (gracefulStop: 30s)


     data_received..................: 53 kB  17 kB/s
     data_sent......................: 7.5 kB 2.4 kB/s
     http_req_blocked...............: avg=12.65ms  min=0s       med=0s       max=316.3ms  p(90)=0s       p(95)=0s
     http_req_connecting............: avg=3.78ms   min=0s       med=0s       max=95.01ms  p(90)=0s       p(95)=0s
     http_req_duration..............: avg=109.14ms min=104.88ms med=108.29ms max=150.08ms p(90)=110.91ms p(95)=111.5ms
       { expected_response:true }...: avg=109.14ms min=104.88ms med=108.29ms max=150.08ms p(90)=110.91ms p(95)=111.5ms
     http_req_failed................: 0.00%  ✓ 0         ✗ 50
     http_req_receiving.............: avg=42.61µs  min=0s       med=0s       max=307µs    p(90)=186.67µs p(95)=279.98µs
     http_req_sending...............: avg=2.62µs   min=0s       med=0s       max=66.5µs   p(90)=0s       p(95)=0s
     http_req_tls_handshaking.......: avg=5.41ms   min=0s       med=0s       max=135.79ms p(90)=0s       p(95)=0s
     http_req_waiting...............: avg=109.1ms  min=104.88ms med=108.29ms max=150.08ms p(90)=110.9ms  p(95)=111.5ms
     http_reqs......................: 50     16.182685/s
     iteration_duration.............: avg=122.08ms min=104.88ms med=109.04ms max=429.52ms p(90)=111.28ms p(95)=133.48ms
     iterations.....................: 50     16.182685/s
     vus............................: 2      min=2       max=2
     vus_max........................: 2      min=2       max=2


running (03.1s), 0/2 VUs, 50 complete and 0 interrupted iterations
default ✓ [======================================] 2 VUs  3s
```

### Ponto de atenção🚧

É importante ter em mente que, como o K6 usa Go para executar JavaScript, algumas funcionalidades podem estar ausentes ou sem suporte, especialmente em relação às APIs de navegadores e Node.js. No entanto, é possível contornar essas limitações importando módulos JavaScript integrados. Uma lista de bibliotecas compatíveis pode ser encontrada em [jslib.k6](https://jslib.k6.io/).

Além disso, é importante destacar que alguns recursos do Postman podem precisar passar por ajustes após a conversão para o K6. Por exemplo, pré-scripts contendo pm.sendRequest não são suportados e a forma como o Postman acessa dados em JSON, usando jsonData.hasOwnProperty, deve ser substituída pela sintaxe equivalente do K6 para extrair informações de resposta JSON, usando response.json(""). Para mais detalhes, é possível consultar a descrição oficial do repositório [postman-to-k6](https://github.com/apideck-libraries/postman-to-k6).

## Conclusão💖

Podemos considerar a conversão de collections postman em scripts de testes de performance com o módulo postman-to-k6 um dos diferenciais do K6 em relação a outras ferramentas do mercado. A ferramenta permite gerar rapidamente um script de testes de performance, mesmo que simples, para a realização de um teste com rapidez. 

É importante ressaltar que algumas funcionalidades podem necessitar de ajustes após a conversão, mas com a documentação oficial do repositório postman-to-k6, é possível encontrar as informações necessárias para seguir a diante. 

Além disso, o módulo é open source, o que permite a colaboração e o aprimoramento da ferramenta por parte da comunidade.

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:

- [Teste de performance com K6](https://www.udemy.com/course/teste-de-performance-com-k6/?referralCode=95CCD8BC9F22A2A96BDA) ✨