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:
-
capacidades
-
características
-
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:
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:
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:
Cada etapa com falha, ignorada ou ignorada será listada respectivamente:
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:
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:
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:
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.