Ujian API REST dengan Karate

1. Gambaran keseluruhan

Dalam artikel ini, kami akan memperkenalkan Karate, kerangka pengujian Behaviour Development (BDD) untuk Java.

2. Karate dan BDD

Karate dibina di atas Cucumber , kerangka ujian BDD yang lain, dan berkongsi beberapa konsep yang sama. Salah satunya adalah penggunaan fail Gherkin, yang menggambarkan ciri yang diuji . Namun, tidak seperti Timun, ujian tidak ditulis dalam Java dan dijelaskan sepenuhnya dalam fail Gherkin.

Fail Gherkin disimpan dengan pelanjutan ".feature" . Ia bermula dengan kata kunci Ciri , diikuti dengan nama ciri pada baris yang sama. Ini juga mengandungi senario ujian yang berbeza, masing-masing dimulai dengan kata kunci Skenario dan terdiri dari beberapa langkah dengan kata kunci Diberi , Kapan , Kemudian , Dan , Tetapi .

Lebih banyak mengenai timun dan struktur Gherkin boleh didapati di sini.

3. Pergantungan Maven

Untuk memanfaatkan Karate dalam projek Maven, kita perlu menambahkan kebergantungan karate-apache ke pom.xml :

 com.intuit.karate karate-apache 0.6.0 

Kami juga memerlukan kebergantungan karate-junit4 untuk memudahkan ujian JUnit:

 com.intuit.karate karate-junit4 0.6.0 

4. Membuat Ujian

Kita akan mulakan dengan menulis ujian untuk beberapa senario biasa dalam fail Gherkin Feature .

4.1. Menguji Kod Status

Mari tulis senario yang menguji titik akhir GET dan periksa sama ada mengembalikan kod status HTTP 200 (OK):

Scenario: Testing valid GET endpoint Given url '//localhost:8097/user/get' When method GET Then status 200

Ini berfungsi dengan jelas dengan semua kod status HTTP yang mungkin.

4.2. Menguji Respons

Mari tulis senario lain yang menguji bahawa titik akhir REST mengembalikan tindak balas tertentu:

Scenario: Testing the exact response of a GET endpoint Given url '//localhost:8097/user/get' When method GET Then status 200 And match $ == {id:"1234",name:"John Smith"}

The Perlawanan operasi digunakan untuk pengesahan di mana ' $' mewakili sambutan. Oleh itu, senario di atas memeriksa bahawa tindak balas sepadan dengan ' {id: "1234 ″, name:" John Smith "}'.

Kami juga dapat memeriksa secara khusus nilai medan id :

And match $.id == "1234"

The Perlawanan operasi juga boleh digunakan untuk memeriksa jika sambutan yang mengandungi bidang-bidang tertentu. Ini berguna apabila hanya bidang tertentu yang perlu diperiksa atau ketika tidak diketahui semua bidang respons:

Scenario: Testing that GET response contains specific field Given url '//localhost:8097/user/get' When method GET Then status 200 And match $ contains {id:"1234"}

4.3. Mengesahkan Nilai Respons Dengan Penanda

Sekiranya kita tidak mengetahui nilai pasti yang dikembalikan, kita masih dapat mengesahkan nilai menggunakan penanda - penempatan tempat untuk bidang yang sesuai dalam respons.

Sebagai contoh, kita boleh menggunakan penanda untuk menunjukkan sama ada kita mengharapkan nilai nol atau tidak:

  • #null
  • #bukan

Atau kita boleh menggunakan penanda untuk memadankan jenis nilai tertentu dalam bidang:

  • #boolean
  • #nombor
  • #tali

Penanda lain tersedia apabila kita menjangkakan medan mengandungi objek atau array JSON:

  • #kacamata
  • #objek

Dan ada penanda untuk mencocokkan pada format tertentu atau ungkapan biasa dan satu yang menilai ungkapan boolean:

  • #uuid - nilai sesuai dengan format UUID
  • #regex STR - nilai sepadan dengan ungkapan biasa STR
  • #? EXPR - menegaskan bahawa ekspresi JavaScript EXPR menilai benar

Akhirnya, jika kita tidak mahu pemeriksaan di lapangan, kita boleh menggunakan penanda #ignore .

Mari tulis semula senario di atas untuk memastikan bahawa medan id tidak kosong :

Scenario: Test GET request exact response Given url '//localhost:8097/user/get' When method GET Then status 200 And match $ == {id:"#notnull",name:"John Smith"}

4.4. Menguji Titik Akhir POST Dengan Badan Permintaan

Mari lihat senario terakhir yang menguji titik akhir POST dan mengambil badan permintaan:

Scenario: Testing a POST endpoint with request body Given url '//localhost:8097/user/create' And request { id: '1234' , name: 'John Smith'} When method POST Then status 200 And match $ contains {id:"#notnull"}

5. Menjalankan Ujian

Now that the test scenarios are complete, we can run our tests by integrating Karate with JUnit.

We'll use the @CucumberOptions annotation to specify the exact location of the Feature files:

@RunWith(Karate.class) @CucumberOptions(features = "classpath:karate") public class KarateUnitTest { //... }

To demonstrate the REST API, we'll use a WireMock server.

For this example, we mock all the endpoints that are being tested in the method annotated with @BeforeClass. We'll shut down the WireMock server in the method annotated with @AfterClass:

private static WireMockServer wireMockServer = new WireMockServer(WireMockConfiguration.options().port(8097)); @BeforeClass public static void setUp() throws Exception { wireMockServer.start(); configureFor("localhost", 8097); stubFor( get(urlEqualTo("/user/get")) .willReturn(aResponse() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody("{ \"id\": \"1234\", name: \"John Smith\" }"))); stubFor( post(urlEqualTo("/user/create")) .withHeader("content-type", equalTo("application/json")) .withRequestBody(containing("id")) .willReturn(aResponse() .withStatus(200) .withHeader("Content-Type", "application/json") .withBody("{ \"id\": \"1234\", name: \"John Smith\" }"))); } @AfterClass public static void tearDown() throws Exception { wireMockServer.stop(); }

When we run the KarateUnitTest class, the REST Endpoints are created by the WireMock Server, and all the scenarios in the specified feature file are run.

6. Conclusion

In this tutorial, we looked at how to test REST APIs using the Karate Testing Framework.

Kod sumber lengkap dan semua coretan kod untuk artikel ini boleh didapati di GitHub.