Pengenalan Serenity BDD

1. Pengenalan

Dalam tutorial ini, kami akan memberi pengenalan kepada Serenity BDD - alat yang hebat untuk menerapkan Behavior Driven Development (BDD). Ini adalah penyelesaian untuk ujian penerimaan automatik yang menghasilkan laporan ujian yang digambarkan dengan baik.

2. Konsep Teras

Konsep di sebalik Serenity mengikuti konsep di sebalik BDD. Sekiranya anda ingin membaca lebih lanjut mengenainya, periksa artikel kami mengenai Timun dan JBehave.

2.1. Keperluan

Dalam Serenity, syarat disusun dalam tiga tahap:

  1. kemampuan
  2. ciri-ciri
  3. cerita

Lazimnya, projek menerapkan keupayaan peringkat tinggi, pengurusan pesanan ex dan kemampuan pengurusan keahlian dalam projek e-dagang. Setiap kemampuan terdiri dari banyak fitur, dan fitur dijelaskan secara terperinci oleh cerita pengguna.

2.2. Langkah dan Ujian

Langkah mengandungi sekumpulan operasi manipulasi sumber. Ini boleh menjadi tindakan, pengesahan atau operasi yang berkaitan dengan konteks. Format Given_When_Then klasik dapat dilihat dalam langkah-langkahnya.

Dan ujian berjalan seiring dengan Langkah. Setiap ujian menceritakan kisah pengguna sederhana, yang dilakukan menggunakan Langkah tertentu .

2.3. Laporan

Ketenangan tidak hanya melaporkan hasil ujian tetapi juga menggunakannya untuk menghasilkan dokumentasi hidup yang menerangkan keperluan dan tingkah laku aplikasi.

3. Menguji Dengan KetenanganBDD

Untuk menjalankan ujian Serenity kami dengan JUnit, kita perlu @RunWith yang SerenityRunner , ujian pelari. SerenityRunner instrumen perpustakaan langkah dan memastikan bahawa keputusan ujian akan direkodkan dan dilaporkan oleh wartawan Serenity.

3.1. Ketergantungan Maven

Untuk memanfaatkan Serenity dengan JUnit, kita harus memasukkan serenity-core dan serenity-junit di pom.xml:

 net.serenity-bdd serenity-core 1.2.5-rc.11   net.serenity-bdd serenity-junit 1.2.5-rc.11 

Kami juga memerlukan serenity-maven-plugin untuk mengumpulkan laporan dari hasil ujian:

 net.serenity-bdd.maven.plugins serenity-maven-plugin 1.2.5-rc.6   serenity-reports post-integration-test  aggregate    

Sekiranya kami mahu Serenity menghasilkan laporan walaupun terdapat ujian yang gagal, tambahkan yang berikut ke pom.xml:

 org.apache.maven.plugins maven-surefire-plugin 2.20  true  

3.2. Contoh Mata Keahlian

Pada mulanya, ujian kami berdasarkan ciri mata keahlian khas dalam aplikasi e-commerce. Pelanggan boleh menyertai program ahli. Apabila pelanggan membeli barang di platform, mata keahlian akan meningkat, dan tahap keahlian pelanggan akan meningkat dengan sewajarnya.

Sekarang mari tulis beberapa ujian terhadap senario yang dinyatakan di atas dan lihat bagaimana Serenity berfungsi.

Pertama, mari kita tulis ujian untuk memulakan keahlian dan melihat langkah-langkah mana yang kita perlukan:

@RunWith(SerenityRunner.class) public class MemberStatusIntegrationTest { @Steps private MemberStatusSteps memberSteps; @Test public void membersShouldStartWithBronzeStatus() { memberSteps.aClientJoinsTheMemberProgram(); memberSteps.theMemberShouldHaveAStatusOf(Bronze); } }

Kemudian kami melaksanakan dua langkah seperti berikut:

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)); } }

Sekarang kita sudah bersedia untuk menjalankan ujian integrasi dengan verifikasi mvn clean . Laporan akan berada di target / site / serenity / index.html :

Dari laporan itu, kita dapat melihat bahawa kita hanya mempunyai satu ujian penerimaan 'Anggota harus bermula dengan status gangsa, mempunyai kemampuan untuk' dan lulus. Dengan mengklik ujian, langkah-langkahnya digambarkan:

Seperti yang kita lihat, laporan Serenity memberi kita pemahaman yang mendalam tentang apa yang dilakukan oleh aplikasi kita dan jika ia sesuai dengan kehendak kita. Sekiranya kita mempunyai beberapa langkah untuk dilaksanakan, kita boleh menandainya sebagai @Pending :

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

Laporan itu akan mengingatkan kita apa yang perlu dilakukan seterusnya. Sekiranya ada ujian yang gagal, dapat dilihat dalam laporan juga:

Setiap langkah yang gagal, diabaikan atau dilangkau akan disenaraikan masing-masing:

4. Integrasi Dengan JBehave

Ketenangan juga dapat disatukan dengan kerangka kerja BDD yang ada seperti JBehave.

4.1. Ketergantungan 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

Selain itu, akaun JIRA dan pautan harus dinyatakan dalam serenity.properties fail di akar projek:

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

Kemudian akan ada pautan JIRA yang dilampirkan dalam laporan:

Serenity juga menyokong integrasi dua hala dengan JIRA, kami boleh merujuk kepada dokumentasi rasmi untuk lebih jelasnya.

7. Ringkasan

Dalam artikel ini, kami memperkenalkan Serenity BDD dan pelbagai integrasi dengan kerangka ujian lain dan sistem pengurusan keperluan.

Walaupun kami telah merangkumi sebahagian besar perkara yang dapat dilakukan oleh Serenity, ia pasti dapat membuat lebih banyak perkara. Dalam artikel seterusnya, kami akan membahas bagaimana Serenity dengan sokongan WebDriver dapat memungkinkan kami mengautomasikan halaman aplikasi web menggunakan lakaran skrin.

Seperti biasa, kod pelaksanaan lengkap boleh didapati di projek GitHub.