diff --git a/.github/workflows/workflow-testes-automatizados-e2e-front-serve-rest-cypress.yml b/.github/workflows/workflow-testes-automatizados-e2e-front-serve-rest-cypress.yml index 277544e..6bb9275 100644 --- a/.github/workflows/workflow-testes-automatizados-e2e-front-serve-rest-cypress.yml +++ b/.github/workflows/workflow-testes-automatizados-e2e-front-serve-rest-cypress.yml @@ -31,9 +31,10 @@ jobs: - name: Passo 1 - Obter cópia do código-fonte do repositório uses: actions/checkout@v3.3.0 - - name: Passo 2 - Redirecionar o conteúdo de "secrets.LOGIN_ENV" para o arquivo "login.json" + - name: Passo 2 - Redirecionar os conteúdos de "secrets.LOGIN_ENV", "secrets.USUARIO_ENV", etc, para os arquivos "login.json", "usuario.json", etc run: | echo '${{ secrets.LOGIN_ENV }}' > ./cypress/fixtures/login.json + echo '${{ secrets.USUARIO_ENV }}' > ./cypress/fixtures/usuario.json - name: Passo 3 - Instalar dependências, Executar testes em modo headless (2º plano) em um ambiente de desenvolvimento e Gerar os resultados dos testes uses: cypress-io/github-action@v5.0.8 diff --git a/README.md b/README.md index 4978231..2fe6115 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,19 @@ # :information_source: Introdução Esse projeto "testes-automatizados-e2e-front-serve-rest_cypress" é executado em um ambiente de desenvolvimento no ["front"](https://front.serverest.dev) e na ["API REST"](https://serverest.dev) do ["ServeRest"](https://github.com/ServeRest) que simula uma loja virtual, com o objetivo de me aprofundar um pouco mais nos estudos sobre testes automatizados e2e (ponta a ponta) em Cypress. +- Documentações de referência + - Cypress: + - https://www.cypress.io/ + - https://example.cypress.io/commands/actions + - https://docs.cypress.io/guides/core-concepts/writing-and-organizing-tests#Folder-Structure + --- # :dart: Executar testes em um ambiente de desenvolvimento e Gerar os resultados dos testes no GitHub Actions ## :triangular_flag_on_post: Executar os testes automatizados e2e (ponta a ponta) no navegador chrome em modo headless (2° plano) e Gerar os resultados dos testes no GitHub Actions - Nesse repositório, acessar a aba "Actions" - Na seção "Actions", clicar em "Pipeline Testes Automatizados E2E (Ponta a Ponta) Front ServeRest Cypress" -- Em "This workflow has a workflow_dispatch event trigger.", clicar em "Run workflow" > "Run workflow" para executar os testes automatizados e2e (ponta a ponta) no navegador chrome em modo headless (2° plano) no GitHub Actions +- Em "This workflow has a workflow_dispatch event trigger.", clicar em "Run workflow" > "Run workflow" para executar os testes automatizados e2e (ponta a ponta) no navegador chrome em modo headless (2° plano) no GitHub Actions [com os conteúdos de "secrets.LOGIN_ENV", "secrets.USUARIO_ENV", etc (baseado nos arquivos ["login.example.json"](https://github.com/AndressaKarla/testes-automatizados-e2e-front-serve-rest_cypress/blob/main/cypress/fixtures/login.example.json), ["usuario.example.json"](https://github.com/AndressaKarla/testes-automatizados-e2e-front-serve-rest_cypress/blob/main/cypress/fixtures/usuario.example.json), etc, e configurados na aba "Settings" desse repositório > "Secrets and variables" > "Actions" > "Secrets" > "Repository secrets") que foram redirecionados para os arquivos "login.json", "usuario.json"] - Após o término da execução, clicar na run "Pipeline Testes Automatizados E2E (Ponta a Ponta) Front ServeRest Cypress" - Na seção "Artifacts", clicar em "cypress-videos-chrome" - Na janela aberta, escolher um diretório para baixar a pasta compactada "cypress-videos-chrome.zip" @@ -53,7 +59,22 @@ Funcionalidade Tela Login - Botão Entrar -- Esquema do Cenário Validar Login u ``` --- -# Antes de clonar ou executar esse projeto localmente no computador, é necessário seguir as instruções abaixo :point_down: +# Antes de clonar ou executar esse projeto localmente no computador, é necessário ter os pré-requisitos e seguir as instruções abaixo :point_down: + +## :hammer_and_wrench: Sistema Operacional +- macOS 10.9 ou superior (Intel ou Apple Silicon 64-bit (x64 ou arm64)) +- Linux Ubuntu 20.04 ou superior, Fedora 21 e Debian 8 (x86_64 ou Arm 64 bits (x64 ou arm64)) +- Windows 10 ou superior (apenas 64 bits) + + +## :hammer_and_wrench: Hardware +- Mínimo de 2 CPUs para rodar o Cypress +- 1 CPU adicional se a gravação de vídeo estiver ativada + + +## :hammer_and_wrench: Memória RAM +- 8 GB ou superior para execuções de teste mais longos + ## :hammer_and_wrench: Janela do "Windows Explorer" > aba "Exibir" e marcar algumas opções - Abrir uma janela do "Windows Explorer" @@ -158,6 +179,8 @@ npm install --force - Em "Profile name", informar "Cypress" - Clicar na opção "Create" - Clicar na opção "Extensions", informar e instalar as extensões abaixo: + - Cypress Snippets + - Cliff Su - One Dark Pro - binaryify - Clicar na opção "One Dark Pro Darker" apresentada para habilitar a extensão @@ -165,7 +188,24 @@ npm install --force - Philipp Kief - Clicar na opção "Material Icon Theme" apresentada para habilitar a extensão -- Fechar o VS Code +## :bookmark_tabs: Abrir o VS Code diretamente na pasta do projeto "testes-automatizados-e2e-front-serve-rest_cypress" +- No cmder aberto anteriormente, informar o comando abaixo para abrir o VS Code diretamente na pasta do projeto "testes-automatizados-e2e-front-serve-rest_cypress" +``` +code . +``` +- Aguardar o VS Code ser aberto +- Fechar esse cmder +- No VS Code aberto, caso seja apresentado "Do you trust the authors on the files in this folder?", marcar a opção "Trust the authors of all files in the parent folder ...." + - Clicar no botão "Yes, I trust the authors ...." + +## :hammer_and_wrench: Criar arquivos "login.json", "usuario.json", etc, informando os dados com base nos arquivos "login.example.json", "usuario.example.json", etc +- No VS Code aberto anteriormente, acessar "cypress > fixtures" +- Criar o arquivo "login.json" + - Informar os dados com base no arquivo ["login.example.json"](https://github.com/AndressaKarla/testes-automatizados-e2e-front-serve-rest_cypress/blob/main/cypress/fixtures/login.example.json) + - Salvar o arquivo "login.json" com os dados informados anteriormente +- Criar o arquivo "usuario.json" + - Informar os dados com base no arquivo ["usuario.example.json"](https://github.com/AndressaKarla/testes-automatizados-e2e-front-serve-rest_cypress/blob/main/cypress/fixtures/usuario.example.json) + - Salvar o arquivo "usuario.json" com os dados informados anteriormente --- # :dart: Executar testes em um ambiente de desenvolvimento e Gerar os resultados dos testes no computador @@ -183,16 +223,16 @@ Ex.: ``` cd "C:\Users\usuario\Desktop\testes-automatizados-e2e-front-serve-rest_cypress" ``` -- Informar o comando abaixo para abrir a interface gráfica do Cypress +- Informar o comando abaixo para abrir a interface gráfica do Cypress ``` -npx cypress open +npm run cy:open ``` - NÃO fechar esse cmder - Na interface gráfica do Cypress, clicar em "Continue" - Em "Welcome to Cypress!", clicar em "E2E Testing" - Em "Choose a browser", clicar em "Chrome" - Clicar em "Start E2E Testing in Chrome" -- Em "testes-automatizados-e2e-front-serve-rest_cypress" > "Specs"> "E2E specs" > "cypress\e2e", clicar em "login-entrar", etc +- Em "testes-automatizados-e2e-front-serve-rest_cypress" > "Specs"> "E2E specs" > "cypress\e2e", clicar em "login-entrar", "login-cadastre-se", etc ## :triangular_flag_on_post: Ou executar os testes automatizados e2e (ponta a ponta) no navegador chrome em modo headless (2° plano) e Gerar os resultados dos testes no computador @@ -208,22 +248,14 @@ Ex.: ``` cd "C:\Users\usuario\Desktop\testes-automatizados-e2e-front-serve-rest_cypress" ``` -- Informar o comando abaixo para executar todas as features e/ou cenários do projeto em modo headless (2° plano - mesmo modo e comando que é utilizado no "Passo 2" da "Pipeline Testes Automatizados E2E (Ponta a Ponta) Front ServeRest Cypress" em ".github > workflows > [workflow-testes-automatizados-e2e-front-serve-rest-cypress.yml](https://github.com/AndressaKarla/testes-automatizados-e2e-front-serve-rest_cypress/blob/main/.github/workflows/workflow-testes-automatizados-e2e-front-serve-rest-cypress.yml)" no GitHub Actions) e Gerar os resultados dos testes no computador: +- Informar o comando abaixo para executar todas as features e/ou cenários do projeto em modo headless (2° plano - mesmo modo e comando semelhante ao que é utilizado no "Passo 3" da "Pipeline Testes Automatizados E2E (Ponta a Ponta) Front ServeRest Cypress" em ".github > workflows > [workflow-testes-automatizados-e2e-front-serve-rest-cypress.yml](https://github.com/AndressaKarla/testes-automatizados-e2e-front-serve-rest_cypress/blob/main/.github/workflows/workflow-testes-automatizados-e2e-front-serve-rest-cypress.yml)" no GitHub Actions) e Gerar os resultados dos testes no computador: ``` -npx cypress run --browser chrome +npm run test ``` --- # Verificar os resultados das execuções dos testes automatizados e2e (ponta a ponta) no computador :female_detective: -## :bookmark_tabs: Abrir o VS Code diretamente na pasta do projeto "testes-automatizados-e2e-front-serve-rest_cypress" -- No cmder aberto anteriormente, informar o comando abaixo para abrir o VS Code diretamente na pasta do projeto "testes-automatizados-e2e-front-serve-rest_cypress" -``` -code . -``` -- No VS Code aberto, caso seja apresentado "Do you trust the authors on the files in this folder?", marcar a opção "Trust the authors of all files in the parent folder ...." - - Clicar no botão "Yes, I trust the authors ...." - ## :bookmark_tabs: Vídeos no computador - No VS Code aberto anteriormente, acessar "cypress > videos" diff --git a/cypress.config.js b/cypress.config.js index bb3d6a7..847ed6c 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -9,8 +9,9 @@ module.exports = defineConfig({ const environment = config.env.environment || 'dev' config.env = require(`./cypress/support/environments/${environment}.json`) config.baseUrl = config.env.baseUrl - + const baseUri = config.env.baseUri + return config - }, - }, + } + } }) diff --git a/cypress/e2e/login-cadastre-se.cy.js b/cypress/e2e/login-cadastre-se.cy.js new file mode 100644 index 0000000..9ea1e2e --- /dev/null +++ b/cypress/e2e/login-cadastre-se.cy.js @@ -0,0 +1,55 @@ +/// +import seletores from '../support/seletores' + +/* + Funcionalidade: Tela Login - Opção Cadastre-se + Como usuário da Tela Login do front do ServeRest + Quero clicar na Opção Cadastre-se + Para validar o comportamento da funcionalidade +*/ + +describe('Funcionalidade: Tela Login - Opção Cadastre-se', () => { + before(() => { + cy.fixture('usuario').then((usuarioFixture) => { + cy.obterPorEmailEexcluirUsuarioPorId(usuarioFixture.admin.emailValido) + }) + }) + + context('Dado que eu acesse a tela de Login do front do ServeRest', () => { + context('E que eu clique na opção Cadastre-se', () => { + context('E que eu esteja na tela Cadastro', () => { + beforeEach(() => { + cy.visit('/login') + + cy.get(seletores.LOGIN.OPCAO_CADASTRE_SE) + .should('be.visible') + .click() + + cy.url().should('be.equal', `${Cypress.config('baseUrl')}/cadastrarusuarios`) + }) + + context('Esquema do Cenário: Validar Cadastro Administrador', () => { + const exemplos = [ + { nome: 'nomeValido1', email: 'emailValido', senha: 'senhaValida1', mensagem: 'Cadastro realizado com sucesso' }, + { nome: 'nomeInvalidoVazio', email: 'emailInvalidoVazio', senha: 'senhaInvalidaVazia', mensagem: '×Nome é obrigatório×Email é obrigatório×Password é obrigatório' }, + { nome: 'nomeValido2', email: 'emailInvalidoDominioSemPonto', senha: 'senhaValida2', mensagem: 'Email deve ser um email válido' }, + ] + + exemplos.forEach((ex) => { + context(`Quando eu informar os campos ${ex.nome}, ${ex.email}, ${ex.senha} e opcão Cadastrar como administrador`, () => { + it(`Então na tela de Cadastro deverá apresentar a mensagem ${ex.mensagem}`, () => { + cy.fixture('usuario').then((usuarioFixture) => { + cy.realizarLoginOpcaoCadastreSe(usuarioFixture.admin[ex.nome], usuarioFixture.admin[ex.email], usuarioFixture.admin[ex.senha]) + }) + + cy.get(seletores.LOGIN.FORM) + .should('be.visible') + .and('contain', ex.mensagem) + }) + }) + }) + }) + }) + }) + }) +}) \ No newline at end of file diff --git a/cypress/e2e/login-entrar.cy.js b/cypress/e2e/login-entrar.cy.js index ec12699..f510b09 100644 --- a/cypress/e2e/login-entrar.cy.js +++ b/cypress/e2e/login-entrar.cy.js @@ -6,9 +6,15 @@ import seletores from '../support/seletores' Como usuário da Tela Login do front do ServeRest Quero clicar no Botão Entrar Para validar o comportamento da funcionalidade - */ +*/ describe('Funcionalidade: Tela Login - Botão Entrar', () => { + before(() => { + cy.fixture('usuario').then((usuarioFixture) => { + cy.obterPorEmailEincluirUsuarioAdmin(usuarioFixture.adminValido.nomeValido, usuarioFixture.adminValido.emailValido, usuarioFixture.adminValido.senhaValida) + }) + }) + context('Dado que eu acesse a tela de Login do front do ServeRest', () => { beforeEach(() => { cy.visit('/login') @@ -23,15 +29,15 @@ describe('Funcionalidade: Tela Login - Botão Entrar', () => { }) it('Então deverá apresentar a tela Home com o texto Bem Vindo e com o texto Este é seu sistema para administrar seu ecommerce', () => { - cy.url().should('include', `${Cypress.config('baseUrl')}/admin/home`) + cy.url().should('be.equal', `${Cypress.config('baseUrl')}/admin/home`) cy.get(seletores.HOME.TEXTO_BEM_VINDO) .should('be.visible') - .should('contain', 'Bem Vindo') + .and('contain', 'Bem Vindo') cy.get(seletores.HOME.TEXTO_SISTEMA_ADMINISTRAR_ECOMMERCE) .should('be.visible') - .should('contain', 'Este é seu sistema para administrar seu ecommerce.') + .and('contain', 'Este é seu sistema para administrar seu ecommerce.') }) }) }) @@ -50,9 +56,9 @@ describe('Funcionalidade: Tela Login - Botão Entrar', () => { cy.realizarLoginBotaoEntrar(loginFixture.invalido[ex.email], loginFixture.invalido[ex.senha]) }) - cy.get(seletores.LOGIN.FORM_LOGIN) + cy.get(seletores.LOGIN.FORM) .should('be.visible') - .should('contain', ex.mensagem) + .and('contain', ex.mensagem) }) }) }) diff --git a/cypress/fixtures/login.example.json b/cypress/fixtures/login.example.json index 8ef20ad..6a5615c 100644 --- a/cypress/fixtures/login.example.json +++ b/cypress/fixtures/login.example.json @@ -1,14 +1,14 @@ { "adminValido": { - "emailValido": "informar-email-usuario-admin-valido@dominio.com", - "senhaValida": "informar-senha-usuario-admin-valido" + "emailValido": "informar-mesmo-email-usuario-admin-valido-fixture-usuario@qa.com", + "senhaValida": "informar-mesma-senha-usuario-admin-valido-fixture-usuario" }, "invalido": { "emailInvalidoVazio": "deixar-apenas-as-aspas-duplas", "senhaInvalidaVazia": "deixar-apenas-as-aspas-duplas", - "emailInvalidoDominioSemPonto": "informar-email-usuario-invalido-dominio-sem-ponto@dominio", + "emailInvalidoDominioSemPonto": "informar-email-usuario-invalido-dominio-sem-ponto@outlook", "senhaValida": "informar-senha-usuario-valido", - "emailInvalidoNaoCadastrado": "informar-email-usuario-invalido-nao-cadastrado@dominio.com", + "emailInvalidoNaoCadastrado": "informar-email-usuario-invalido-nao-cadastrado@gmail.com", "senhaInvalidaNaoCadastrada": "informar-senha-usuario-invalido-nao-cadastrada" } } \ No newline at end of file diff --git a/cypress/fixtures/usuario.example.json b/cypress/fixtures/usuario.example.json new file mode 100644 index 0000000..a8721e5 --- /dev/null +++ b/cypress/fixtures/usuario.example.json @@ -0,0 +1,18 @@ +{ + "adminValido": { + "nomeValido": "informar-nome-usuario-admin-valido", + "emailValido": "informar-mesmo-email-usuario-admin-valido-fixture-login@qa.com", + "senhaValida": "informar-mesma-senha-usuario-admin-valido-fixture-login" + }, + "admin": { + "nomeValido1": "informar-outro-nome-usuario-admin-valido", + "emailValido": "informar-outro-email-usuario-admin-valido@gmail.com", + "senhaValida1": "informar-outra-senha-usuario-admin-valido", + "nomeInvalidoVazio": "deixar-apenas-as-aspas-duplas", + "emailInvalidoVazio": "deixar-apenas-as-aspas-duplas", + "senhaInvalidaVazia": "deixar-apenas-as-aspas-duplas", + "nomeValido2": "informar-outro-nome-usuario-admin-valido", + "emailInvalidoDominioSemPonto": "informar-email-usuario-admin-invalido-dominio-sem-ponto@yahoo", + "senhaValida2": "informar-outra-senha-usuario-admin-valido" + } +} \ No newline at end of file diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 86473a9..8e616b9 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -1,52 +1,94 @@ /// import seletores from './seletores' -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) - Cypress.Commands.add('realizarLoginBotaoEntrar', (email = '', senha = '') => { - cy.get(seletores.LOGIN.CAMPO_EMAIL).as('campoEmail') - cy.get(seletores.LOGIN.CAMPO_SENHA).as('campoSenha') - cy.get(seletores.LOGIN.BOTAO_ENTRAR).as('botaoEntrar') - - if (email !== '') { - cy.get('@campoEmail') - .should('be.visible') - .click() - .type(email) - } + cy.get(seletores.LOGIN.BOTAO_ENTRAR).as('botaoEntrar') + + if (email !== '') { + cy.get(seletores.LOGIN.CAMPO_EMAIL) + .should('be.visible') + .click() + .type(email) + } - if (senha !== '') { - cy.get('@campoSenha') - .should('be.visible') - .click() - .type(senha, { log: false }) - } + if (senha !== '') { + cy.get(seletores.LOGIN.CAMPO_SENHA) + .should('be.visible') + .click() + .type(senha, { log: false }) + } + + cy.get('@botaoEntrar') + .should('be.visible') + .click() +}) + +Cypress.Commands.add('realizarLoginOpcaoCadastreSe', (nome = '', email = '', senha = '') => { + cy.get(seletores.CADASTRO.OPCAO_ADMIN).as('opcaoAdmin') + + if (nome !== '') { + cy.get(seletores.CADASTRO.CAMPO_NOME) + .should('be.visible') + .click() + .type(nome) + } - cy.get('@botaoEntrar') + if (email !== '') { + cy.get(seletores.LOGIN.CAMPO_EMAIL) .should('be.visible') .click() + .type(email) + } + + if (senha !== '') { + cy.get(seletores.LOGIN.CAMPO_SENHA) + .should('be.visible') + .click() + .type(senha, { log: false }) + } + + cy.get('@opcaoAdmin') + .should('be.visible') + .click() + + cy.get(seletores.CADASTRO.BOTAO_CADASTRAR) + .should('be.visible') + .click() +}) + +// App Actions +Cypress.Commands.add('obterPorEmailEexcluirUsuarioPorId', (email) => { + cy.request({ + url: Cypress.env('baseUri') + `/usuarios?email=${email}`, + method: 'GET', + }).then(response => { + let retornoGet = response.body + + if ((retornoGet.quantidade) == 1) { + let idUsuarioRetornado = retornoGet.usuarios[0]._id + + cy.request({ + url: Cypress.env('baseUri') + `/usuarios/${idUsuarioRetornado}`, + method: 'DELETE', + }) + } + }) +}) + +Cypress.Commands.add('obterPorEmailEincluirUsuarioAdmin', (nome, email, senha) => { + cy.request({ + url: Cypress.env('baseUri') + `/usuarios?email=${email}`, + method: 'GET', + }).then(response => { + let retornoGet = response.body + + if ((retornoGet.quantidade) == 0) { + cy.request({ + url: Cypress.env('baseUri') + '/usuarios', + method: 'POST', + headers: { 'accept': 'application/json', 'content-type': 'application/json' }, + body: { "nome": nome, "email": email, "password": senha, "administrador": "true" } + }) + } + }) }) \ No newline at end of file diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js index 15a15b3..c207e05 100644 --- a/cypress/support/e2e.js +++ b/cypress/support/e2e.js @@ -1,22 +1,2 @@ /// - -// *********************************************************** -// This example support/e2e.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands' - -// Alternatively you can use CommonJS syntax: -// require('./commands') \ No newline at end of file +import './commands' \ No newline at end of file diff --git a/cypress/support/seletores.js b/cypress/support/seletores.js index 91e95a7..12f76be 100644 --- a/cypress/support/seletores.js +++ b/cypress/support/seletores.js @@ -3,12 +3,17 @@ const seletores = { CAMPO_EMAIL: '#email', CAMPO_SENHA: 'input[name="password"]', BOTAO_ENTRAR: 'button[type="submit"]', - FORM_LOGIN: 'form[class="form"]', + FORM: 'form[class="form"]', OPCAO_CADASTRE_SE: 'a[type="button"]' }, + CADASTRO: { + CAMPO_NOME: 'input[placeholder="Digite seu nome"]', + OPCAO_ADMIN: 'div[class="form-check"]', + BOTAO_CADASTRAR: 'button[type="submit"]' + }, HOME: { - TEXTO_BEM_VINDO: '#root > div > div > h1', - TEXTO_SISTEMA_ADMINISTRAR_ECOMMERCE: '#root > div > div > p.lead' + TEXTO_BEM_VINDO: 'h1', + TEXTO_SISTEMA_ADMINISTRAR_ECOMMERCE: '.lead' } } diff --git a/package.json b/package.json index 77f1ed3..7b61376 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "main": "cypress.config.js", "scripts": { "cy:open": "cypress open", - "test": "cypress run --browser chrome" + "cy:open:local": "cypress open --env environment=local", + "test": "cypress run --browser chrome", + "test:local": "cypress run --env environment=local --browser chrome" }, "author": "Andressa Karla", "license": "ISC",