Cucumber-js: adicionar ganchos BeforeStep / AfterStep

Criado em 4 jan. 2018  ·  33Comentários  ·  Fonte: cucumber/cucumber-js

Útil para validações após o término de cada etapa. this deve ser a instância mundial

Comentários muito úteis

Olá a todos,

Alguma atualização nos ganchos do Step? Ou alguma solução para executar algum código antes e/ou após a execução de cada etapa?

Todos 33 comentários

@charlierudolph Gostaria de ajudar aqui, mas preciso de algumas dicas sobre a maneira apropriada de implementá-lo. Eu acredito que havia açúcar sintático AfterStep para registerHandler que foi removido recentemente. Eu olhei para support_code_library_builder/define_helpers.js. Mas preciso de algumas dicas sobre como implementar esses ganchos.
obrigado
Todos
PS Obrigado por reverter o formato json do resultado.

Uma pergunta aqui, porém, é como isso afeta o fluxo de trabalho? Isso pode editar o status do resultado da etapa ou funciona como outra etapa que pode ser aprovada / reprovada?

O caso de uso que vi em um dos comentários e que também quero usar é criar uma captura de tela após a etapa. Em pepino ruby ​​eu usei o AfterStep que fornece acesso ao objeto Scenario.
IMHO o gancho afterstep deve ser usado apenas para casos de uso em que o usuário deseja introspectar o resultado da etapa, mas não deve poder alterar o resultado. Eu também acho que não deve ser mais um passo que pode passar/falhar.

@charlierudolph Também estou procurando uma solução semelhante.
Antes que o registerHandler se tornasse obsoleto, usei este código para tirar a captura de tela após as etapas com falha.:

```
this.registerHandler('StepResult', function (evento, retorno de chamada) {
var stepResult = event.getPayloadItem('stepResult');

if (stepResult.getStatus() == 'failed') {
  takeScreenshot()
    .then(function () {
      callback();
    });
} else {
  callback();
}});

````

Agora não tenho solução para isso.

Oi,

Eu vi na maioria dos tópicos que li sobre o gancho BeforeStep/AfterStep que o caso de uso está tirando uma tela de impressão. Este não é meu caso de uso e eu só quero expressar outros casos de uso para esses ganchos:

Meu projeto usou o gancho this.AfterStep no pepino 1.x para:

  • coleta de dados - como todos os links externos:
    element.all(by.css('a')).each(function(link) { link.getAttribute('href').then(function(href) { ... }); });

Todos os links externos são então testados em um traje de teste separado.

  • Verificação de duplicatas de ID de elemento (o objetivo é garantir que todos os IDs sejam exclusivos para cumprir o padrão HTML e também facilitar a criação de testes)
  • Verificando erros de script (o AfterStep definiria uma variável para o gancho After para realmente falhar no cenário).
  • Desconsiderando os alertas do navegador. Alguns cenários de teste abrem a janela de alerta do navegador da web que podemos querer desconsiderar. Isso se aplica especialmente quando há elementos de formulário e entrada, o navegador alertará ("Você tem alterações não salvas...")

Atualmente usando Cucumber 4.0.0 e Transferidor 4.0.14

Nota lateral: Nossos casos de uso não funcionaram corretamente com this.AfterStep() no Cucumber 1.xx porque ele não foi projetado para ter esse tipo de código nele e vimos problemas com condições de corrida. Portanto, atualizamos para o Cucumber 4.0.0 e desabilitamos a lógica do AfterStep até que haja suporte adequado para ele.

Oi,

alguma atualização sobre esses ganchos de etapa antes/depois?
Existe alguma solução alternativa para o gancho AfterStep? Eu gostaria de tirar uma captura de tela se o teste específico falhou.

"attach" não está disponível para mim porque substituímos o construtor World padrão https://github.com/cucumber/cucumber-js/blob/master/docs/support_files/world.md

Obrigado

Olá @gajo4256 ,

Estou usando o pepino 4.0.0 e este trecho:

After(function (scenario) {
  if (scenario.result.status === Status.FAILED) {
    const World = this;

    return browser.takeScreenshot().then(function (buffer) {
      return World.attach(buffer, 'image/png');
    });
  }});

Isso fará uma captura de tela após cada cenário com falha. (Funciona para mim, porque com pepino, sempre que uma etapa falhar, todo o cenário falhará, por isso é quase idêntico a "após a falha da etapa".

Espero que ajude.

Olá @mracz ,

thnx, eu realmente tentei isso (embora após cada etapa seria mais adequado para mim).
Como eu substituí o construtor padrão do mundo, como posso anexar novamente disponível para mim, como é no caso normal?

Obrigado

Olá @gajo4256 ,

Isto é o que eu tenho na minha implementação do mundo personalizado:

const { setWorldConstructor } = require('cucumber');

function CustomWorld( { attach } ) {
  this.attach = attach;
}

setWorldConstructor(CustomWorld);

@mracz , atualmente faço isso para cada etapa:

    When('I do something', function () {
        return takeScreenshot(this, () => {
            return $(...).click();
        });
    });

Onde a função de captura de tela é esta:

export function takeScreenshot(world, stepToExecute: () => promise.Promise<any>): promise.Promise<any> {
    return stepToExecute().then(() => {
        return doTakeScreenshot(world);
    }).catch((err) => {
        return doTakeScreenshot(world).then(() => {
            throw err;
        });
    });
}

function doTakeScreenshot(world) {
    return browser.takeScreenshot().then((screenshot) => {
        world.attach(screenshot, 'image/png');
    }).catch((err) => {
        console.warn('Could not create screenshot', err);
    });
}

Eu posso ter sido muito defensivo sobre exceções, mas fiz o meu melhor para que o código extra não interferisse nos resultados reais do teste. O melhor que posso fazer agora, um gancho AfterStep funcionando me faria adicionar menos clichê.

No entanto, o que o gancho provavelmente não faria é pular capturas de tela quando estou fazendo afirmações que não alteram a tela (assim, a captura de tela seria inútil), por exemplo Then some element is not shown . Eu acho que um objeto de mundo extensível poderia ajudar lá fora.

Aqui está outro caso de uso para ganchos AfterStep : Aguarde até que os pares sincronizem (usando relógios vetoriais ou carimbos de data/hora de lamport). /cc @tooky @jbpros

Olá pessoal.
Na verdade, estou trabalhando nesta questão.

Estamos procurando uma maneira de fazer capturas de tela de todas as nossas diferentes etapas.
No momento, estamos pensando em substituir a função StepDefinitions do pepino.

Não sei se é a melhor maneira possível, então, por favor, não hesite em dar sua opinião sobre isso!

Para quem está lutando, aqui está uma maneira de fazer isso com o wrapper de função de definição: https://github.com/PeerioTechnologies/peerio-icebear/blob/dev/test/e2e/code/hooks.js#L28

Nosso caso de uso principal seria como os outros aqui: capturas de tela, mas usando-o mais como uma ferramenta de depuração para que possamos ver a saída de cada etapa se ativarmos o modo de depuração em nossa configuração.

Outro uso: temos alguns modais que podem aparecer após certos períodos de tempo em nosso site. Se percorrermos um cenário, gostaríamos de ter verificações para esses modais na página após cada etapa para garantir que nossos testes não sejam frágeis por causa desses modais.

Outro caso de uso: se alguém quisesse criar uma ferramenta de relatório completa com painel (status de teste atualmente em execução, casos de teste que foram executados anteriormente etc.), o pepino poderia postar na ferramenta nos ganchos da etapa para uma atualização do progresso. É um exemplo incomum, eu sei, mas é algo que estou interessado em analisar agora que pensei sobre isso.

KyleFairns, preciso do AfterStep para o painel como você mencionou

Olá,

Queremos verificar se há algum erro de javascript após cada etapa. Não apenas as etapas falhadas.
(Um pouco igual a @markus-lundin-86)
Agora só podemos fazer isso após cada cenário.
Então isso está no roteiro, ou alguém tem outras soluções?

Acabei de descobrir que o WebDriverIO tem ganchos beforeStep e afterStep para pepino, o que resolve meu problema.

Espero que ajude...

Olá a todos,

Alguma atualização nos ganchos do Step? Ou alguma solução para executar algum código antes e/ou após a execução de cada etapa?

Olá a todos,
Na mesma situação que @Prasant-Sutaria.
Alguma atualização nos ganchos de etapa ou solução alternativa?
Desde já, obrigado.

Sem atualizações. Ainda aguardando alguém enviar uma solicitação de pull para isso.

Existe algum roteiro ou algo para isso? Como este é um grande ponto problemático para ter esse recurso, talvez uma declaração oficial seja legal.

@aslakhellesoy existe uma lista de verificação ou algo que um pull-request precisa implementar? AFAIK #1058 e #1121 tentam trazer esse recurso ou algumas maneiras de contornar.

Ei pessoal,
Acabei de criar um PR sobre esse problema: https://github.com/cucumber/cucumber-js/pull/1198.
Deixe-me saber se você achar útil.

@aslakhellesoy , criei o PR acima (#1198) para resolver esse problema/solicitação de recurso. Você pode por favor dar uma olhada nisso, ou me indicar alguém que eu deveria entrar em contato?
cc: @charlierudolph

alguma atualização? ansioso para tê-lo também :)

Eu vejo 2 PRs @leonardonelson91
Acho que eles não encontraram a melhor maneira de implementar esse recurso
https://github.com/cucumber/cucumber-js/pull/1198
https://github.com/cucumber/cucumber-js/pull/1058

@charlierudolph você tem uma visão sobre se as funções registradas em BeforeStep e AfterStep ainda devem ser executadas se a etapa expirar?

Como alguns outros aqui, estou usando setDefinitionFunctionWrapper para obter as capturas de tela, que funcionam muito bem, exceto que não tenho como entrar no tempo limite das etapas de teste - o melhor que posso fazer é fornecer um tempo limite mais curto para o instrumentação do navegador para que ele seja lançado enquanto a etapa ainda estiver ativa. Espero trabalhar em uma correção para setDefinitionFunctionWrapper mas também queria saber qual era a intenção aqui.

Eu esperaria que BeforeStep / AfterStep fosse executado independentemente de uma etapa passar / falhar (devido a um tempo limite ou não)

Apenas para adicionar um caso de uso adicional a isso, que não é sobre capturas de tela. Estou testando um sistema orientado a eventos e os testes fazem com que os eventos sejam gerados. Esses eventos são então lidos e criam alterações no sistema.

As etapas a seguir validam se o sistema está no estado esperado, o que requer que todos os eventos tenham sido processados. Gostaria de poder garantir que a fila tenha sido totalmente processada e que não haja nada em estado pendente antes de passar para a próxima etapa.

Atualmente estou fazendo algumas pesquisas do fluxo de eventos nas etapas de validação, mas seria bom apenas colocá-lo em um gancho. Como é um requisito onipresente que o sistema esteja em estado estável antes de ir para a próxima etapa.

@davidjgoss @charlierudolph Por favor, você pode me ajudar com um exemplo de código de exemplo de setDefinitionFunctionWrapper para obter as capturas de tela BeforeStep/AfterStep?, Estou tentando com o Nightwatch JS

Oi @RArkasali aqui está um trecho de um projeto em que trabalho:

import {setDefinitionFunctionWrapper} from "cucumber";

setDefinitionFunctionWrapper(function(fn) {
    return async function(...args) {
        try {
            return await fn.apply(this, args);
        } catch (ex) {
            await this.takeScreenshot();
            throw ex;
        }
    };
});

(Onde takeScreenshot é um método em seu World personalizado que faz as capturas de tela. Não estou familiarizado o suficiente com o nightwatch para saber como é, mas tenho certeza que você vai ser.)

Portanto, isso fará uma captura de tela se houver um erro (como uma falha de asserção) de dentro da função step. O fato de retornarmos o resultado de um sem erro é importante - fiquei confuso por um tempo enquanto um passo com return "pending" não estava sendo tratado, até que percebi que estava engolindo o valor de retorno.

Espero que isto ajude

Olá a todos,
qual é o estado desta questão? Ainda precisa de ajuda?
Estou interessado em BeforeStep e AfterStep, porque me ajudaria a ter um arquivo "log" com todos os nomes das etapas e informações de log adicionais. É um pouco mais fácil do que criar um formatador personalizado.

Isso foi adicionado como parte de https://github.com/cucumber/cucumber-js/pull/1416

Fechando esses problemas, pois os ganchos foram adicionados em https://github.com/cucumber/cucumber-js/pull/1416

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

dblooman picture dblooman  ·  7Comentários

NoNameProvided picture NoNameProvided  ·  5Comentários

edgarechm picture edgarechm  ·  5Comentários

edwinwright picture edwinwright  ·  3Comentários

hdorgeval picture hdorgeval  ·  3Comentários