Cucumber 
Cucumber è un tool che permette di utilizzare il BDD all'interno dei propri progetti tramite la descrizione delle feature in un linguaggio naturale e l'implementazione delle glue options (codice che aiuta cucumber a bindare gli step (opens in a new tab)) che permettono di implementare i test effettivi.
Ragiona in termini di comportamento e non di implementazione È molto difficile che questo tipo di approccio ti serva per scrivere test unitari, ma è molto utile per scrivere test di integrazione e test di sistema. Quindi ragiona sui comportamenti delle feature nell'overall e non sul testing di singole funzioni o piccole implementazioni
Descrizione delle feature
Il primo passo per poter utilizzare cucumber è quello di descrivere le feature che si vogliono testare. Per fare ciò si utilizza il linguaggio Gherkin (opens in a new tab), un linguaggio di alto livello che permette di descrivere le feature in un linguaggio naturale.
Gherkin
Gherkin è una sintassi che permette di descrivere dei comportamenti in maniera umanamente comprensibile
Esempio di feature descritta in Gherkin:
Feature: Login
Scenario: Login with valid credentials
Given I am on the login page
When I enter valid credentials
Then I should be logged inGlue Options
Le glue options non sono altro che funzioni che permettono di bindare gli step definiti nelle feature con il codice che implementa i test effettivi.
Esempio di glue options:
Given('I am on the login page', function () {
// ...
})
When('I enter valid credentials', function () {
// ...
})
Then('I should be logged in', function () {
// ...
})World Object
Il world object è un oggetto che viene creato ad ogni esecuzione di una feature e viene passato come parametro alle glue options. Questo oggetto può essere utilizzato per salvare lo stato del test e per passare informazioni tra le glue options.
Il world object non è altro che il this delle funzioni
Attenzione: il world object viene creato ad ogni esecuzione di una feature, quindi non è possibile salvare informazioni tra le varie esecuzioni
Esempio di world object:
Given('I am on the login page', function () {
this.page = 'login'
})
When('I enter valid credentials', function () {
this.credentials = 'valid'
})
Then('I should be logged in', function () {
console.log(this.page) // 'login'
console.log(this.credentials) // 'valid'
})Attenzione: Per poter utilizzare il world object è necessario che le funzioni non siano arrow function