Cypress 13 com BDD/Cucumber – Configurando e executando

Integração do Cypress com Cucumber/BDD

Integração do Cypress com Cucumber/BDD

Após a versão 10 do Cypress, algumas mudanças são necessárias para integrar Cucumber/BDD com o Cypress de maneira eficaz. Neste post, focaremos na versão 13 do Cypress e demonstraremos como integrá-lo com o Cucumber, bem como usar o Page Object Model (POM) junto com o Cucumber para automação de testes eficiente.

Visão Geral

O Cucumber é um conhecido framework de Desenvolvimento Orientado por Comportamento (BDD) que permite aos desenvolvedores implementarem testes de ponta a ponta. O framework Cucumber é projetado para ajudar desenvolvedores e QA a escrever casos de teste de aceitação que sejam facilmente compreendidos por qualquer usuário que acesse o software.

Os casos de teste são escritos com base no comportamento das funções da aplicação, em uma linguagem que é facilmente compreendida por usuários comuns. Essa característica torna o Cucumber uma ferramenta popular de teste BDD, conectando a lacuna entre os proprietários de produtos e os desenvolvedores.

Outro motivo da popularidade do framework é que ele utiliza uma linguagem chamada Gherkin. O Gherkin é a linguagem usada pelos desenvolvedores do Cucumber para definir testes. Por ser escrito em inglês simples, é fácil de entender, mesmo para um usuário não técnico.

A combinação de Cypress e Cucumber proporciona um framework robusto que permite criar testes funcionais de forma simples.

O que é BDD?

Desenvolvimento Orientado por Comportamento (BDD) é uma abordagem de desenvolvimento que promove a comunicação entre os membros da equipe. Essa abordagem colaborativa une os aspectos de negócios e técnicos dos projetos. O BDD simula como uma aplicação deve se comportar do ponto de vista do usuário final. O principal objetivo de implementar testes BDD é melhorar a colaboração entre desenvolvedores, QA, DevOps, PO, BA e outros stakeholders.

O BDD permite que as equipes comuniquem melhor os requisitos, detectem problemas precocemente e mantenham o software facilmente ao longo do tempo. Isso assegura que toda a equipe compreenda os requisitos e se concentre em prevenir problemas potenciais, ao invés de corrigi-los posteriormente. O BDD garante que todos estejam alinhados desde o início e durante todo o processo, o que ajuda na comunicação eficaz e na qualidade entre os membros da equipe.

O que é Cucumber?

O Cucumber é um framework open-source que suporta BDD. O Cucumber suporta a linguagem Gherkin, na qual podemos escrever nossos casos de uso em inglês simples, que a ferramenta lê facilmente. O Cucumber lê os testes escritos em Gherkin e verifica se o código funciona como deveria. Ele faz isso trabalhando nos cenários e passos definidos em Gherkin. Uma vez que todos os casos de teste são executados, um relatório do Cucumber é gerado com cada passo e cenário, mostrando os resultados de sucesso e falha.

O que é Gherkin?

Gherkin é uma linguagem simples e estruturada usada no Cucumber para escrever especificações executáveis do comportamento do software. É projetada para ser facilmente legível por membros técnicos e não técnicos da equipe. O Gherkin usa uma sintaxe específica com palavras-chave como Given, When, Then, And, e But para descrever cenários e passos em um teste.

Os cenários Gherkin são frequentemente escritos em texto simples e descrevem o comportamento esperado de uma funcionalidade de maneira amigável para o usuário.

Exemplo de cenário Gherkin para testar a funcionalidade de login de um site:

Feature: User Login

  Scenario: Valid user login
    Given the user is on the login page
    When the user enters valid credentials
    And clicks the login button
    Then they should be logged into their account
    

Neste exemplo, o Gherkin é usado para definir os passos necessários para testar a funcionalidade de login. O Cucumber pode então executar esses passos e verificar se o comportamento corresponde ao resultado esperado.

Sintaxe de escrita do arquivo de feature

Primeiro, você deve explicar a funcionalidade que deseja implementar, geralmente na forma clássica de uma história de usuário: Como um <personagem>, Eu Quero <funcionalidade>, Para <valor de negócio>.

Depois, você pode definir um ou mais cenários de negócio, significando o comportamento geral que você deseja obter com a história de usuário.

Imagem

Instalando Cypress

Abaixo estão os passos para instalar o Cypress.

Passo 1: Crie uma pasta e gere o arquivo package.json

  1. Crie um projeto, nomeando-o cypress_Cucumber_BDD.
  2. Use o comando npm init para criar um arquivo package.json.

Passo 2: Execute o comando abaixo para instalar o Cypress

npm install cypress --save-dev

Após a instalação, veremos que a versão 13 (mais atual até a data de hoje) do Cypress está refletida no package.json:

{
  "name": "angelofdiasg.tech",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Angelo F. Dias Gonçalves",
  "license": "ISC",
  "devDependencies": {
    "cypress": "^13.1.0"
  }
}
    

Passo 3: Crie arquivos nas pastas Pages e Steps (utilizando o pageObject)

Para fins de demonstração, cobriremos o seguinte cenário usando o site https://ecommerce-playground.lambdatest.io/index.php?route=account/login.

Implementações (Cenário de Teste)

Para demonstrar o uso do Cypress, primeiro vamos demonstrar o seguinte cenário de teste:

  1. Abra a URL https://ecommerce-playground.lambdatest.io/index.php?route=account/login.
  2. Digite seu endereço de e-mail.
  3. Digite a senha.
  4. Clique no botão de Login.
  5. Verifique o título da página.

Crie o Arquivo LoginPage.js

No LoginPage podemos criar o método necessário. No arquivo .spec abaixo, criamos quatro métodos: enterURL(), enterUserNamePassword(username, password), clickSubmitButton() e verifyPageTitle().

class LoginPage {
  enterURL() {
    cy.visit(
      "https://ecommerce-playground.lambdatest.io/index.php?route=account/login"
    );
  }
  enterUserNamePassword(username, password) {
    cy.get('[id="input-email"]').type(username);
    cy.get('[id="input-password"]').type(password);
    return this;
  }
  clickSubmitButton() {
    cy.get('[type="submit"]').eq(0).click();
    return this;
  }
  verifyPageTitle() {
    return cy.title().should("eq", "Search -");
  }
}
const login = new LoginPage();
export default login;
    

Crie o Arquivo LoginStep.js

Como estamos usando POM, podemos chamar o método necessário do arquivo de especificação LoginPage.js.
Obs.: há um “espaço” entre o menorquê e o reference no código abaixo (“< reference" ), esse espaço deve ser retirado caso faça cópida direta do código abaixo.


/// < reference types="cypress" />
import { Given, When, Then, And } from "cypress-cucumber-preprocessor/steps";
import login from "../../Pages/LoginPage/LoginPage.cy";
Given("I navigate to the Website", () => {
  login.enterURL();
});
When("I entered valid credential", (datatable) => {
  datatable.hashes().forEach((element) => {
    login.enterUserNamePassword(element.email, element.validpassword);
    login.clickSubmitButton();
  });
});
And("User click on sign in button", () => {
  login.clickSubmitButton();
});
Then("Validate the title after login", () => {
  login.verifyPageTitle();
});
    

Configurando o Cucumber e criando um arquivo de feature

Nesta seção deste tutorial de Cypress Cucumber, vamos instalar e configurar o Cucumber e criar um arquivo de feature para realizar os testes.

Instalando Cucumber

Passo 1: Para instalar o Cucumber, execute este comando

npm install --save-dev cypress-cucumber-preprocessor

Após a instalação, a dependência do Cucumber no package.json pode ser vista em “devDependencies”

Passo 2: Adicione o snippet de código abaixo em cypress.config.js

const { defineConfig } = require("cypress");
const cucumber = require("cypress-cucumber-preprocessor").default;
module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on("file:preprocessor", cucumber());
    },
  },
});
    

Passo 3 (Opcional): Adicione o snippet de código abaixo no package.json

"cypress-cucumber-preprocessor": {
  "nonGlobalStepDefinitions": false
}

Configuração nonGlobalStepDefinitions

Esta configuração indica se os arquivos de definições de passos (step definitions) são globais ou não. Quando definido como false, os arquivos de definições de passos não são globais, o que significa que eles não são carregados automaticamente antes de cada cenário. Isso é útil quando você deseja controlar explicitamente quais arquivos de definições de passos são carregados em cada cenário.

Se definido como true, os arquivos de definições de passos são considerados globais e carregados automaticamente antes de cada cenário, independentemente de serem referenciados no cenário ou não.

Essa configuração é útil para projetos maiores, onde você deseja controlar cuidadosamente quais arquivos de definições de passos são carregados em cada cenário, em vez de carregar todos eles globalmente. Isso pode ajudar a melhorar a organização e o desempenho dos testes.

Passo 4: Adicione o snippet de código abaixo no package.json (ou apenas adicione o “step_definitions” dentro do snippet do Passo 3

"cypress-cucumber-preprocessor": {
...
"step_definitions": "cypress/e2e/cucumber/steps"
}

Passo 5: Adicione a linha abaixo em cypress.config.js para rodar apenas o arquivo .feature

e2e: { 
specPattern: "**/*.feature",
...
}

Crie arquivos de .feature na pasta Features

O próximo passo é criar a pasta um arquivo .feature.

No nível da pasta steps, crie a pasta “features” e dentro delas os arquivos .feature com o nome Login.feature.

Feature: I want to login into the site with valid data

Background: Navigate to the Website
  Given I navigate to the Website

Scenario: Login as new sign up user with valid data
  When I entered valid credential
    | email                  | validpassword |
    | lambdatest11@yopmail.com | lambdatest21    |
  And User click on sign in button
  Then Validate the title after login
    

Crie o Arquivo LoginStep.js (sem pageObject)

Como estamos usando POM, podemos chamar o método necessário do arquivo de especificação LoginPage.js.
Obs.: há um “espaço” entre o menorquê e o reference no código abaixo (“< reference" ), esse espaço deve ser retirado caso faça cópida direta do código abaixo.


/// < reference types="cypress" />
import { Given, When, Then, And } from "cypress-cucumber-preprocessor/steps";
Given("I navigate to the Website", () => {
   cy.visit(
      "https://ecommerce-playground.lambdatest.io/index.php?route=account/login"
    );
});
When("I entered valid credential {string}, {string}", (e-mail, validpassword) => {
    cy.get('[id="input-email"]').type(username);
    cy.get('[id="input-password"]').type(password);
});
And("User click on sign in button", () => {
    cy.get('[type="submit"]').eq(0).click();
});
Then("Validate the title after login", () => {
    cy.title().should("eq", "Search -");
});
    

Estrutura “planejada” do Projeto

Já utilizando a estrutura do Cypress versão >= 13.

    |- cypress/
      |- e2e/
        |- features/
          |- login.feature
          |- consultaDados.feature
          |- ... (outros cenários em Gherkin)
	|- steps/
          |- loginSteps.js
          |- consultaDadosSteps.js
          |- ... (outros steps dos cenários)
      |- fixtures/
        |- exemplo.json
        |- ... (outros arquivos de apoio aos cenários)
      |- pages/
        |- login.page.js
		|- consultaDados.page.js
        |- ... (outros arquivos pages dos cenários)
      |- support/
        |- commands.js
        |- e2e.js
  

Execute os casos de teste do Cypress localmente

Você pode rodar o caso de teste a partir da linha de comando ou do Cypress runner. Vamos executar os casos de teste usando o Cypress runner.

  1. Abra o Cypress test runner com o comando abaixo:
npx cypress open
  1. O comando acima abrirá o Cypress test runner com os casos de teste existentes. No Cypress runner, podemos selecionar o navegador onde queremos rodar os casos de teste.

Na captura de tela abaixo, podemos ver os arquivos de casos de teste .feature sendo exibidos no Cypress test runner.

Execute o caso de teste

Clicando no arquivo .feature, o caso de teste começa a ser executado.

A captura de tela abaixo mostra quando o caso de teste é executado com sucesso. Podemos ver os passos sob GIVEN, WHEN, AND e THEN executados com sucesso.

Conclusão

O Cucumber é um robusto framework de Desenvolvimento Orientado por Comportamento (BDD) que permite escrever casos de teste que qualquer pessoa pode entender, independentemente do seu conhecimento técnico.

Neste tutorial de Cypress Cucumber, vimos como a combinação de Cypress e Cucumber fornece um framework robusto que permite criar testes funcionais de forma simples.