Fond de concombre

1. Vue d'ensemble

Dans ce court didacticiel, nous allons en apprendre davantage sur les arrière-plans de concombre, une fonctionnalité qui nous permet d'exécuter des phrases pour chaque test d'une fonctionnalité de concombre.

2. Contexte du concombre

Tout d'abord, expliquons ce qu'est le fond du concombre. Son but est d'exécuter une ou plusieurs phrases avant chaque test d'une fonctionnalité.

Mais quel problème essayons-nous de résoudre ici?

Disons que nous avons une application de librairie que nous voulons tester avec Cucumber. Tout d'abord, créons cette application, qui sera simplement une classe Java:

public class BookStore { private List books = new ArrayList(); public void addBook(Book book) { books.add(book); } public List booksByAuthor(String author) { return books.stream() .filter(book -> Objects.equals(author, book.getAuthor())) .collect(Collectors.toList()); } public Optional bookByTitle(String title) { return books.stream() .filter(book -> book.getTitle().equals(title)) .findFirst(); } }

Comme nous pouvons le voir, il est possible d'ajouter et de rechercher des livres dans le magasin. Maintenant, créons quelques phrases de concombre pour interagir avec la librairie:

public class BookStoreRunSteps { private BookStore store; private List foundBooks; private Book foundBook; @Before public void setUp() { store = new BookStore(); foundBooks = new ArrayList(); } @Given("^I have the following books in the store$") public void haveBooksInTheStore(DataTable table) { List
    
      rows = table.asLists(String.class); for (List columns: rows) { store.addBook(new Book(columns.get(0), columns.get(1))); } } @When("^I search for books by author (.+)$") public void searchForBooksByAuthor(String author) { foundBooks = store.booksByAuthor(author); } @When("^I search for a book titled (.+)$") public void searchForBookByTitle(String title) { foundBook = store.bookByTitle(title).orElse(null); } @Then("^I find (\\d+) books$") public void findBooks(int count) { assertEquals(count, foundBooks.size()); } @Then("^I find a book$") public void findABook() { assertNotNull(foundBook); } @Then("^I find no book$") public void findNoBook() { assertNull(foundBook); } }
    

Avec ces phrases, nous pouvons ajouter des livres, les rechercher par auteur ou titre, et vérifier si nous les trouvons ou non.

Désormais, tout est prêt pour que nous puissions créer notre fonctionnalité. Nous rechercherons des livres par leur auteur, mais aussi par leur titre:

Feature: Book Store Without Background Scenario: Find books by author Given I have the following books in the store | The Devil in the White City | Erik Larson | | The Lion, the Witch and the Wardrobe | C.S. Lewis | | In the Garden of Beasts | Erik Larson | When I search for books by author Erik Larson Then I find 2 books Scenario: Find books by author, but isn't there Given I have the following books in the store | The Devil in the White City | Erik Larson | | The Lion, the Witch and the Wardrobe | C.S. Lewis | | In the Garden of Beasts | Erik Larson | When I search for books by author Marcel Proust Then I find 0 books Scenario: Find book by title Given I have the following books in the store | The Devil in the White City | Erik Larson | | The Lion, the Witch and the Wardrobe | C.S. Lewis | | In the Garden of Beasts | Erik Larson | When I search for a book titled The Lion, the Witch and the Wardrobe Then I find a book Scenario: Find book by title, but isn't there Given I have the following books in the store | The Devil in the White City | Erik Larson | | The Lion, the Witch and the Wardrobe | C.S. Lewis | | In the Garden of Beasts | Erik Larson | When I search for a book titled Swann's Way Then I find no book

Cette fonctionnalité fonctionne bien, mais elle a tendance à être un peu verbeuse car nous initialisons le magasin pour chaque test . Non seulement cela crée beaucoup de lignes, mais si nous devons mettre à jour le magasin, nous devons le faire pour chaque test. C'est là que les fonds de concombre sont utiles.

3. Exemple

Alors, comment créer un arrière-plan créant le magasin pour cette fonctionnalité? Pour ce faire, il faut utiliser le mot - clé Background , lui donner un titre comme on le fait pour un scénario , et définir les phrases à exécuter:

Background: The Book Store Given I have the following books in the store | The Devil in the White City | Erik Larson | | The Lion, the Witch and the Wardrobe | C.S. Lewis | | In the Garden of Beasts | Erik Larson |

Lorsque nous avons fait cela, nous pouvons nous débarrasser de cette phrase dans les tests, en les laissant se concentrer sur leurs spécificités:

Scenario: Find books by author When I search for books by author Erik Larson Then I find 2 books Scenario: Find books by author, but isn't there When I search for books by author Marcel Proust Then I find 0 books Scenario: Find book by title When I search for a book titled The Lion, the Witch and the Wardrobe Then I find a book Scenario: Find book by title, but isn't there When I search for a book titled Swann's Way Then I find no book

Comme nous pouvons le voir, les scénarios sont beaucoup plus courts qu'avant et les phrases restantes se concentrent sur ce que nous essayons de tester plutôt que sur la configuration des données.

4. Différence avec @Before

Maintenant, discutons de la différence entre un fond de concombre et le crochet @Before . Le hook nous permet également d'exécuter du code avant un scénario, mais ce code est caché à ceux qui ne lisent que les fichiers de fonctionnalités . D'un autre côté, un arrière-plan est constitué de phrases visibles dans les fichiers de fonctionnalités.

5. Conclusion

Dans ce court article, nous avons appris à utiliser la fonction d'arrière-plan de concombre. Il nous permet d'exécuter quelques phrases avant chaque scénario d'une fonctionnalité. Nous avons également discuté de la différence entre cette fonctionnalité et le hook @Before .

Comme d'habitude, le code de cet article se trouve à l'adresse over sur GitHub.