Utilizando variáveis de ambiente com K6🔨
Tags: k6, performance, testing, qa
Published: 2023-03-24 21:51:10

No curso de testes de performance com k6, alguns scripts precisaram de ajustes mínimos para se tornarem reutilizáveis em outros endpoints ou URLs. 

Neste artigo, vamos explorar como informar variáveis de ambiente por meio de flags da CLI que se tornam visíveis para o seu script de teste de performance.

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

## Mão na massa👩‍💻

### Escopo para variáveis de ambiente com K6🤔
Podemos utilizar variáveis de ambiente nos testes de performance com k6 para finalidades como:

- Fornecer uma variável de ambiente para o script, como uma URL ou um token.
- Configurar o escopo de options por meio de parâmetros fornecidos por variáveis de ambiente.

### Entendendo nosso script🧐
Nosso script de teste de exemplo possui as fases de inicialização, configuração e execução e está estruturado da seguinte forma:

```
import http from 'k6/http';
import { check } from 'k6';

export const options = {
    vus: 1,
    duration: '3s',
    thresholds: {
        checks: ['rate > 0.99']
    }
}

export default function(){
    const BASE_URL = 'https://test-api.k6.io/public/crocodiles/';

    const res = http.get(BASE_URL);

    check(res, {
        'status code 200': (r) => r.status === 200
    });
}
```
Observe que a URL base de teste, a quantidade de VUs e a duração dos testes de performance estão fixos no script atual. No entanto, para torná-lo mais flexível e adaptável a diferentes cenários, é necessário realizar algumas modificações para permitir a parametrização dessas informações.

Assim, o resultado final do nosso script de testes de performance parametrizado ficará da seguinte forma:

```
import http from 'k6/http';
import { check } from 'k6';

export const options = {
    thresholds: {
        checks: ['rate > 0.99']
    }
}

export default function(){
    const url = __ENV.BASE_URL;;

    const res = http.get(url);

    check(res, {
        'status code 200': (r) => r.status === 200
    });
}
```

### Informando variável de ambiente pela CLI✨
No k6, as variáveis de ambiente são expostas utilizando `__ENV`, portanto, sempre que uma variável de ambiente é definida, ela pode ser acessada no script por meio desse objeto JS.

Para acessar uma variável de ambiente chamada BASE_URL, por exemplo, basta utilizar `__ENV.BASE_URL` no script.

Dessa forma, para informar essa variável ao executar o script no console, utilize `-e` ou `--env`:
```
k6 run -e BASE_URL=https://test-api.k6.io/public/crocodiles teste.js
```
Observe que como resultado de saída, você terá uma execução simples, sem carga de usuários ou duração configuradas:

```

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

  execution: local
     script: teste.js
     output: -

  scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
           * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)


     ✓ status code 200

   ✓ checks.........................: 100.00% ✓ 1        ✗ 0
     data_received..................: 6.5 kB  5.7 kB/s
     data_sent......................: 634 B   555 B/s
     http_req_blocked...............: avg=195.19ms min=0s       med=195.19ms max=390.38ms p(90)=351.34ms p(95)=370.86ms
     http_req_connecting............: avg=58.2ms   min=0s       med=58.2ms   max=116.41ms p(90)=104.77ms p(95)=110.59ms
     http_req_duration..............: avg=369.44ms min=145.37ms med=369.44ms max=593.52ms p(90)=548.7ms  p(95)=571.11ms
       { expected_response:true }...: avg=369.44ms min=145.37ms med=369.44ms max=593.52ms p(90)=548.7ms  p(95)=571.11ms
     http_req_failed................: 0.00%   ✓ 0        ✗ 2
     http_req_receiving.............: avg=0s       min=0s       med=0s       max=0s       p(90)=0s       p(95)=0s
     http_req_sending...............: avg=0s       min=0s       med=0s       max=0s       p(90)=0s       p(95)=0s
     http_req_tls_handshaking.......: avg=92.77ms  min=0s       med=92.77ms  max=185.55ms p(90)=167ms    p(95)=176.28ms
     http_req_waiting...............: avg=369.44ms min=145.37ms med=369.44ms max=593.52ms p(90)=548.7ms  p(95)=571.11ms
     http_reqs......................: 2       1.751659/s
     iteration_duration.............: avg=1.14s    min=1.14s    med=1.14s    max=1.14s    p(90)=1.14s    p(95)=1.14s
     iterations.....................: 1       0.87583/s
     vus............................: 1       min=1      max=1
     vus_max........................: 1       min=1      max=1


running (00m01.1s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs  00m01.1s/10m0s  1/1 iters, 1 per VU
```

### Informando configuração de options pela CLI✨

É possível definir o algumas configurações por meio de variáveis de ambiente que sejam utilizadas como options.

Vale ressaltar que sinalizar `-e` ou `–env` na CLI não configura as opções necessárias para o teste. Para isso, é necessário utilizar os sinalizadores próprios para cada opção.

Para definir a duração do teste, utilize o sinalizador `-d` ou `–duration` seguido da duração desejada, por exemplo: `–duration 10s`.

Já para especificar a quantidade de usuários nos testes de performance, utilize o sinalizador `-u` ou `–vus` seguido do número de usuários desejado, por exemplo: `–vus 20.`".

Ao executarmos nosso script no console, podemos informar essas opções da seguinte forma:

```
k6 run -e BASE_URL=https://test-api.k6.io/public/crocodiles -d 10s -u 5 teste.js
```
Observe que agora, como resultado de saída, temos a quantidade de VUs e a duração para o nosso teste:

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

  execution: local
     script: teste.js
     output: -

  scenarios: (100.00%) 1 scenario, 5 max VUs, 40s max duration (incl. graceful stop):
           * default: 5 looping VUs for 10s (gracefulStop: 30s)


     ✓ status code 200

   ✓ checks.........................: 100.00% ✓ 76       ✗ 0
     data_received..................: 109 kB  10 kB/s
     data_sent......................: 24 kB   2.2 kB/s
     http_req_blocked...............: avg=22.53ms  min=0s       med=0s       max=692.38ms p(90)=0s       p(95)=0s
     http_req_connecting............: avg=3.69ms   min=0s       med=0s       max=121.28ms p(90)=0s       p(95)=0s
     http_req_duration..............: avg=325.75ms min=98.44ms  med=359.87ms max=739.29ms p(90)=573.79ms p(95)=676.05ms
       { expected_response:true }...: avg=325.75ms min=98.44ms  med=359.87ms max=739.29ms p(90)=573.79ms p(95)=676.05ms
     http_req_failed................: 0.00%   ✓ 0        ✗ 152
     http_req_receiving.............: avg=661.5µs  min=0s       med=0s       max=15.95ms  p(90)=0s       p(95)=6.82ms
     http_req_sending...............: avg=131.35µs min=0s       med=0s       max=6.17ms   p(90)=0s       p(95)=518.48µs
     http_req_tls_handshaking.......: avg=6.27ms   min=0s       med=0s       max=201.46ms p(90)=0s       p(95)=0s
     http_req_waiting...............: avg=324.95ms min=98.44ms  med=359.87ms max=739.29ms p(90)=573.79ms p(95)=673.67ms
     http_reqs......................: 152     14.30048/s
     iteration_duration.............: avg=699.03ms min=220.34ms med=905.37ms max=1.28s    p(90)=1.16s    p(95)=1.24s
     iterations.....................: 76      7.15024/s
     vus............................: 5       min=5      max=5
     vus_max........................: 5       min=5      max=5


running (10.6s), 0/5 VUs, 76 complete and 0 interrupted iterations
default ✓ [======================================] 5 VUs  10s
```
### Leitura complementar📖
Esses foram apenas alguns exemplos de sinalizadores que estão disponíveis com k6 para configuração do seu teste, vocês podem conhecer muitos outros em [options](https://k6.io/docs/using-k6/k6-options/reference/). 

## Conclusão💖
A parametrização e utilização de variáveis de ambiente tornam nossos scripts de teste de performance reutilizáveis em diferentes cenários, diminuindo o retrabalho e acelerando o processo de construção de novos scripts.

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)