Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Asserts apenas no @Then? **boas práticas**

Bom dia, estou com uma dúvida relacionada a boas práticas com Cucumber, pelo que eu entendi é usual colocar os asserts no @Then, entretanto caso eu precise checar ou validar alguma condição anterior é uma má prática utilizar asserts dentro de outras @** como o **@Given ou @When ?

@leilao
Feature: Editando um leilao

  Scenario: O usuario logado pode editar um leilao criado por ele
    Given Dado um usuario logado
    And dado um leilao criado pelo usuario
    When quando acessa a pagina de editar
    And preenche o formulario com novos dados validos
    Then volta para a pagina de leiloes
    And o leilao aparece na tabela com os novos dados
public class LeilaoSteps {

  private LoginPage loginPage;
  private LeiloesPage leioesPage;
  private NovoLeilaoPage novoLeilaoPage;
  private Browser browser;
  private AlterarLeilaoPage alterarLeilaoPage;

  @Given("Dado um usuario logado")
  public void dado_um_usuario_logado() {
    browser = new Browser();
    browser.seed();

    loginPage = browser.getLoginPage();
    leioesPage = loginPage.realizaLoginComoFulano();
  }

  @Given("dado um leilao criado pelo usuario")
  public void dado_um_leilao_criado_pelo_usuario() {
    Assert.assertTrue(this.leioesPage.existe("Tablet Xpto 3", "5.00", "fulano", "02/06/2023"));
  }

  @When("quando acessa a pagina de editar")
  public void quando_acessa_a_pagina_de_leiloes() {
    this.alterarLeilaoPage = this.leioesPage.visitaPaginaParaAltearLeilao();
  }

  @When("preenche o formulario com novos dados validos")
  public void preenche_o_formulario_com_novos_dados_validos() {
    alterarLeilaoPage.preencheForm("PS5", "4000", "01/12/2023");
  }

  @Then("volta para a pagina de leiloes")
  public void volta_para_a_pagina_de_leiloes() {
    Assert.assertTrue(this.leioesPage.estaNaPaginaDeLeiloes());
  }

  @Then("o leilao aparece na tabela com os novos dados")
  public void o_leilao_aparece_na_tabela_com_os_novos_dados() {
    Assert.assertFalse(this.leioesPage.existe("Tablet Xpto 3", "5.00", "fulano", "02/06/2023"));
    Assert.assertTrue(this.leioesPage.existe("PS5", "4000", "fulano", "01/12/2023"));
    browser.clean();
  }
}

Nesse contexto, já existe um leilão cadastrado pelo usuário fulano, por isso senti a necessidade de validar antes

 @Given("dado um leilao criado pelo usuario")
  public void dado_um_leilao_criado_pelo_usuario() {
    Assert.assertTrue(this.leioesPage.existe("Tablet Xpto 3", "5.00", "fulano", "02/06/2023"));
  }

Assim, posso confirmar que os dados reamente foram atualizados

  @Then("o leilao aparece na tabela com os novos dados")
  public void o_leilao_aparece_na_tabela_com_os_novos_dados() {
    Assert.assertFalse(this.leioesPage.existe("Tablet Xpto 3", "5.00", "fulano", "02/06/2023"));
    Assert.assertTrue(this.leioesPage.existe("PS5", "4000", "fulano", "01/12/2023"));
    browser.clean();
  }
1 resposta
solução!

Olá Pablwo, tudo bem?

Ótima pergunta! Realmente, é uma boa prática colocar os asserts apenas no @Then. Isso porque o @Then é a etapa final do cenário, onde a validação do comportamento é realizada.

No entanto, há casos em que precisamos validar uma condição anterior, como você mencionou. Nesses casos, é possível utilizar asserts em outras anotações como o @Given ou @When.

No seu exemplo, você está validando se um leilão foi criado pelo usuário fulano antes de acessar a página de edição. Isso é uma boa prática, pois garante que o cenário está sendo executado corretamente.

Então, em resumo, é possível utilizar asserts em outras anotações além do @Then, mas é importante lembrar que o @Then é a etapa final do cenário e é onde a validação do comportamento deve ser realizada.

Espero ter ajudado e bons estudos!