Introdução ao BDD Serenity

Introdução ao BDD Serenity

1. Introdução

Neste tutorial, daremos uma introdução aoSerenity BDD - uma ótima ferramenta para aplicar o Behavior Driven Development (BDD). Esta é uma solução para testes de aceitação automatizados que gera relatórios de testes bem ilustrados.

2. Conceitos principais

Os conceitos por trás do Serenity seguem os conceitos por trás do BDD. Se você quiser ler mais sobre isso, verifique nosso artigo sobreCucumbereJBehave.

2.1. Exigências

No Serenity, os requisitos são organizados em três níveis:

  1. capacidades

  2. características

  3. histórias

Normalmente, um projeto implementa recursos de alto nível, e.x. recursos de gerenciamento de pedidos e gerenciamento de associação em um projeto de comércio eletrônico. Cada recurso é composto por muitos recursos, e os recursos são explicados em detalhes pelas histórias de usuários.

2.2. Etapas e testes

As etapas contêm um grupo de operações de manipulação de recursos. Pode ser uma ação, verificação ou operação relacionada ao contexto. O formato clássicoGiven_When_Then pode ser refletido nas etapas.

E os testes andam de mãos dadas comSteps.Each test tells a simple user story, which is carried out using certain*Step*.

2.3. Relatórios

O Serenity não apenas relata os resultados do teste, mas também os utiliza para produzir documentação viva descrevendo os requisitos e o comportamento do aplicativo.

3. Testando com SerenityBDD

Para executar nossos testes de serenidade com JUnit, precisamos@RunWithSerenityRunner, executor de teste. SerenityRunner instrumenta as bibliotecas de etapas e garante que os resultados do teste serão registrados e relatados pelos repórteres do Serenity.

3.1. Dependências do Maven

Para usar o Serenity com JUnit, devemos incluirserenity-coreeserenity-junit nopom.xml:


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


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

Também precisamos deserenity-maven-plugin para ter relatórios agregados de resultados de teste:


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

Se quisermos que o Serenity gere relatórios mesmo que haja uma falha no teste, adicione o seguinte aopom.xml:


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

3.2. Um exemplo de pontos de associação

Inicialmente, nossos testes são baseados no recurso típico de pontos de associação em um aplicativo de comércio eletrônico. Um cliente pode participar do programa de membros. À medida que o cliente compra produtos na plataforma, os pontos de adesão aumentam e o grau de adesão do cliente aumenta de acordo.

Agora, vamos escrever vários testes em relação aos cenários descritos acima e ver como o Serenity funciona.

Primeiro, vamos escrever o teste para inicialização de associação e ver quais etapas precisamos:

@RunWith(SerenityRunner.class)
public class MemberStatusLiveTest {

    @Steps
    private MemberStatusSteps memberSteps;

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

Em seguida, implementamos as duas etapas da seguinte maneira:

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

Agora estamos prontos para executar um teste de integração commvn clean verify. Os relatórios estarão localizados emtarget/site/serenity/index.html:

image

 

A partir do relatório, podemos ver que temos apenas um teste de aceitação. ‘Os membros devem começar com o status bronze, têm a capacidade de 'e estão passando. Ao clicar no teste, as etapas são ilustradas:

image

 

Como podemos ver, o relatório da Serenity nos dá uma compreensão completa do que nosso aplicativo está fazendo e se ele alinha nossos requisitos. Se tivermos alguns passos para implementar, podemos marcá-los como@Pending:

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

O relatório nos lembraria o que precisa ser feito a seguir. E caso algum teste falhe, também pode ser visto no relatório:

image

 

Cada etapa com falha, ignorada ou ignorada será listada respectivamente:

image

 

4. Integração com JBehave

O Serenity também pode se integrar às estruturas BDD existentes, como o JBehave.

4.1. Dependências do Maven

Para integrar com JBehave, mais uma dependênciaserenity-jbehave é necessária no POM:


    net.serenity-bdd
    serenity-jbehave
    1.24.0

4.2. Teste da API REST JBehave Github continuado

Como apresentamoshow to do REST API testing with JBehave, podemos continuar com nosso teste de API REST JBehave e ver como ele se encaixa no Serenity.

Nossa história foi:

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

As etapas deGiven_When_Then podem ser migradas para como@Steps sem nenhuma alteração:

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

}

Para fazer o mapeamento de história para código do JBehave funcionar conforme o esperado, precisamos implementar a definição de etapa do JBehave usando@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);
    }
}

ComSerenityStories, podemos executar testes JBehave de dentro de nosso IDE e no processo de construção:

import net.serenitybdd.jbehave.SerenityStory;

public class GithubUserProfilePayload extends SerenityStory {}

Após a conclusão da compilaçãoverify, podemos ver nosso relatório de teste:

image

Comparado ao relatório de texto sem formatação da JBehave, o rico relatório da Serenity nos fornece uma visão mais agradável e ao vivo da nossa história e do resultado do teste.

5. Integração com REST garantido

Vale ressaltar que o Serenity oferece suporte à integração comREST-assured. Para ter uma revisão do REST-assegurado, dê uma olhada no link: / rest-assegurado-tutorial.

5.1. Dependências do Maven

Para fazer uso do REST garantido com serenidade, a dependênciaserenity-rest-assured deve ser incluída:


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

5.2. Use REST garantido no teste Github REST API

Agora podemos substituir nosso cliente da Web por utilitários com garantia 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));
    }

}

Depois de substituir a implementação deuserAPISteps emStepDefition, podemos executar novamente a compilação deverify:

public class GithubUserProfilePayloadStepDefinitions {

    @Steps
    GithubRestAssuredUserAPISteps userAPISteps;

    //...

}

No relatório, podemos ver a API real invocada durante o teste e, clicando no botãoREST Query, os detalhes da solicitação e resposta serão apresentados:

image

6. Integração com JIRA

A partir de agora, já temos um ótimo relatório de teste descrevendo detalhes e status de nossos requisitos com a estrutura Serenity. Porém, para uma equipe ágil, sistemas de rastreamento de problemas como o JIRA costumam ser usados ​​para acompanhar os requisitos. Seria melhor se pudéssemos usá-los sem problemas.

Felizmente, o Serenity já suporta a integração com o JIRA.

6.1. Dependências do Maven

Para integrar com o JIRA, precisamos de outra dependência:serenity-jira-requirements-provider.


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

6.2. Integração unilateral

Para adicionar links JIRA na história, podemos adicionar o problema JIRA usando a metatag da história:

Meta:
@issue #BDDTEST-1

Além disso, a conta e os links do JIRA devem ser especificados no arquivo serenity.properties na raiz do projeto:

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

Em seguida, haveria um link JIRA anexado no relatório:

image

O Serenity também oferece suporte à integração bidirecional com JIRA, podemos consultarthe official documentation para obter mais detalhes.

7. Sumário

Neste artigo, introduzimos o Serenity BDD e várias integrações com outras estruturas de teste e sistemas de gerenciamento de requisitos.

Embora tenhamos abordado a maior parte do que a Serenity pode fazer, ela certamente pode fazer mais. Em nosso próximo artigo, abordaremos como o suporte do Serenity com WebDriver pode nos permitir automatizar páginas de aplicativos da web usando roteiro.

Como sempre, o código de implementação completo pode ser encontrado emthe GitHub project.