Le «Behavior driven development» ou BDD est devenu une tendance populaire en raison de sa capacité à supprimer le fossé entre les trois amigos (PO, l’équipe de développement et l’équipe de QA). On a déjà vu dans un article précédent que le BDD utilise une sorte de « Langage » appelé « Gherkin » pour préciser les critères d’acceptation d’une façon compréhensible par toutes les équipes impliquées, quelle que soit leur discipline. Cette formule de « Given-When-Then » permet à l’équipe de développement de se concentrer sur les comportements plutôt que sur l’écriture d’un code qui se limite à la réussite des tests . Autre avantage de la BDD est le fait de pouvoir mettre l’ensemble des intervenants sur la même longueur d’onde.

Alors, ne serait-il pas formidable de laisser nos machines gérer l’exécution de ces critères par rapport au code de l’application et de s’assurer que notre application se comporte convenablement ?

C’est là où les frameworks comme Cucumber interviennent.

Cucumber à la rescousse !

Cucumber est le framework BDD le plus populaire grâce aux plusieurs avantages :

  • c’est open source
  • Il prend en charge les projets développés en Java, Ruby, C# et beaucoup plus.
  • assez simple à utiliser.
  • Soutenu par une grande communauté

Le framework est utilisé pour traduire les critères d’acceptation en tests exécutables, ce qui nous évite les tracas des tests manuels. Ces tests écrits serviront également de tests de régression dans les incréments futurs.

Alors comment ça marche vraiment ?

Pour cette section, nous allons utiliser un exemple d’un petit projet Java et écrire un ensemble de tests pour avoir une idée sur le fonctionnement du processus. Pour continuer à suivre ce guide, il y a quelques prérequis à installer :

Après avoir installé ces logiciels, on peut entamer la partie technique de l’article.

Commençons par télécharger le projet à partir de github avec la commande :

1
git clone https://github.com/tuniteam/cucumber_demo

 

Vous pouvez accéder au projet à l’état finale sur https://github.com/tuniteam/cucumber_demo/tree/finished 

Il s’agit d’un projet Maven avec quelques dépendances notamment Cucumber et Junit comme c’est montré ci-dessous :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<dependencies>
		<dependency>
			<groupId>io.cucumber</groupId>
			<artifactId>cucumber-java</artifactId>
			<scope>test</scope>
			<version>7.0.0</version>
		</dependency>

		<dependency>
			<groupId>io.cucumber</groupId>
			<artifactId>cucumber-junit-platform-engine</artifactId>
			<scope>test</scope>
			<version>7.0.0</version>
		</dependency>

		<dependency>
			<groupId>org.junit.platform</groupId>
			<artifactId>junit-platform-suite</artifactId>
			<scope>test</scope>
			<version>1.8.1</version>
		</dependency>

		<dependency>
			<groupId>org.junit.jupiter</groupId>
			<artifactId>junit-jupiter</artifactId>
			<scope>test</scope>
			<version>5.8.1</version>
		</dependency>
	</dependencies>

 

Par la suite, on importe le projet Maven dans Eclipse en utilisant le menu « File » -> « Import … » -> « Existing maven project »

N’oubliez pas de télécharger les dépendances (d’habitude Eclipse réalise cette automatiquement)

Voilà ! Le projet est importé avec succès.

Supposons que nous ayons les scénarios de cornichon suivants appartenant à la fonctionnalité de connexion.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Feature: Login functionality
  
  Scenario: Logging in with an inexistent email
    Given I've chosen to login
    When I use any password
    And I try to login using an email of an inexistent user
    Then I should get a text saying "Email doesn't exist"
    
  Scenario: Logging in with an incorrect password
    Given I've chosen to login
    When I enter a valid email and an incorrect password
    Then I should get a text saying "Incorrect password used"
    
  Scenario: Logging in successfully
    Given I've chosen to login
    When I enter the correct email and password
    Then I should get a text saying "Welcome <user>!" with <user> being the account owner's first name

 

On commence par créer le « Feature file(s) ». il s’agit d’un ou plusieurs fichiers ayant comme extension « .feature » utilisés pour communiquer à Cucumber les scénarios à exécuter .Ces fichiers doivent se retrouver sous le dossier « resources/demo ». 

Maintenant, on passe à la définition de chaque étape de nos “ feature files ”, c’est-à-dire traduire chaque phrase du fichier feature (script Gherkin) en code java au niveau de la classe StepDefinitions.java comme suit :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        LoginService loginService;
	String actualAnswer;
	Credentials credentials = new Credentials();

	@Given("I've chosen to Login")
	public void ive_chosen_to_login() {
		loginService = new LoginService();
	}

	@When("I use any password")
	public void i_use_any_password() {
		credentials.setPassword("Very Wrong password");
	}

	@When("I try to login using an email of an inexistent user")
	public void i_try_to_login_using_an_email_of_an_inexistent_user() {
		credentials.setEmail("inexsistent@host.com");
		actualAnswer = loginService.login(credentials.getEmail(), credentials.getPassword());
	}

	@Then("I should get a text saying \"Email doesn't exist\"")
	public void i_should_a_text_saying_email_doesnt_exist() {
		assertEquals("Email doesn't exist", actualAnswer);
	}

 

Le code indique le traitement à faire dans chaque étape du 1er scénario du Feature file. Essayons de tester notre projet maintenant:

On obtient le résultat suivant :

Le message indique que 2 tests sur 3 ont échoué . C’est un peu logique puisque nous n’avons pas encore implémenté les étapes pour les 2 scénarios restants :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        @When("I enter a valid email and an incorrect password")
	public void i_enter_a_valid_email_and_an_incorrect_password() {
		credentials.setEmail("oussema.chaari@expertsdutest.com");
		credentials.setPassword("an incorrect password");
		actualAnswer = loginService.login(credentials.getEmail(), credentials.getPassword());
	}

	@Then("I should get a text saying \"Incorrect password used\"")
	public void i_should_get_a_text_saying_incorrect_password_used() {
		assertEquals("Incorrect password used", actualAnswer);
	}

	@When("I enter the correct email and password")
	public void i_enter_the_correct_email_and_password() {
		credentials.setEmail("fares.mallouli@expertsdutest.com");
		credentials.setPassword("qwerty");
		actualAnswer = loginService.login(credentials.getEmail(), credentials.getPassword());
	}

	@Then("I should get a text saying \"Welcome <user>!\" with <user> being the account owner's first name")
	public void i_should_get_a_text_saying_welcome_user() {
		assertEquals("Welcome Fares !", actualAnswer);
	}

 

Remarque : Pour la même clause « @Given », la même implémentation sera utilisée par tous les scénarios.

Si on reteste, on obtient la trace suivant :

Ça indique que tous nos tests ont réussi 🥳

Pour info, il est tout aussi possible d’utiliser Cucumber avec un web driver ,comme celui de Selenium, pour tester le UI de nos applications web sur différents navigateurs.

Conclusion 

Certainement, Cucumber représente la technologie la plus importante implémentant le BDD mais comme tout dans le monde du logiciel, il n’y a pas de solution qui résout tous les problèmes. Si Cucumber ne fournit pas les fonctionnalités que vous recherchez, il sera fortement recommandé d’analyser cette liste de frameworks avant de faire votre choix final :