Cucumber-js: Antes/Depois de ganchos e hacks de recursos

Criado em 23 ago. 2017  ·  10Comentários  ·  Fonte: cucumber/cucumber-js

Eu entendo o raciocínio por trás de não ter ganchos de recurso BeforeFeature/AfterFeature. Os testes devem, idealmente, ser isolados. No entanto, por razões práticas de desempenho, pode ser preferível configurar coisas como acessórios de banco de dados uma vez por recurso.

A solução especificada em #614 é inadequada porque:

  1. Ele não chamará After quando recursos consecutivos tiverem a mesma tag.
  2. Ele não chamará After se o recurso marcado foi o último teste na compilação.

Antes da versão 3.0.0 era possível hackear esta funcionalidade usando o contexto passado como o primeiro argumento de registerHandler('BeforeFeatures').

Alguma ideia de aceitar um PR para essa funcionalidade ou fornecer um contexto semelhante no 3.0 para pelo menos tornar o hack possível novamente?

Comentários muito úteis

+1 para ganchos BeforeFeature/AfterFeature
Concordo com a necessidade de equilibrar desempenho com isolamento de teste. Da forma como a estrutura é construída agora, há muito pouco que conecta os cenários em um único recurso, exceto pelas etapas em segundo plano que são repetidas. Em alguns casos, podemos não querer que as etapas em segundo plano sejam repetidas, mas sim que elas aconteçam uma vez no início do recurso e sejam eliminadas apenas quando todos os cenários forem concluídos.

Todos 10 comentários

Ele não chamará After quando recursos consecutivos tiverem a mesma tag.

Não entendo. Você pode, por favor, dar mais detalhes sobre isso? Você pode criar um gancho After que seja específico para a tag estar presente ou não. Observe que a sintaxe da tag foi alterada desde que essa solução alternativa foi fornecida.

Ele não chamará After se o recurso marcado foi o último teste na compilação.

Novamente, eu não entendo isso, por favor explique mais. Você deve ser capaz de usar um gancho After, mas perde o contexto de se este é ou não o último. Idealmente, você não precisa fazer nenhuma desmontagem aqui.


Além disso, você está tentando fazer com que os cenários sejam conectados, o que é desencorajado. Eu sugeriria um dos seguintes:

  • desconecte os cenários
  • execute o pepino-js várias vezes carregando diferentes arquivos de suporte e use BeforeAll / AfterAll

Para ser claro, a solução alternativa a que me refiro é:

this.Before({ tags: ['<strong i="6">@featurehook</strong>'] }, function () {
  // log user in (if needed)
})

this.Before({ tags: ['~<strong i="7">@featurehook</strong>'] }, function () {
  // log user out (if needed)
})

Considere alguns recursos:

<strong i="11">@featurehook</strong>
Feature: feature 1
   Scenario: scenario 1

<strong i="12">@featurehook</strong>
Feature: feature 2
   Scenario: scenario 2

Feature: feature 3
   Scenario: scenario 3

<strong i="13">@featurehook</strong>
Feature: feature 4
   Scenario: scenario 4

Se eles forem executados na ordem acima, a desmontagem não acontecerá entre o recurso 1 e o recurso 2. A desmontagem também não acontecerá após o recurso 4 porque não haverá outra correspondência de teste ~ @featurehook (é certo que isso pode ser corrigido com Afinal).

Não estou tentando fazer cenários conectados, para mim é estar livre para decidir sobre uma troca entre isolamento e desempenho.

Veja o exemplo de um teste que configura um servidor SMTP de teste com diferentes configurações:

<strong i="20">@smtpConfig1</strong>
Feature: ....

<strong i="21">@smtpConfig2</strong>
Feature: ....

Pode haver efeitos colaterais entre os cenários por não derrubá-lo, mas a troca entre pureza e desempenho pode valer a pena neste caso.

Desculpe, mas isso não é algo que eu acho que deve ser suportado. Existe a capacidade de compartilhar o estado em todos os cenários e em um único cenário que cobre a grande maioria dos casos. Seu exemplo no último comentário (com @featurehook) não é resolvido com BeforeFeature / AfterFeature de qualquer maneira.

+1 para ganchos BeforeFeature/AfterFeature
Concordo com a necessidade de equilibrar desempenho com isolamento de teste. Da forma como a estrutura é construída agora, há muito pouco que conecta os cenários em um único recurso, exceto pelas etapas em segundo plano que são repetidas. Em alguns casos, podemos não querer que as etapas em segundo plano sejam repetidas, mas sim que elas aconteçam uma vez no início do recurso e sejam eliminadas apenas quando todos os cenários forem concluídos.

Como eu uso um serviço como o Browserstack, que é perpetuamente lento e doloroso de se trabalhar (assim como outros provedores de servidores remotos como Saucelabs), normalmente uso os manipuladores de eventos BeforeFeature e AfterFeature para configurar sessões de selênio e desmontar por arquivo de recurso.

Portanto, os cenários relacionados a esse recurso mencionado no meu arquivo são executados juntos e para começar de novo poste cada cenário, atualizo a tela do navegador e o estado do meu aplicativo é atualizado para meus testes. Então, de certa forma, eles são isolados e isso também não afeta o desempenho do teste.

Isso deve ser considerado como um caso para trazer os ganchos de recurso Antes/Depois de volta para serem usados ​​do que executar o pepinojs por arquivo de recurso, conforme sugerido acima.

Os ganchos BeforeFeature/AfterFeature são essenciais para o teste e2e/uat/bdd/call-it-whatever-you-want para o qual o pepino é feito.

Os principais "concorrentes" do Cucumber suportam isso (por exemplo, JBehave, RobotFramework), e sem nenhum hack; é uma característica própria do framework.

Este problema é definitivamente um bloqueador para o uso do Cucumber.

Oi... Estou enfrentando um problema relacionado a isso. No meu caso, eu uso ganchos marcados Antes e Depois para criar/excluir dados que serão usados ​​para testar a interface do usuário. No hook Before eu atingi um endpoint da API e crio os dados, e no hook After eu atingi outro endpoint da API para excluí-lo (eu salvo os ids dos objetos retornados na resposta create, e então eu construo o payload delete com esses id's )

O problema é que, quando o cenário que usa esses dados (e aciona os hooks) é o último a ser executado, o after hook nunca é acionado...

Alguma maneira de contornar isso??

Obrigado

+1 para o recurso Antes e Depois.
Nosso caso de uso é este: Encontramos bugs em alguns navegadores que não aparecem em outros.

Queremos marcar um recurso assim:

@ie-8-only
Business Need: IE8 should have limited functionality, but what is displayed, should be displayed correctly

@no-access @ssl-insecurity <strong i="8">@security</strong> @BUG-1876
Scenario: No access
   Given I am on the home page
   When I see that my browser is not supported
   Then I should not be able to access the core site functionality

@formatting-issue <strong i="9">@bugs</strong> @BUG-1210
Scenario: The menu should not be formatted like a staircase
   For the users to be able to navigate to the about us / contact us area of the site, the site navigation should be active
   Given I am on the home page
   When I see the menu
   Then it should be displayed in a line

Isso nos permitirá fechar o navegador e abrir o IE em um gancho BeforeFeature, e reabrir o navegador que estamos usando para o resto da suíte no gancho AfterFeature. Fechar e reabrir o navegador leva muito tempo quando você está fazendo isso para cada cenário, o que tornaria esse um ótimo recurso para usar.

Observação:
Eu sei que existem alternativas que envolvem o objeto world (definindo o navegador atual lá, e só fechando se o navegador não for o que precisamos no gancho beforeAll para esses), mas parece mais simples fazer assim, e tem que ser feito em um gancho já ou Selenium decide que vai dar um chilique na metade do tempo.

Há outras vezes em que você pode querer anexar texto ao Recurso como uma descrição adicional para ele em um Gancho BeforeFeature, que é outro exemplo de onde isso seria útil

Eu acho que ganchos de recursos antes/depois seriam úteis em certos tipos de testes. Por exemplo, Specflow, a biblioteca Cucumber para .NET, tem estes implementados:
https://specflow.org/documentation/Hooks/

Este tópico foi bloqueado automaticamente, pois não houve nenhuma atividade recente depois que ele foi fechado. Por favor, abra um novo problema para bugs relacionados.

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