🎉 Il Necronomicon è stato aggiornato alla versione 2.0.0 🎉
Behavior Driven Development
Cucumber

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 in

Glue 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

Example repo (opens in a new tab)