セレニティBDDの紹介

Serenity BDDの概要

1. 前書き

このチュートリアルでは、Serenity BDDの概要を説明します。これは、ビヘイビア駆動開発(BDD)を適用するための優れたツールです。 これは、図解されたテストレポートを生成する自動受け入れテストのソリューションです。

2. コアコンセプト

Serenityの背後にある概念は、BDDの背後にある概念に従います。 詳細については、CucumberおよびJBehaveに関する記事を確認してください。

2.1. 必要条件

Serenityでは、要件は3つのレベルに整理されます。

  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を使用したテスト

JUnitでSerenityテストを実行するには、テストランナーであるSerenityRunner@RunWithする必要があります。 SerenityRunnerはステップライブラリを計測し、テスト結果が記録され、Serenityレポーターによって報告されることを保証します。

3.1. Mavenの依存関係

JUnitでSerenityを利用するには、pom.xml:serenity-coreserenity-junitを含める必要があります


    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. メンバーシップポイントの例

最初は、テストはeコマースアプリケーションの典型的なメンバーシップポイント機能に基づいています。 顧客は会員プログラムに参加できます。 顧客がプラットフォームで商品を購入すると、メンバーシップポイントが増加し、それに応じて顧客のメンバーシップグレードが増加します。

次に、上記のシナリオに対していくつかのテストを作成し、Serenityがどのように機能するかを見てみましょう。

まず、メンバーシップの初期化のテストを作成し、どの手順が必要かを確認しましょう。

@RunWith(SerenityRunner.class)
public class MemberStatusLiveTest {

    @Steps
    private MemberStatusSteps memberSteps;

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

次に、次の2つの手順を実装します。

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

 

レポートから、「メンバーはブロンズステータスで開始する必要があり、能力があり、合格」という受け入れテストが1つしかないことがわかります。 テストをクリックすると、手順が示されます。

image

 

ご覧のとおり、Serenityのレポートは、アプリケーションが何を実行しているか、およびそれが要件に適合しているかどうかを完全に理解しています。 実装する手順がいくつかある場合は、それらを@Pendingとしてマークできます。

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

このレポートは、次に何をする必要があるかを思い出させてくれます。 また、テストが失敗した場合は、レポートでも確認できます。

image

 

失敗したステップ、無視されたステップ、またはスキップされた各ステップがそれぞれリストされます。

image

 

4. JBehaveとの統合

Serenityは、JBehaveなどの既存のBDDフレームワークと統合することもできます。

4.1. Mavenの依存関係

JBehaveと統合するには、POMにもう1つの依存関係serenity-jbehaveが必要です。


    net.serenity-bdd
    serenity-jbehave
    1.24.0

4.2. JBehave Github RESTAPIテストの続き

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のストーリーからコードへのマッピングを期待どおりに機能させるには、@Stepsを使用してJBehaveのステップ定義を実装する必要があります。

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を使用すると、IDE内とビルドプロセスの両方からJBehaveテストを実行できます。

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の依存関係

Serenityで保証されたRESTを利用するには、serenity-rest-assuredの依存関係を含める必要があります。


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

5.2. RESTを使用-GithubRESTAPIテストで保証

これで、Webクライアントを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));
    }

}

StepDefitionuserAPIStepsの実装を置き換えた後、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 with WebDriverのサポートにより、脚本を使用してWebアプリケーションページを自動化する方法について説明します。

いつものように、完全な実装コードはthe GitHub projectにあります。