空手によるREST APIテスト
1. 概要
この記事では、Java用のビヘイビア駆動開発(BDD)テストフレームワークであるKarateを紹介します。
2. 空手とBDD
Karate isbuilt on top of Cucumber、別のBDDテストフレームワークであり、同じ概念のいくつかを共有しています。 これらの1つはthe use of a Gherkin file, which describes the tested featureです。 ただし、Cucumberとは異なり、テストはJavaで記述されておらず、Gherkinファイルに完全に記述されています。
Gherkinファイルは「.feature”」拡張子で保存されます。 Featureキーワードで始まり、同じ行に機能名が続きます。 また、それぞれがキーワードScenarioで始まり、キーワードGiven、When、Then、And、およびの複数のステップで構成されるさまざまなテストシナリオも含まれています。 But。
キュウリとガーキン構造の詳細については、hereを参照してください。
3. Mavenの依存関係
MavenプロジェクトでKarateを利用するには、karate-apache依存関係をpom.xmlに追加する必要があります。
com.intuit.karate
karate-apache
0.6.0
JUnitテストを容易にするために、karate-junit4の依存関係も必要です。
com.intuit.karate
karate-junit4
0.6.0
4. テストの作成
まず、GherkinFeatureファイルにいくつかの一般的なシナリオのテストを記述します。
4.1. ステータスコードのテスト
GETエンドポイントをテストし、200(OK)HTTPステータスコードを返すかどうかを確認するシナリオを作成しましょう。
Scenario: Testing valid GET endpoint
Given url 'http://localhost:8080/user/get'
When method GET
Then status 200
これは、考えられるすべてのHTTPステータスコードで明らかに機能します。
4.2. 応答のテスト
RESTエンドポイントが特定の応答を返すことをテストする別のシナリオを書いてみましょう。
Scenario: Testing the exact response of a GET endpoint
Given url 'http://localhost:8080/user/get'
When method GET
Then status 200
And match $ == {id:"1234",name:"John Smith"}
The match operation is used for the validationここで、 ‘$'は応答を表します。 したがって、上記のシナリオでは、応答が ‘\{id:”1234″,name:”John Smith”}'.と完全に一致することを確認します。
idフィールドの値を具体的に確認することもできます。
And match $.id == "1234"
The match operation can also be used to check if the response contains certain fields.これは、特定のフィールドのみをチェックする必要がある場合、またはすべての応答フィールドがわかっているわけではない場合に役立ちます。
Scenario: Testing that GET response contains specific field
Given url 'http://localhost:8080/user/get'
When method GET
Then status 200
And match $ contains {id:"1234"}
4.3. マーカーを使用した応答値の検証
返される正確な値がわからない場合でも、markers(応答の一致するフィールドのプレースホルダー)を使用して値を検証できます。
たとえば、マーカーを使用して、null値を期待するかどうかを示すことができます。
-
#null
-
#notnull
または、マーカーを使用して、フィールド内の特定のタイプの値に一致させることができます。
-
#boolean
-
#number
-
#string
他のマーカーは、フィールドにJSONオブジェクトまたは配列が含まれると予想される場合に使用できます。
-
#array
-
#object
また、特定の形式または正規表現と一致するためのマーカーと、ブール式を評価するマーカーがあります。
-
#uuid —値はUUID形式に準拠しています
-
#regex STR —の値は正規表現STRと一致します
-
#? EXPR —は、JavaScript式EXPRがtrueに評価されることを表明します
最後に、フィールドにいかなる種類のチェックも必要ない場合は、#ignoreマーカーを使用できます。
上記のシナリオを書き直して、idフィールドがnullではないことを確認しましょう。
Scenario: Test GET request exact response
Given url 'http://localhost:8080/user/get'
When method GET
Then status 200
And match $ == {id:"#notnull",name:"John Smith"}
4.4. リクエスト本文を使用したPOSTエンドポイントのテスト
POSTエンドポイントをテストし、リクエスト本文を受け取る最終シナリオを見てみましょう。
Scenario: Testing a POST endpoint with request body
Given url 'http://localhost:8080/user/create'
And request { id: '1234' , name: 'John Smith'}
When method POST
Then status 200
And match $ contains {id:"#notnull"}
5. テストの実行
テストシナリオが完成したので、空手とJUnitを統合してテストを実行できます。
@CucumberOptionsアノテーションを使用して、Featureファイルの正確な場所を指定します。
@RunWith(Karate.class)
@CucumberOptions(features = "classpath:karate")
public class KarateUnitTest {
//...
}
REST APIを示すために、WireMock server.を使用します
この例では、@BeforeClassアノテーションが付けられたメソッドでテストされているすべてのエンドポイントをモックします。 @AfterClassアノテーションが付けられたメソッドでWireMockサーバーをシャットダウンします。
private static WireMockServer wireMockServer
= new WireMockServer();
@BeforeClass
public static void setUp() throws Exception {
wireMockServer.start();
configureFor("localhost", 8080);
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();
}
KarateUnitTestクラスを実行すると、RESTエンドポイントがWireMockサーバーによって作成され、指定された機能ファイル内のすべてのシナリオが実行されます。
6. 結論
このチュートリアルでは、空手テストフレームワークを使用してREST APIをテストする方法を検討しました。
この記事の完全なソースコードとすべてのコードスニペットはover on GitHubにあります。