Sfondo di cetriolo

1. Panoramica

In questo breve tutorial, impareremo a conoscere gli sfondi del cetriolo, che è una funzionalità che ci consente di eseguire alcune frasi per ogni test di una caratteristica del cetriolo.

2. Sfondo di cetriolo

Per prima cosa, spieghiamo cos'è lo sfondo del cetriolo. Il suo scopo è eseguire una o più frasi prima di ogni test di una funzionalità.

Ma quale problema stiamo cercando di risolvere qui?

Supponiamo di avere un'applicazione per libreria che vogliamo testare con Cucumber. Prima di tutto, creiamo quell'applicazione, che sarà semplicemente una 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(); } }

Come possiamo vedere, è possibile aggiungere e cercare libri nel negozio. Ora creiamo alcune frasi di Cucumber per interagire con il negozio di libri:

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); } }
    

Con queste frasi, possiamo aggiungere libri, cercarli per autore o titolo e controllare se li troviamo o meno.

Ora è tutto pronto per creare la nostra funzionalità. Cercheremo i libri per autore, ma anche per titolo:

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

Questa funzione funziona bene, ma tende ad essere un po 'prolissa perché inizializziamo l'archivio per ogni test . Non solo questo crea molte linee, ma se dobbiamo aggiornare il negozio, dobbiamo farlo per ogni test. Ecco quando gli sfondi di cetriolo tornano utili.

3. Esempio

Quindi, come creare uno sfondo creando il negozio per questa funzione? Per fare ciò, dobbiamo usare la parola chiave Background , assegnargli un titolo come facciamo per uno Scenario e definire le frasi da eseguire:

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 |

Quando lo abbiamo fatto, possiamo sbarazzarci di questa frase nei test, lasciando che si concentrino sulle loro specificità:

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

Come possiamo vedere, gli scenari sono molto più brevi di prima e le frasi rimanenti si concentrano su ciò che stiamo cercando di testare piuttosto che impostare i dati.

4. Differenza con @Before

Ora, discutiamo la differenza tra uno sfondo di cetriolo e il gancio @Before . L'hook ci consente anche di eseguire codice prima di uno scenario, ma questo codice è nascosto a coloro che stanno solo leggendo i file delle funzionalità . D'altra parte, uno sfondo è composto da frasi che sono visibili nei file delle caratteristiche.

5. conclusione

In questo breve articolo, abbiamo imparato come utilizzare la funzione Sfondo cetriolo. Ci permette di eseguire alcune frasi prima di ogni scenario di una caratteristica. Abbiamo anche discusso la differenza tra questa funzione e l' hook @Before .

Come al solito, il codice per questo articolo può essere trovato su GitHub.