Introduction à la sérénité BDD

Introduction à la sérénité BDD

1. introduction

Dans ce didacticiel, nous présenteronsSerenity BDD, un excellent outil pour appliquer le développement piloté par le comportement (BDD). Il s'agit d'une solution de test d'acceptation automatisée générant des rapports de test bien illustrés.

2. Concepts de base

Les concepts à la base de Serenity suivent les concepts à la base de BDD. Si vous voulez en savoir plus, consultez notre article surCucumber etJBehave.

2.1. Exigences

Dans Serenity, les exigences sont organisées en trois niveaux:

  1. capacités

  2. traits

  3. histoires

En règle générale, un projet implémente des fonctionnalités de haut niveau, par exemple, capacités de gestion des commandes et des membres dans un projet de commerce électronique. Chaque fonctionnalité comprend de nombreuses fonctionnalités, lesquelles sont expliquées en détail par les user stories.

2.2. Étapes et tests

Les étapes contiennent un groupe d'opérations de manipulation de ressources. Ce peut être une action, une vérification ou une opération liée au contexte. Le format classiqueGiven_When_Then peut être reflété dans les étapes.

Et les tests vont de pair avecSteps.Each test tells a simple user story, which is carried out using certain*Step*.

2.3. Rapports

Serenity rapporte non seulement les résultats du test, mais les utilise également pour produire une documentation évolutive décrivant les exigences et les comportements des applications.

3. Tester avec SerenityBDD

Pour exécuter nos tests de sérénité avec JUnit, nous devons@RunWith leSerenityRunner, testeur. SerenityRunner instrumente les bibliothèques d'étapes et s'assure que les résultats des tests seront enregistrés et rapportés par les rapporteurs Serenity.

3.1. Dépendances Maven

Pour utiliser Serenity avec JUnit, nous devrions inclureserenity-core etserenity-junit dans lespom.xml:


    net.serenity-bdd
    serenity-core
    1.2.5-rc.11


    net.serenity-bdd
    serenity-junit
    1.2.5-rc.11

Nous avons également besoin deserenity-maven-plugin pour avoir des rapports agrégés à partir des résultats des tests:


    net.serenity-bdd.maven.plugins
    serenity-maven-plugin
    1.2.5-rc.6
    
        
            serenity-reports
            post-integration-test
            
                aggregate
            
        
    

Si nous voulons que Serenity génère des rapports même en cas d'échec du test, ajoutez ce qui suit auxpom.xml:


    org.apache.maven.plugins
    maven-surefire-plugin
    2.20
    
        true
    

3.2. Un exemple de points d'adhésion

Initialement, nos tests sont basés sur la caractéristique typique des points d’appartenance dans une application de commerce électronique. Un client peut rejoindre le programme membre. Au fur et à mesure que le client achète des marchandises sur la plate-forme, les points d’adhésion augmenteront et la note d’adhésion du client augmentera en conséquence.

Écrivons maintenant plusieurs tests par rapport aux scénarios décrits ci-dessus et voyons comment Serenity fonctionne.

Tout d'abord, écrivons le test d'initialisation de l'appartenance et voyons les étapes nécessaires:

@RunWith(SerenityRunner.class)
public class MemberStatusLiveTest {

    @Steps
    private MemberStatusSteps memberSteps;

    @Test
    public void membersShouldStartWithBronzeStatus() {
        memberSteps.aClientJoinsTheMemberProgram();
        memberSteps.theMemberShouldHaveAStatusOf(Bronze);
    }
}

Ensuite, nous mettons en œuvre les deux étapes suivantes:

public class MemberStatusSteps {

    private Member member;

    @Step("Given a member has {0} points")
    public void aMemberHasPointsOf(int points) {
        member = Member.withInitialPoints(points);
    }

    @Step("Then the member grade should be {0}")
    public void theMemberShouldHaveAStatusOf(MemberGrade grade) {
        assertThat(member.getGrade(), equalTo(grade));
    }
}

Nous sommes maintenant prêts à exécuter un test d'intégration avecmvn clean verify. Les rapports seront situés àtarget/site/serenity/index.html:

image

 

Le rapport indique que nous n’avons qu’un test d’acceptation: «Les membres doivent commencer avec le statut Bronze, ont la capacité de» et réussissent. En cliquant sur le test, les étapes sont illustrées:

image

 

Comme nous pouvons le voir, le rapport de Serenity nous donne une compréhension approfondie de ce que fait notre application et si elle correspond à nos exigences. Si nous avons des étapes à implémenter, nous pouvons les marquer comme@Pending:

@Pending
@Step("When the member exchange {}")
public void aMemberExchangeA(Commodity commodity){
    //TODO
}

Le rapport nous rappellerait ce qui doit être fait ensuite. Et au cas où un test échouerait, on peut aussi le voir dans le rapport:

image

 

Chaque étape échouée, ignorée ou ignorée sera listée respectivement:

image

 

4. Intégration avec JBehave

Serenity peut également s'intégrer aux frameworks BDD existants tels que JBehave.

4.1. Dépendances Maven

Pour intégrer avec JBehave, une dépendance supplémentaireserenity-jbehave est nécessaire dans le POM:


    net.serenity-bdd
    serenity-jbehave
    1.24.0

4.2. Poursuite du test de l'API REST JBehave Github

Comme nous avons introduithow to do REST API testing with JBehave, nous pouvons continuer avec notre test JBehave REST API et voir comment il s'intègre dans Serenity.

Notre histoire était:

Scenario: Github user's profile should have a login payload same as username

Given github user profile api
When I look for eugenp via the api
Then github's response contains a 'login' payload same as eugenp

Les étapesGiven_When_Then peuvent être migrées vers en tant que@Steps sans aucune modification:

public class GithubRestUserAPISteps {

    private String api;
    private GitHubUser resource;

    @Step("Given the github REST API for user profile")
    public void withUserProfileAPIEndpoint() {
        api = "https://api.github.com/users/%s";
    }

    @Step("When looking for {0} via the api")
    public void getProfileOfUser(String username) throws IOException {
        HttpResponse httpResponse = getGithubUserProfile(api, username);
        resource = retrieveResourceFromResponse(httpResponse, GitHubUser.class);
    }

    @Step("Then there should be a login field with value {0} in payload of user {0}")
    public void profilePayloadShouldContainLoginValue(String username) {
        assertThat(username, Matchers.is(resource.getLogin()));
    }

}

Pour que le mappage histoire-code de JBehave fonctionne comme prévu, nous devons implémenter la définition d'étape de JBehave à l'aide de@Steps:

public class GithubUserProfilePayloadStepDefinitions {

    @Steps
    GithubRestUserAPISteps userAPISteps;

    @Given("github user profile api")
    public void givenGithubUserProfileApi() {
        userAPISteps.withUserProfileAPIEndpoint();
    }

    @When("looking for $user via the api")
    public void whenLookingForProfileOf(String user) throws IOException {
        userAPISteps.getProfileOfUser(user);
    }

    @Then("github's response contains a 'login' payload same as $user")
    public void thenGithubsResponseContainsAloginPayloadSameAs(String user) {
        userAPISteps.profilePayloadShouldContainLoginValue(user);
    }
}

AvecSerenityStories, nous pouvons exécuter des tests JBehave à la fois depuis notre IDE et dans le processus de construction:

import net.serenitybdd.jbehave.SerenityStory;

public class GithubUserProfilePayload extends SerenityStory {}

Une fois la construction deverify terminée, nous pouvons voir notre rapport de test:

image

Comparé au rapport en clair de JBehave, le riche rapport de Serenity nous donne un aperçu plus agréable et plus vivant de notre récit et du résultat du test.

5. Intégration avec REST-assuré

Il est à noter que Serenity prend en charge l'intégration avecREST-assured. Pour avoir un aperçu de REST-assuré, jetez un œil au lien: / rest-assuré-tutorial.

5.1. Dépendances Maven

Pour utiliser REST-assuré avec Serenity, la dépendanceserenity-rest-assured doit être incluse:


    net.serenity-bdd
    serenity-rest-assured
    1.2.5-rc.11

5.2. Utiliser la garantie REST dans le test de l'API REST Github

Nous pouvons maintenant remplacer notre client Web par des utilitaires assurés par REST:

import static net.serenitybdd.rest.SerenityRest.rest;
import static net.serenitybdd.rest.SerenityRest.then;

public class GithubRestAssuredUserAPISteps {

    private String api;

    @Step("Given the github REST API for user profile")
    public void withUserProfileAPIEndpoint() {
        api = "https://api.github.com/users/{username}";
    }

    @Step("When looking for {0} via the api")
    public void getProfileOfUser(String username) throws IOException {
        rest().get(api, username);
    }

    @Step("Then there should be a login field with value {0} in payload of user {0}")
    public void profilePayloadShouldContainLoginValue(String username) {
        then().body("login", Matchers.equalTo(username));
    }

}

Après avoir remplacé l'implémentation deuserAPISteps dans lesStepDefition, nous pouvons réexécuter la compilation deverify:

public class GithubUserProfilePayloadStepDefinitions {

    @Steps
    GithubRestAssuredUserAPISteps userAPISteps;

    //...

}

Dans le rapport, nous pouvons voir l'API réelle invoquée pendant le test, et en cliquant sur le boutonREST Query, les détails de la demande et de la réponse seront présentés:

image

6. Intégration avec JIRA

À ce jour, nous avons déjà un excellent rapport de test décrivant les détails et l'état de nos exigences avec le cadre Serenity. Mais pour une équipe agile, les systèmes de suivi des problèmes tels que JIRA sont souvent utilisés pour suivre les exigences. Ce serait mieux si nous pouvions les utiliser de manière transparente.

Heureusement, Serenity prend déjà en charge l'intégration à JIRA.

6.1. Dépendances Maven

Pour s'intégrer à JIRA, nous avons besoin d'une autre dépendance:serenity-jira-requirements-provider.


    net.serenity-bdd
    serenity-jira-requirements-provider
    1.1.3-rc.5

6.2. Intégration unidirectionnelle

Pour ajouter des liens JIRA dans l'histoire, nous pouvons ajouter le problème JIRA à l'aide de la balise Meta de l'histoire:

Meta:
@issue #BDDTEST-1

De plus, le compte JIRA et les liens doivent être spécifiés dans le fichier serenity.properties à la racine du projet:

jira.url=
jira.project=
jira.username=
jira.password=

Ensuite, un lien JIRA serait ajouté dans le rapport:

image

Serenity prend également en charge l'intégration bidirectionnelle avec JIRA, nous pouvons nous référer àthe official documentation pour plus de détails.

7. Sommaire

Dans cet article, nous avons présenté Serenity BDD et de multiples intégrations avec d'autres frameworks de test et systèmes de gestion des exigences.

Bien que nous ayons couvert l'essentiel de ce que peut faire Serenity, il peut certainement en faire plus. Dans notre prochain article, nous expliquerons comment Serenity avec la prise en charge de WebDriver peut nous permettre d'automatiser les pages d'applications Web à l'aide du scénario.

Comme toujours, le code d'implémentation complet peut être trouvé surthe GitHub project.