Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Criação de Cenários de teste

Atualmente trabalho com Nightwatch + Cucumber e consigo realizar a criação de cenários de teste onde consigo reaproveitar o código sem muito trabalho. Por exemplo:

//Arquivo de Features:

Funcionalidade: Possibilitar a criação, visualização e edição de templates
    Contexto: 
        Dado que acesse o Ambiente
        Quando preencho o campo email    
        E preencho o campo password
        Quando clico em sign in
        Entao valido que sou direcionado a tela de Nova organização
        E acesso a organizacao
        Entao valido que acessei a organizacao

    @Templates-01
    Cenário: Visualizar os templates disponíveis
        Quando valido se a aba Templates é exibida
        E acesso a aba Templates
        Entao valido que sou direcionado a aba Templates

    @Templates-03
    Cenário: Descartar um template
        Quando valido se a aba Templates é exibida
        E acesso a aba Templates
        E valido que sou direcionado a aba Templates
        E clico em Novo Template
        E clico em Descartar
        E clico em Descartar novamente para confirmar
        Então valido se foi descartado corretamente
//Arquivo StepDefinition

const {client} = require('nightwatch-api');
const templates = client.page.templatesPage();
const {Given, When, Then} = require('cucumber');

Given(/^valido se a aba Templates é exibida$/, async () => {
    await templates.validaBotaoTemplates()
});

When(/^acesso a aba Templates$/, async () => {
    await templates.clicaBotaoTemplates()
});

When(/^clico em editar Template$/, async () => {
    await templates.clicaBotaoMenuTemplate()
});

When(/^altero o nome do Template "([^"]*)"$/, async function (nome) {
    await templates.preencherNomeTemplate(nome)
});

Then(/^valido que sou direcionado a aba Templates$/, async () => {
    await templates.validaAbaTemplates()
});
//Arquivo Page-objects
//const faker = require('faker-br')

module.exports = {
    commands: [{
        getElementsLogin() {
            return require('../elements/loginElements')
        },
        getElementsOrganizacoes() {
            return require('../elements/organizacoesElements')
        },
        getElementsTemplates() {
            return require('../elements/templatesElements')
        },


        async validaBotaoTemplates() {
            return await client
                .useCss()
                .waitForElementVisible("#tab--template", 10000)
                .assert.visible("#tab--template")
        },

        async clicaBotaoTemplates() {
            return await client
                .useCss()
                .click("#tab--template")
        },

        async validaAbaTemplates() {
            return await client
                .useCss()
                .waitForElementVisible("#filter--template", 10000)
                .assert.visible("#filter--template")
        },

        async clicaBotaoNovoTemplate() {
            return await client
                .useCss()
                .click("#button--new-template")
        },

        async clicaBotaoMenuTemplate() {
            return await client
                .useCss()
                .waitForElementVisible("#button--edit", 10000)
                .click("#button--edit")
        },

        async preencherNomeTemplate(nome) {
            return await client
                .useCss()
                .waitForElementVisible("#text-title", 10000)
                .setValue("#text-title", nome)
        },

        async selecionaEscalaConf(escala) {
            return await client
                .useXpath()
                .waitForElementVisible(escala, 10000)
                .click(escala)
        },

        async validaNomeEscala() {
            return await client
                .useCss()
                .assert.equals("#radio--grading.role", "radiogroup")
        },

Perceba que na funcionalidade eu já tenho todo o fluxo de login e acesso ao sistema, logo em seguida crio os cenários que irão executar os processos definidos no PageObjects e step.

Portanto, se eu quiser que o sistema execute o processo descrito em "acesso a aba Templates", basta copiar apenas essa linha que ele irá chamar todo o processo de código já criado anteriormente.

É possível criar o mesmo cenário sem a utilização do cucumber com o Cypress, reaproveitando código já digitado? Pois tenho na mesma feature, vários cenários de testes à serem executados e o preenchimento de todo o fluxo de login por exemplo gera um código enorme.

Muito obrigado!!

2 respostas
solução!

Olá, bom dia Arthur!

Eu indicaria dar uma olhada na documentação do Cypress para validar essas dúvidas, do que eu compreendo do Cypress a parte de reutilizar comandos são feitas pelo arquivo commands.js onde você da um nome a função e passa os parâmetros de executação internamente (depois no arquivo de teste você chama essa função criada). Exemplo:

cy.login(nome, senha);
cy.criarPedido();
cy.validarPedido();

Page-objects acredito que não sejam "boas práticas" dentro do Cypress, para mais informações de um QA Sênior que trabalha com cypress youtu.be/VYG-gzA1ahY

Espero ter ajudado :)

Perfeito Diogo! Eu havia visto isso também. O problema hoje é que o Nightwatch com o Cucumber está gerando muito falso negativo no CI. Por algum motivo maluco. Investigando percebi que um dos problemas é que o Cucumber está em versão deprecated. Ao atualizar, a estrutura toda do projeto teria que ser alterada, e minha preocupação é ter que refatorar meu código sempre que houver alguma atualização.

Por isso preferi utilizar o Cypress sem o cucumber e verificar se eu poderia reutilizar o meu código já existente. Tenho mais de 200 casos de teste e vai me dar um trabalho kkk

Mas acredito que usando dessa forma vai reduzir drasticamente a quantidade de código escrita sem a necessidade do Cucumber.

Mais uma vez, agradeço seu retorno rápido! :D