1前書き
このチュートリアルでは、http://www.thucydides.info[Serenity BDD] - 行動駆動開発(BDD)を適用するための優れたツール - について紹介します。これは、よく受け入れられたテストレポートを生成する自動受け入れテストのためのソリューションです。
2コアコンセプト
2.1. 必要条件
Serenityでは、要件は3つのレベルに編成されています。
-
能力
-
特徴
-
物語
通常、プロジェクトは高レベルの機能を実装します。電子商取引プロジェクトの注文管理および会員管理機能。各機能は多くの機能で構成されており、機能はユーザーストーリーによって詳細に説明されています。
2.2. 手順とテスト
ステップには、一連のリソース操作操作が含まれています。アクション、検証、またはコンテキスト関連の操作です。古典的な Given When Then フォーマットはステップに反映させることができます。
そしてテストは Steps. と密接に関係しています。
2.3. レポート
Serenityはテスト結果を報告するだけでなく、要件とアプリケーションの動作を説明する生きたドキュメントを作成するためにそれらを使用します。
3 SerenityBDD によるテスト
JUnitを使用してSerenityテストを実行するには、 @ RunWith SerenityRunner 、テストランナーが必要です。 SerenityRunner はステップライブラリをインストルメント化し、テスト結果がSerenityレポーターによって記録および報告されることを保証します。
3.1. Mavenの依存関係
JUnitでSerenityを利用するには、https://search.maven.org/classic/#artifactdetails%7Cnet.serenity-bdd%7Cserenity-core%7C1.2.5-rc.11%7Cjar[ serenity-core ]を含める必要があります。 pom.xmlのhttps://search.maven.org/classic/#artifactdetails%7Cnet.serenity-bdd%7Cserenity-junit%7C1.2.5-rc.11%7Cjar[ 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 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 にあります。
レポートによると、「メンバーはブロンズステータスで開始し、能力を持っている」という合格テストは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つの依存関係https://search.maven.org/classic/#artifactdetails%7Cnet.serenity-bdd%7Cserenity-jbehave%7C1.24.0%7Cjar[ serenity-jbehave ]が必要です。
<dependency>
<groupId>net.serenity-bdd</groupId>
<artifactId>serenity-jbehave</artifactId>
<version>1.24.0</version>
</dependency>
4.2. JBehave Github REST APIテスト(続き)
JBehaveでREST APIをテストする方法 を紹介したので、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アシュアード との統合
Serenityがhttp://rest-assured.io[REST-assured]との統合をサポートしていることは注目に値します。 REST-assuredのレビューをするためには、リンクを見てください:/rest-assured-tutorial _. _
5.1. Mavenの依存関係
SerenityでREST保証を利用するには、https://search.maven.org/classic/#artifactdetails%7Cnet.serenity-bdd%7Cserenity-rest-assured%7C1.2.5-rc.11%7Cjar[ serenity- rest-assured ]依存関係を含める必要があります。
<dependency>
<groupId>net.serenity-bdd</groupId>
<artifactId>serenity-rest-assured</artifactId>
<version>1.2.5-rc.11</version>
</dependency>
5.2. Github REST API Test でREST保証を使用する
これで、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 Query ボタンをクリックすることによって、リクエストとレスポンスの詳細が表示されます。
6. JIRA との統合
現時点で、Serenityフレームワークを使用して要件の詳細とステータスを説明した素晴らしいテストレポートがあります。しかし、アジャイルチームにとっては、JIRAなどの課題追跡システムが要件を追跡するためによく使用されます。それらをシームレスに使用できればもっと良いでしょう。
幸いなことに、SerenityはすでにJIRAとの統合をサポートしています。
6.1. Mavenの依存関係
JIRAと統合するには、別の依存関係が必要です。
<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との双方向統合もサポートしています。詳細についてはhttp://www.thucydides.info/docs/serenity/# two way integration with__jiraを参照してください。
7. 概要
この記事では、Serenity BDDと他のテストフレームワークや要件管理システムとの複数の統合について紹介しました。
Serenityができることのほとんどをカバーしてきましたが、確かにもっと多くのことができます。次回の記事では、SerenityとWebDriverのサポートによって、スクリーンプレイを使用してWebアプリケーションページを自動化する方法について説明します。
いつものように、完全な実装コードはhttps://github.com/eugenp/tutorials/tree/master/libraries[GitHubプロジェクト]にあります。