Introdução ao cucumber
Tags: java, cucumber, bdd, teste
Published: 2022-12-20 21:49:41

O Cucumber é uma ferramenta de teste de software que permite escrever cenários de teste em linguagem natural e, em seguida, verificar se o sistema está comportando-se de acordo com esses cenários. Esses cenários são escritos em um formato chamado Gherkin, que é uma linguagem específica para descrever cenários de teste. O Cucumber é amplamente utilizado em projetos de teste de aceitação, pois permite que os desenvolvedores, gerentes de projeto e outros partes interessadas escrevam cenários de teste de maneira clara e concisa, sem a necessidade de conhecimento técnico.

Existem anotações pré definidas que são utilizados na hora de especificar cenários de teste: ***Given***, ***When***, ***Then***, ***And***, ***But***. As anotações permitem que o compilador saiba o que deve ser feito na execução. Para ilustrar como o Cucumber funciona, vamos considerar um exemplo de um sistema de gerenciamento de livros. O Gherkin para este cenário poderia ser escrito da seguinte maneira:

```makefile
Scenario: Request a book by id
    Given set book id for search 1
    When find a book by id
    Then the request status for a book id mut return 200 HTTP status
    And the request must return a valid book
    And for book 1 title must be "Amsterdam" and author "Ian McEwan"
```

Este cenário descreve o comportamento esperado do sistema quando um livro é pesquisado. O Cucumber lê esse cenário e, em seguida, chama o código para verificar se o sistema está se comportando de acordo com ele. Se o sistema não estiver se comportando de acordo com o cenário, o Cucumber apresentará um erro.

Para implementar este cenário de teste, seria necessário escrever código que verifique se o livro pesquisado realmente retornou como esperado. Um exemplo de código em Java seria:

```java
@Given("set book id for search {long}")
public void setBookIdForSearch(Long id) {
    this.bookId = id;
}

@When("find a book by id")
public void findABookById() {
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<Book> forEntity = restTemplate.getForEntity(format(ENDPOINT, 1L), Book.class);
    bookResponse = forEntity.getBody();
    httpStatusResponse = forEntity.getStatusCode();
}

@Then("the request status for a book id mut return {int} HTTP status")
public void theRequestStatusForABookIdMutReturnHTTPStatus(int statusCode) {
    assertThat(httpStatusResponse.value(), equalTo(statusCode));
}

@And("the request must return a valid book")
public void theRequestMustReturnAValidBook() {
    assertNotNull(bookResponse);
    assertNotNull(bookResponse.getId());
    assertNotNull(bookResponse.getTitle());
    assertNotNull(bookResponse.getAuthor());
}

@And("for book {long} title must be {string} and author {string}")
public void forBookTitleMustBeAndAuthor(Long id, String title, String author) {
    assertThat(bookResponse.getId(), equalTo(id));
    assertThat(bookResponse.getTitle(), equalTo(title));
    assertThat(bookResponse.getAuthor(), equalTo(author));
}
```

Este código implementa cada uma das etapas do cenário de teste em Gherkin.

Um dos principais benefícios do Cucumber é que ele permite aos stakeholders escreverem cenários de teste sem conhecimento técnico, o que facilita a comunicação e a colaboração entre os membros do time. Além disso, o Cucumber é amplamente compatível com diversas linguagens de programação, o que significa que pode ser utilizado em praticamente qualquer projeto de software.

Outro benefício do Cucumber é que ele permite que os cenários de teste sejam reutilizados. Isso significa que, uma vez que um cenário de teste foi escrito e implementado, ele pode ser facilmente reutilizado em diferentes projetos ou até mesmo em projetos futuros. Isso pode economizar muito tempo e esforço ao longo do tempo.

Página documentação do cucumber: [https://cucumber.io/](https://cucumber.io/)

Código fonte: https://github.com/rodolfomarriel/cucumberexample