Въведение в Serenity BDD

1. Въведение

В този урок ще дадем въведение в Serenity BDD - чудесен инструмент за прилагане на поведенческо развитие (BDD). Това е решение за автоматизирано приемане, което генерира добре илюстрирани отчети за изпитване.

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

Концепциите зад Serenity следват концепциите зад BDD. Ако искате да прочетете повече за това, вижте нашата статия за Краставицата и JBehave.

2.1. Изисквания

В Serenity изискванията са организирани в три нива:

  1. възможности
  2. Характеристика
  3. истории

Обикновено проектът прилага възможности на високо ниво, възможности за управление на поръчки и управление на членството в проект за електронна търговия. Всяка способност се състои от много функции и функциите са обяснени подробно от потребителски истории.

2.2. Стъпки и тестове

Стъпките съдържат група операции за манипулиране на ресурси. Това може да бъде действие, проверка или свързана с контекста операция. Класическият формат Give_When_Then може да бъде отразен в стъпките.

И тестовете вървят ръка за ръка със стъпките. Всеки тест разказва проста потребителска история, която се извършва с помощта на определена стъпка .

2.3. Доклади

Serenity не само докладва резултатите от теста, но и ги използва за изготвяне на жива документация, описваща изискванията и поведението на приложенията.

3. Тестване със SerenityBDD

За да изпълните нашите тестове Serenity с JUnit, ние трябва да @RunWith на SerenityRunner , тест бегач. 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 MemberStatusIntegrationTest { @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

To integrate with JBehave, one more dependency serenity-jbehave is needed in the POM:

 net.serenity-bdd serenity-jbehave 1.24.0 

4.2. JBehave Github REST API Test Continued

As we have introduced how to do REST API testing with JBehave, we can continue with our JBehave REST API test and see how it fits in Serenity.

Our story was:

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

The Given_When_Then steps can be migrated to as @Steps without any changes:

public class GithubRestUserAPISteps { private String api; private GitHubUser resource; @Step("Given the github REST API for user profile") public void withUserProfileAPIEndpoint() { api = "//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())); } }

To make JBehave's story-to-code mapping work as expected, we need to implement JBehave's step definition using @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); } }

With SerenityStories, we can run JBehave tests both from within our IDE and in the build process:

import net.serenitybdd.jbehave.SerenityStory; public class GithubUserProfilePayload extends SerenityStory {}

After the verify build finished, we can see our test report:

Compared to plain text report of JBehave, the rich report by Serenity gives us a more eye-pleasing and live overview of our story and the test result.

5. Integration With REST-assured

It is noteworthy that Serenity supports integration with REST-assured. To have a review of REST-assured, take a look at the guide to REST-assured.

5.1. Maven Dependencies

To make use of REST-assured with Serenity, the serenity-rest-assured dependency should be included:

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

5.2. Use REST-assured in Github REST API Test

Now we can replace our web client with REST-assured utilities:

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 = "//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)); } }

After replacing the implementation of userAPISteps in the StepDefition, we can re-run the verify build:

public class GithubUserProfilePayloadStepDefinitions { @Steps GithubRestAssuredUserAPISteps userAPISteps; //... }

In the report, we can see the actual API invoked during the test, and by clicking on the REST Query button, the details of request and response will be presented:

6. Integration With JIRA

As of now, we already have a great test report describing details and status of our requirements with Serenity framework. But for an agile team, issue tracking systems such as JIRA are often used to keep track of requirements. It would be better if we could use them seamlessly.

Luckily, Serenity already supports integration with JIRA.

6.1. Maven Dependencies

To integrate with JIRA, we need another dependency: serenity-jira-requirements-provider.

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

6.2. One-way Integration

To add JIRA links in the story, we can add the JIRA issue using story's meta tag:

Meta: @issue #BDDTEST-1

Освен това акаунтът и връзките в JIRA трябва да бъдат посочени във файла serenity.properties в основата на проекта:

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

Тогава в доклада ще бъде добавена връзка JIRA:

Serenity също поддържа двупосочна интеграция с JIRA, за повече подробности можем да се обърнем към официалната документация.

7. Обобщение

В тази статия въведохме Serenity BDD и множество интеграции с други тестови рамки и системи за управление на изискванията.

Въпреки че сме обхванали повечето от това, което Serenity може да направи, със сигурност може да направи и повече. В следващата ни статия ще разгледаме как Serenity с поддръжката на WebDriver може да ни позволи да автоматизираме страниците на уеб приложения, използвайки сценарий.

Както винаги, пълният код за изпълнение може да бъде намерен в проекта GitHub.