セレニティBDDの紹介
1. 序章
このチュートリアルでは、 Serenity BDD – Behavior Driven Development(BDD)を適用するための優れたツールを紹介します。 これは、よく説明されたテストレポートを生成する自動受け入れテストのソリューションです。
2. コアコンセプト
Serenityの背後にある概念は、BDDの背後にある概念に従います。 詳細については、キュウリおよびJBehaveに関する記事をご覧ください。
2.1. 要件
Serenityでは、要件は次の3つのレベルに編成されています。
- 機能
- 特徴
- ストーリー
通常、プロジェクトは高レベルの機能を実装します。 eコマースプロジェクトの注文管理およびメンバーシップ管理機能。 各機能は多くの機能で構成されており、機能はユーザーストーリーによって詳細に説明されています。
2.2. 手順とテスト
ステップには、リソース操作操作のグループが含まれています。 これは、アクション、検証、またはコンテキスト関連の操作である可能性があります。 従来のGiven_When_Then形式を手順に反映させることができます。
また、テストはステップと密接に関連しています。 各テストは、特定のステップを使用して実行される簡単なユーザーストーリーを示します。
2.3. レポート
Serenityは、テスト結果を報告するだけでなく、要件とアプリケーションの動作を説明する生きたドキュメントを作成するためにもそれらを使用します。
3. SerenityBDDを使用したテスト
JUnitでSerenityテストを実行するには、テストランナーである @RunWith the SerenityRunnerを実行する必要があります。 SerenityRunner は、ステップライブラリをインストルメント化し、テスト結果が記録され、Serenityレポーターによって報告されるようにします。
3.1. Mavenの依存関係
SerenityをJUnitで利用するには、 pom.xml:にserenity-coreとserenity-junitを含める必要があります。
<dependency>
<groupId>net.serenity-bdd</groupId>
<artifactId>serenity-core</artifactId>
<version>1.2.5-rc.11</version>
</dependency>
<dependency>
<groupId>net.serenity-bdd</groupId>
<artifactId>serenity-junit</artifactId>
<version>1.2.5-rc.11</version>
</dependency>
また、テスト結果からレポートを集約するには、serenity-maven-pluginが必要です。
<plugin>
<groupId>net.serenity-bdd.maven.plugins</groupId>
<artifactId>serenity-maven-plugin</artifactId>
<version>1.2.5-rc.6</version>
<executions>
<execution>
<id>serenity-reports</id>
<phase>post-integration-test</phase>
<goals>
<goal>aggregate</goal>
</goals>
</execution>
</executions>
</plugin>
テストが失敗した場合でもSerenityでレポートを生成する場合は、 pom.xmlに次を追加します:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
3.2. メンバーシップポイントの例
当初、私たちのテストは、eコマースアプリケーションの一般的なメンバーシップポイント機能に基づいています。 顧客はメンバープログラムに参加できます。 顧客がプラットフォームで商品を購入すると、メンバーシップポイントが増加し、それに応じて顧客のメンバーシップグレードが増加します。
次に、上記のシナリオに対していくつかのテストを作成し、Serenityがどのように機能するかを見てみましょう。
まず、メンバーシップの初期化のテストを作成し、どの手順が必要かを確認しましょう。
@RunWith(SerenityRunner.class)
public class MemberStatusIntegrationTest {
@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 cleanverifyを使用して統合テストを実行する準備が整いました。 レポートはtarget/ site / serenity /index.htmlにあります。
レポートから、受け入れテストは1つしかないことがわかります。「メンバーはブロンズステータスで開始する必要があり、能力があり、合格しています」。 テストをクリックすると、手順が示されます。
ご覧のとおり、Serenityのレポートでは、アプリケーションが何を実行しているか、およびそれが要件に適合しているかどうかを完全に理解できます。 実装する手順がいくつかある場合は、それらを@Pendingとしてマークできます。
@Pending
@Step("When the member exchange {}")
public void aMemberExchangeA(Commodity commodity){
//TODO
}
レポートは、次に何をする必要があるかを思い出させてくれます。 また、テストが失敗した場合は、レポートにも表示されます。
失敗した、無視された、またはスキップされた各ステップがそれぞれリストされます。
4. JBehaveとの統合
Serenityは、JBehaveなどの既存のBDDフレームワークと統合することもできます。
4.1. Mavenの依存関係
JBehaveと統合するには、POMにもう1つの依存関係serenity-jbehaveが必要です。
<dependency>
<groupId>net.serenity-bdd</groupId>
<artifactId>serenity-jbehave</artifactId>
<version>1.24.0</version>
</dependency>
4.2. JBehave GithubRESTAPIテストの続き
JBehaveを使用してRESTAPIテストを実行する方法を紹介したので、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 ビルドが完了すると、テストレポートが表示されます。
JBehaveのプレーンテキストレポートと比較して、Serenityによる豊富なレポートは、私たちのストーリーとテスト結果のより魅力的でライブな概要を提供します。
5. RESTとの統合-assured
SerenityがREST-assuredとの統合をサポートしていることは注目に値します。 REST-assuredのレビューを入手するには、REST-assuredのガイドをご覧ください。
5.1. Mavenの依存関係
SerenityでREST-assuredを利用するには、serenity-rest-assured依存関係を含める必要があります。
<dependency>
<groupId>net.serenity-bdd</groupId>
<artifactId>serenity-rest-assured</artifactId>
<version>1.2.5-rc.11</version>
</dependency>
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));
}
}
StepDefitionのuserAPIStepsの実装を置き換えた後、verifyビルドを再実行できます。
public class GithubUserProfilePayloadStepDefinitions {
@Steps
GithubRestAssuredUserAPISteps userAPISteps;
//...
}
レポートでは、テスト中に呼び出された実際のAPIを確認できます。 RESTクエリボタンをクリックすると、リクエストとレスポンスの詳細が表示されます。
6. JIRAとの統合
現在のところ、Serenityフレームワークの要件の詳細とステータスを説明する優れたテストレポートがすでにあります。 しかし、アジャイルチームの場合、要件を追跡するためにJIRAなどの問題追跡システムがよく使用されます。 シームレスに使えるといいですね。
幸い、SerenityはすでにJIRAとの統合をサポートしています。
6.1. Mavenの依存関係
JIRAと統合するには、別の依存関係が必要です:serenity-jira-requirements-provider。
<dependency>
<groupId>net.serenity-bdd</groupId>
<artifactId>serenity-jira-requirements-provider</artifactId>
<version>1.1.3-rc.5</version>
</dependency>
6.2. 一方向の統合
ストーリーにJIRAリンクを追加するには、ストーリーのメタタグを使用してJIRAの問題を追加します。
Meta:
@issue #BDDTEST-1
さらに、JIRAアカウントとリンクは、プロジェクトのルートにあるファイルserenity.propertiesで指定する必要があります。
jira.url=<jira-url>
jira.project=<jira-project>
jira.username=<jira-username>
jira.password=<jira-password>
次に、レポートにJIRAリンクが追加されます。
SerenityはJIRAとの双方向統合もサポートしています。詳細については、公式ドキュメントを参照してください。
7. 概要
この記事では、Serenity BDDと、他のテストフレームワークおよび要件管理システムとの複数の統合について紹介しました。
セレニティができることのほとんどをカバーしましたが、それは確かにもっと多くのことをすることができます。 次の記事では、Serenity with WebDriverのサポートにより、脚本を使用してWebアプリケーションページを自動化する方法について説明します。
いつものように、完全な実装コードはGitHubプロジェクトにあります。