Введение в Serenity BDD

Введение в Serenity BDD

1. Вступление

В этом руководстве мы познакомим вас сSerenity BDD - отличным инструментом для применения разработки на основе поведения (BDD). Это решение для автоматического приемочного тестирования, которое генерирует хорошо иллюстрированные отчеты о тестировании.

2. Основные понятия

Концепции, лежащие в основе Serenity, следуют концепциям, лежащим в основе BDD. Если вы хотите узнать об этом больше, ознакомьтесь с нашей статьей оCucumber иJBehave.

2.1. Требования

В Serenity требования организованы в три уровня:

  1. возможности

  2. функции

  3. рассказы

Как правило, проект реализует высокоуровневые возможности, например. возможности управления заказами и членства в проекте электронной коммерции. Каждая возможность состоит из множества функций, а функции подробно объясняются пользовательскими историями.

2.2. Шаги и тесты

Шаги содержат группу операций с ресурсами. Это может быть действие, проверка или операция, связанная с контекстом. Классический форматGiven_When_Then может быть отражен в шагах.

И тесты идут рука об руку сSteps.Each test tells a simple user story, which is carried out using certain*Step*.

2.3. Отчеты

Serenity не только сообщает результаты теста, но и использует их для создания живой документации, описывающей требования и поведение приложения.

3. Тестирование с SerenityBDD

Чтобы запустить наши тесты Serenity с JUnit, нам нужно@RunWith theSerenityRunner, средство запуска тестов. SerenityRunner настраивает библиотеки шагов и гарантирует, что результаты теста будут записаны и сообщены репортерами Serenity.

3.1. Maven Зависимости

Чтобы использовать Serenity с JUnit, мы должны включитьserenity-core иserenity-junit вpom.xml:


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


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

Также нам нуженserenity-maven-plugin для агрегирования отчетов по результатам тестирования:


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

Если мы хотим, чтобы Serenity генерировала отчеты даже в случае сбоя теста, добавьте следующее вpom.xml:


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

3.2. Пример членских баллов

Изначально наши тесты основывались на типичной функции членских баллов в приложении электронной коммерции. Клиент может присоединиться к программе участника. По мере того, как клиент покупает товары на платформе, количество очков членства будет увеличиваться, и соответственно повысится уровень членства клиента.

Теперь давайте напишем несколько тестов для описанных выше сценариев и посмотрим, как работает Serenity.

Во-первых, давайте напишем тест для инициализации членства и посмотрим, какие шаги нам нужны:

@RunWith(SerenityRunner.class)
public class MemberStatusLiveTest {

    @Steps
    private MemberStatusSteps memberSteps;

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

Затем мы реализуем два шага следующим образом:

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

Теперь мы готовы запустить интеграционный тест сmvn clean verify. Отчеты будут расположены вtarget/site/serenity/index.html:

image

 

Из отчета видно, что у нас есть только один приемочный экзамен: «Участники должны начинать с бронзового статуса, иметь возможность» и проходит. При нажатии на тест, шаги иллюстрируются:

image

 

Как мы видим, отчет Serenity дает нам полное представление о том, что делает наше приложение и соответствует ли оно нашим требованиям. Если у нас есть какие-то шаги для реализации, мы можем отметить их как@Pending:

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

Отчет напомнил бы нам, что нужно сделать дальше. И если какой-либо тест не пройден, это можно увидеть и в отчете:

image

 

Каждый неудачный, пропущенный или пропущенный шаг будет отображен соответственно:

image

 

4. Интеграция с JBehave

Serenity также может интегрироваться с существующими средами BDD, такими как JBehave.

4.1. Maven Зависимости

Для интеграции с JBehave в POM требуется еще одна зависимостьserenity-jbehave:


    net.serenity-bdd
    serenity-jbehave
    1.24.0

4.2. JBehave Github REST API Test Продолжение

Поскольку мы ввелиhow to do REST API testing with JBehave, мы можем продолжить наш тест JBehave REST API и посмотреть, как он подходит для Serenity.

Наша история была:

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

ШагиGiven_When_Then можно перенести в@Steps без каких-либо изменений:

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

}

Чтобы отображение истории в коде JBehave работало должным образом, нам нужно реализовать определение шага JBehave с использованием@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);
    }
}

С помощьюSerenityStories мы можем запускать тесты JBehave как внутри нашей IDE, так и в процессе сборки:

import net.serenitybdd.jbehave.SerenityStory;

public class GithubUserProfilePayload extends SerenityStory {}

После завершения сборкиverify мы можем увидеть наш тестовый отчет:

image

По сравнению с текстовым отчетом JBehave, богатый отчет Serenity дает нам более приятный и живой обзор нашей истории и результатов теста.

5. Интеграция с REST-гарантированной

Примечательно, что Serenity поддерживает интеграцию сREST-assured. Чтобы ознакомиться с REST-assured, взгляните на ссылку: / rest-assured-tutorial.

5.1. Maven Зависимости

Чтобы использовать REST-гарантированный с Serenity, необходимо включить зависимостьserenity-rest-assured:


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

5.2. Используйте REST-гарантированный тест Github REST API

Теперь мы можем заменить наш веб-клиент утилитами с гарантией 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));
    }

}

После замены реализацииuserAPISteps вStepDefition мы можем повторно запустить сборкуverify:

public class GithubUserProfilePayloadStepDefinitions {

    @Steps
    GithubRestAssuredUserAPISteps userAPISteps;

    //...

}

В отчете мы можем увидеть фактический API, вызванный во время теста, и, нажав на кнопкуREST Query, будут представлены детали запроса и ответа:

image

6. Интеграция с JIRA

На данный момент у нас уже есть отличный отчет об испытаниях, описывающий детали и состояние наших требований с помощью инфраструктуры Serenity. Но для гибкой команды системы отслеживания проблем, такие как JIRA, часто используются для отслеживания требований. Было бы лучше, если бы мы могли использовать их без проблем.

К счастью, Serenity уже поддерживает интеграцию с JIRA.

6.1. Maven Зависимости

Для интеграции с JIRA нам понадобится другая зависимость:serenity-jira-requirements-provider.


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

6.2. Односторонняя интеграция

Чтобы добавить ссылки JIRA в историю, мы можем добавить задачу JIRA, используя метатег истории:

Meta:
@issue #BDDTEST-1

Кроме того, учетная запись JIRA и ссылки должны быть указаны в файле serenity.properties в корне проекта:

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

Тогда в отчете будет добавлена ​​ссылка JIRA:

image

Serenity также поддерживает двустороннюю интеграцию с JIRA, мы можем обратиться кthe official documentation для более подробной информации.

7. Резюме

В этой статье мы представили Serenity BDD и несколько интеграций с другими тестовыми средами и системами управления требованиями.

Хотя мы рассмотрели большую часть того, что может сделать Serenity, оно, безусловно, может сделать больше. В нашей следующей статье мы расскажем, как Serenity с поддержкой WebDriver может позволить нам автоматизировать страницы веб-приложений с помощью сценария.

Как всегда, полный код реализации можно найти наthe GitHub project.