Cangkuk Timun

1. Pengenalan

Cangkuk timun dapat berguna ketika kita ingin melakukan tindakan khusus untuk setiap senario atau langkah, tetapi tanpa melakukan tindakan ini secara eksplisit dalam kode Gherkin.

Dalam tutorial ini, kita akan melihat cangkuk @Before , @BeforeStep, @AfterStep, dan @After Cucumber.

2. Gambaran Keseluruhan Cangkuk dalam Timun

2.1. Bilakah Cangkuk Harus Digunakan?

Cangkuk boleh digunakan untuk melakukan tugas latar belakang yang bukan merupakan sebahagian daripada fungsi perniagaan. Tugas seperti itu boleh:

  • Memulakan penyemak imbas
  • Menetapkan atau membersihkan kuki
  • Menyambung ke pangkalan data
  • Memeriksa keadaan sistem
  • Pemantauan

Kes penggunaan untuk pemantauan adalah dengan mengemas kini papan pemuka dengan kemajuan ujian dalam masa nyata.

Cangkuk tidak kelihatan dalam kod Gherkin. Oleh itu, kita tidak boleh melihatnya sebagai pengganti Latar Belakang Timun atau langkah tertentu .

Kita akan melihat contoh di mana kita menggunakan cangkuk untuk mengambil tangkapan skrin semasa pelaksanaan ujian.

2.2. Skop Cangkuk

Cangkuk mempengaruhi setiap senario. Oleh itu, adalah amalan yang baik untuk menentukan semua cangkuk dalam kelas konfigurasi khusus.

Tidak perlu menentukan kait yang sama di setiap kelas kod gam. Sekiranya kita menentukan kail di kelas yang sama dengan kod gam kita, kita akan mempunyai kod yang kurang dapat dibaca.

3. Cangkuk

Mari kita lihat cangkuk individu. Kami kemudian akan melihat contoh lengkap di mana kita akan melihat bagaimana cangkuk berfungsi apabila digabungkan.

3.1. @Sebelum ini

Kaedah yang dianotasikan dengan @Bebulan akan dilaksanakan sebelum setiap senario . Dalam contoh kami, kami akan memulakan penyemak imbas sebelum setiap senario:

@Before public void initialization() { startBrowser(); }

Sekiranya kita memberi penjelasan mengenai beberapa kaedah dengan @Sebelumnya , kita dapat secara jelas menentukan urutan pelaksanaan langkah-langkah:

@Before(order=2) public void beforeScenario() { takeScreenshot(); }

Kaedah di atas melaksanakan kedua, kerana kita memberikan 2 sebagai nilai untuk parameter pesanan ke anotasi. Kami juga dapat lulus 1 sebagai nilai untuk parameter pesanan kaedah inisialisasi kami:

@Before(order=1) public void initialization()

Oleh itu, apabila kita melaksanakan senario, inisialisasi () dijalankan terlebih dahulu, dan sebelum Skenario () dilaksanakan kedua.

3.2. @SebelumLangkah

Kaedah dijelaskan dengan @BeforeStep jalankan sebelum setiap langkah . Mari gunakan anotasi untuk mengambil tangkapan skrin sebelum setiap langkah:

@BeforeStep public void beforeStep() { takeScreenshot(); }

3.3. @SelepasLangkah

Kaedah yang dijelaskan dengan @AfterStep laksanakan setiap langkah :

@AfterStep public void afterStep() { takeScreenshot(); }

Kami telah menggunakan @AfterStep di sini untuk mengambil tangkapan skrin selepas setiap langkah. Ini berlaku tidak kira sama ada langkah itu berjaya atau gagal .

3.4. @Selepas

Kaedah yang dianotasikan dengan @Setelah dilaksanakan setelah setiap senario :

@After public void afterScenario() { takeScreenshot(); closeBrowser(); }

Dalam contoh kami, kami akan mengambil tangkapan skrin terakhir dan menutup penyemak imbas. Ini berlaku tanpa mengira sama ada senario berjaya diselesaikan .

3.5. The Senario Parameter

Kaedah yang dijelaskan dengan anotasi cangkuk dapat menerima parameter jenis Skenario :

@After public void beforeScenario(Scenario scenario) { // some code }

Objek jenis Skenario mengandungi maklumat mengenai senario semasa. Termasuk adalah nama senario, jumlah langkah, nama langkah, dan status (lulus atau gagal). Ini boleh berguna sekiranya kita ingin melakukan tindakan yang berbeza untuk ujian lulus dan gagal.

4. Pelaksanaan Hook

4.1. Aliran Selamat

Sekarang mari kita lihat apa yang berlaku ketika kita menjalankan senario Timun dengan keempat-empat jenis cangkuk:

Feature: Book Store With Hooks Background: The Book Store Given The following books are available in the store | The Devil in the White City | Erik Larson | | The Lion, the Witch and the Wardrobe | C.S. Lewis | | In the Garden of Beasts | Erik Larson | Scenario: 1 - Find books by author When I ask for a book by the author Erik Larson Then The salesperson says that there are 2 books Scenario: 2 - Find books by author, but isn't there When I ask for a book by the author Marcel Proust Then The salesperson says that there are 0 books

Melihat hasil ujian yang dijalankan di IntelliJ IDE, kita dapat melihat perintah pelaksanaan:

First, our two @Before hooks execute. Then before and after every step, the @BeforeStep and @AfterStep hooks run, respectively. Finally, the @After hook runs. All hooks execute for both scenarios.

4.2. Unhappy Flow: a Step Fails

Let's see what happens if a step fails. As we can see in the screenshot below, both the @Before and @After hooks of the failing step are executed. The subsequent steps are skipped, and finally, the @After hook executes:

The behavior of @After is similar to the finally-clause after a try-catch in Java. We could use it to perform clean-up tasks if a step failed. In our example, we still take a screenshot even if the scenario fails.

4.3. Unhappy Flow: a Hook Fails

Let's look at what happens when a hook itself fails. In the example below, the first @BeforeStep fails.

In this case, the actual step doesn't run, but it's @AfterStep hook does. Subsequent steps won't run either, whereas the @After hook is executed at the end:

5. Conditional Execution with Tags

Hooks are defined globally and affect all scenarios and steps. However, with the help of Cucumber tags, we can define exactly which scenarios a hook should be executed for:

@Before(order=2, value="@Screenshots") public void beforeScenario() { takeScreenshot(); }

This hook will be executed only for scenarios that are tagged with @Screenshots:

@Screenshots Scenario: 1 - Find books by author When I ask for a book by the author Erik Larson Then The salesperson says that there are 2 books

6. Java 8

We can add Cucumber Java 8 Support to define all hooks with lambda expressions.

Recall our initialization hook from the example above:

@Before(order=2) public void initialization() { startBrowser(); }

Rewritten with a lambda expression, we get:

public BookStoreWithHooksRunSteps() { Before(2, () -> startBrowser()); }

The same also works for @BeforeStep, @After, and @AfterStep.

7. Conclusion

In this article, we looked at how to define Cucumber hooks.

We discussed in which cases we should use them and when we should not. Then, we saw in which order hooks execute and how we can achieve conditional execution.

Akhirnya, kami melihat bagaimana kami dapat menentukan kait dengan notasi lambda Java 8.

Seperti biasa, kod sumber lengkap artikel ini terdapat di GitHub.