[CYPRESS] Usando arquivo de configuração para executar testes em diferentes ambientes
Tags: cypress, automation, testing, codequality
Published: 2024-04-29 10:35:20

Dependendo de quantos ambientes nós temos em nossas empresas, precisamos executar nossos testes em diferentes ambientes, você pode ter um ambiente de DEV, QA, STAGING, PRODUÇÃO e etc. Se muitos ambientes é um sinal bom, aí é outro assunto que podemos falar em outro post =) hehe

Mas o que acontece é que pode ser que o tenhamos em nossa realidade do dia-a-dia, se então quisermos executar nossos testes em cypress em ambientes como QA e STAGING, pelo menos, como que fazemos?

Existem alguns jeitos que podemos realizar essa lógica, vou mostrar aqui pelo menos duas, acredito que já seja um caminho que podes seguir com esse desafio se o estiver enfrentando e uma vez feito, você pode adicionar a lógica para N ambientes que quiseres executar seus testes.

Vamos lá ...

A primeira forma que podemos fazer isso é replicando nosso arquivo de configuração do próprio cypress, se pensamos que temos o `cypress.config.ts` e que o podemos passar como parâmetro na linha de comando, então concluímos que podemos criar um arquivo de configuração para cada ambiente que temos, por exemplo:

![qa.cypress.config.ts](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qpbdrd302zelwggcy003.png)

E você terá outros arquivos de configuração, como `staging.cypress.config.ts`  mudando exatamente a baseUrl e outras variáveis que deseja, seja as que estão dentro do objeto `env` ou as próprias variáveis de configuração do cypress. Após ter esses arquivos de configuração, você pode executar seus testes se usando deles, como:

```
cypress run --config-file qa.cypress.config.ts
cypress run --config-file staging.cypress.config.ts
```

Agora, outro jeito que podemos fazer isso é usando apenas um arquivo de configuração do cypress junto com um arquivo de variáveis do cypress.
Ficando assim:


![cypress.config.ts](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v0f6nn7vi5u4aarv8owf.png)

Agora, inicializamos as variáveis para cada ambiente a partir do arquivo de variáveis do cypress `cypress.env.json`, dessa forma não teremos n arquivos de configuração.
O seu `cypress.env.json` vai parecer com isso aqui:


![cypress.env.json](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3qy7p9audm9k3imoeecs.png)

Você pode se perguntar, mas como na hora de executar, o código vai saber qual objeto, seja QA ou STAGING, precisa ser inicializado? Visto que só tenho um arquivo de configuração?

Desse outro formato, você não mais irá passar o arquivo de configuração, pois ele é único, mas você vai precisar passar em qual ambiente (env) você estará rodando seus testes, se você prestar atenção no arquivo `cypress.config.ts` perceberá que todas as variáveis estão sendo inicializadas a partir disso `config.env[config.env['env']]`, ou seja, dado o `env` que está sendo recebido, ele busca esse objeto do arquivo `cypress.env.json`, ficando assim os seus comandos de execução dos testes para cada ambiente:

```
cypress run --env env=QA
cypress run --env env=STAGING
```

Caso precise ter mais ambientes, só criar outro objeto no `cypress.env.json` mudando o nome do objeto para o nome do ambiente que o representa e alterando as variáveis dentro dele, por exemplo, se quero rodar em um ambiente de desenvolvimento, o resultado final seria:


![cypress.env.json](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/luzh289c3vhqpilom3f4.png)

Sendo executado com: `cypress run --env env=DEV`

Fácil, não? Qual você prefere?

Espero que esse post possa ajudar você nesse desafio, pois sei que quando temos uma automação, a gente sempre quer rodar a mesma em mais de um ambiente =)