Pengantar Serenity BDD

1. Perkenalan

Dalam tutorial ini, kami akan memberikan pengantar Serenity BDD - alat yang hebat untuk menerapkan Behavior Driven Development (BDD). Ini adalah solusi untuk pengujian penerimaan otomatis yang menghasilkan laporan pengujian yang diilustrasikan dengan baik.

2. Konsep Inti

Konsep di balik Serenity mengikuti konsep di balik BDD. Jika Anda ingin membaca lebih lanjut tentang itu, lihat artikel kami tentang Ketimun dan JBehave.

2.1. Persyaratan

Dalam Serenity, persyaratan diatur menjadi tiga tingkat:

  1. kemampuan
  2. fitur
  3. cerita

Biasanya, sebuah proyek menerapkan kemampuan tingkat tinggi, manajemen pesanan sebelumnya, dan kemampuan manajemen keanggotaan dalam proyek e-niaga. Setiap kemampuan terdiri dari banyak fitur, dan fitur dijelaskan secara rinci oleh cerita pengguna.

2.2. Langkah dan Tes

Langkah-langkah berisi sekelompok operasi manipulasi sumber daya. Ini bisa berupa tindakan, verifikasi atau operasi terkait konteks. Format Given_When_Then klasik dapat tercermin dalam langkah-langkah.

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

2.3. Laporan

Serenity tidak hanya melaporkan hasil tes tetapi juga menggunakannya untuk menghasilkan dokumentasi hidup yang menjelaskan persyaratan dan perilaku aplikasi.

3. Menguji Dengan SerenityBDD

Untuk menjalankan pengujian Serenity dengan JUnit, kita perlu @RunWith the SerenityRunner , test runner. SerenityRunner melengkapi pustaka langkah dan memastikan bahwa hasil pengujian akan dicatat dan dilaporkan oleh reporter Serenity.

3.1. Dependensi Maven

Untuk menggunakan Serenity dengan JUnit, kita harus menyertakan 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 membutuhkan serenity-maven-plugin agar laporan dikumpulkan dari hasil tes:

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

Jika kita ingin Serenity menghasilkan laporan meskipun ada kegagalan pengujian, tambahkan berikut ini ke pom.xml:

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

3.2. Contoh Poin Keanggotaan

Awalnya, pengujian kami didasarkan pada fitur poin keanggotaan yang khas dalam aplikasi e-niaga. Seorang pelanggan dapat bergabung dengan program anggota. Saat pelanggan membeli barang di platform, poin keanggotaan akan meningkat, dan tingkat keanggotaan pelanggan akan meningkat.

Sekarang mari kita tulis beberapa pengujian terhadap skenario yang dijelaskan di atas dan lihat cara kerja Serenity.

Pertama, mari kita tulis tes untuk inisialisasi keanggotaan dan lihat 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 menerapkan dua langkah sebagai 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 siap untuk menjalankan tes integrasi dengan mvn clean verifikasi . Laporan akan ditempatkan di target / site / serenity / index.html :

Dari laporan tersebut, kita dapat melihat bahwa kita hanya memiliki satu tes penerimaan 'Anggota harus mulai dengan status perunggu, memiliki kemampuan untuk' dan lulus. Dengan mengklik tes, langkah-langkahnya diilustrasikan:

Seperti yang bisa kita lihat, laporan Serenity memberi kita pemahaman menyeluruh tentang apa yang dilakukan aplikasi kita dan apakah itu sejalan dengan persyaratan kita. Jika kami memiliki beberapa langkah untuk diterapkan, kami dapat menandainya sebagai @Pending :

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

Laporan tersebut akan mengingatkan kita tentang apa yang perlu dilakukan selanjutnya. Dan jika ada tes yang gagal, itu juga dapat dilihat di laporan:

Setiap langkah yang gagal, diabaikan atau dilewati akan dicantumkan masing-masing:

4. Integrasi Dengan JBehave

Serenity juga dapat berintegrasi dengan kerangka kerja BDD yang ada seperti JBehave.

4.1. Dependensi 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, akun dan tautan JIRA harus ditentukan di file serenity.properties di root proyek:

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

Kemudian akan ada tautan JIRA yang ditambahkan dalam laporan:

Serenity juga mendukung integrasi dua arah dengan JIRA, kami dapat merujuk ke dokumentasi resmi untuk lebih jelasnya.

7. Ringkasan

Dalam artikel ini, kami memperkenalkan Serenity BDD dan beberapa integrasi dengan kerangka kerja pengujian dan sistem manajemen persyaratan lainnya.

Meskipun kami telah membahas sebagian besar dari apa yang dapat dilakukan Serenity, itu pasti dapat melakukan lebih banyak. Di artikel kami berikutnya, kami akan membahas bagaimana Serenity dengan dukungan WebDriver dapat memungkinkan kami mengotomatiskan halaman aplikasi web menggunakan skenario.

Seperti biasa, kode implementasi lengkap dapat ditemukan di proyek GitHub.