Введение в Serenity BDD
1. Вступление
В этом руководстве мы познакомим вас сSerenity BDD - отличным инструментом для применения разработки на основе поведения (BDD). Это решение для автоматического приемочного тестирования, которое генерирует хорошо иллюстрированные отчеты о тестировании.
2. Основные понятия
Концепции, лежащие в основе Serenity, следуют концепциям, лежащим в основе BDD. Если вы хотите узнать об этом больше, ознакомьтесь с нашей статьей оCucumber иJBehave.
2.1. Требования
В Serenity требования организованы в три уровня:
-
возможности
-
функции
-
рассказы
Как правило, проект реализует высокоуровневые возможности, например. возможности управления заказами и членства в проекте электронной коммерции. Каждая возможность состоит из множества функций, а функции подробно объясняются пользовательскими историями.
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:
Из отчета видно, что у нас есть только один приемочный экзамен: «Участники должны начинать с бронзового статуса, иметь возможность» и проходит. При нажатии на тест, шаги иллюстрируются:
Как мы видим, отчет Serenity дает нам полное представление о том, что делает наше приложение и соответствует ли оно нашим требованиям. Если у нас есть какие-то шаги для реализации, мы можем отметить их как@Pending:
@Pending
@Step("When the member exchange {}")
public void aMemberExchangeA(Commodity commodity){
//TODO
}
Отчет напомнил бы нам, что нужно сделать дальше. И если какой-либо тест не пройден, это можно увидеть и в отчете:
Каждый неудачный, пропущенный или пропущенный шаг будет отображен соответственно:
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 мы можем увидеть наш тестовый отчет:
По сравнению с текстовым отчетом 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, будут представлены детали запроса и ответа:
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:
Serenity также поддерживает двустороннюю интеграцию с JIRA, мы можем обратиться кthe official documentation для более подробной информации.
7. Резюме
В этой статье мы представили Serenity BDD и несколько интеграций с другими тестовыми средами и системами управления требованиями.
Хотя мы рассмотрели большую часть того, что может сделать Serenity, оно, безусловно, может сделать больше. В нашей следующей статье мы расскажем, как Serenity с поддержкой WebDriver может позволить нам автоматизировать страницы веб-приложений с помощью сценария.
Как всегда, полный код реализации можно найти наthe GitHub project.