空手でのREST APIテスト

1概要

この記事では、Java用の動作駆動開発(BDD)テストフレームワークであるhttps://github.com/intuit/karate[Karate]を紹介します。

2空手とBDD

  • Karateは もう一つのBDDテストフレームワークであるCucumber の上に 構築され、そして同じ概念のいくつかを共有します。その1つが、テスト済みの機能を説明したGherkinファイルの使用です。ただし、Cucumberとは異なり、テストはJavaで書かれておらず、Gherkinファイルに完全に記述されています。

Gherkinファイルは“ .feature” 拡張子で保存されます。これは Feature キーワードで始まり、その後に同じ行に機能名が続きます。また、それぞれ Scenario というキーワードで始まり、 Given When Then And 、および But という複数のステップで構成されるさまざまなテストシナリオも含まれています。

キュウリとガーキンの構造についての詳細はリンクを見つけることができます:/cucumber-rest-api-testing[ここ]。

3 Mavenの依存関係

Mavenプロジェクトで空手を利用するには、https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.intuit.karate%22%20AND%20a%を追加する必要があります3A%22karate-apache%22 pom.xml への依存関係:

<dependency>
    <groupId>com.intuit.karate</groupId>
    <artifactId>karate-apache</artifactId>
    <version>0.6.0</version>
</dependency>

https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.intuit.karate%22%20AND%20a%3A%22karate-junit4%22 [__karateも必要です。 JUnitテストを容易にするための依存関係:

<dependency>
    <groupId>com.intuit.karate</groupId>
    <artifactId>karate-junit4</artifactId>
    <version>0.6.0</version>
</dependency>

4テストを作成する

Gherkinの Feature ファイルにいくつかの一般的なシナリオのテストを書くことから始めます。

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"}
  • match 操作は検証に使用されます** ここで、 ' $' は応答を表します。したがって、上記のシナリオでは、応答が「__ \ {id:” 1234 ''、name:” John Smith”}」と完全に一致することを確認します。

id フィールドの値を具体的に確認することもできます。

And match $.id == "1234"
  • match オペレーションはまた、レスポンスに特定のフィールドが含まれているかどうかをチェックするのにも使えます。

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 値が必要かどうかを示すためにマーカーを使用できます。

  • #ヌル

  • #notnull

あるいは、マーカーを使用してフィールド内の特定の種類の値に一致させることもできます。

  • #boolean

  • #番号

  • #文字列

フィールドにJSONオブジェクトまたは配列が含まれると予想される場合には、他のマーカーを使用できます。

  • #array

  • #オブジェクト

そして、特定のフォーマットや正規表現とブール式を評価するものとのマッチングのためのマーカーがあります。

  • __#uuid - 値はUUIDフォーマットに準拠

  • #regex STR — valueは正規表現 STR と一致します

  • #? EXPR - JavaScript式 EXPR__の評価結果を表明

最後に、フィールドをチェックしたくない場合は、 #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ランニングテスト

テストシナリオが完成したので、KarateとJUnitを統合してテストを実行できます。

Feature ファイルの正確な場所を指定するには、 @ CucumberOptions アノテーションを使用します。

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

REST APIをデモンストレーションするために、リンクを使用します:/Introduction-wiremock[WireMockサーバー]。

この例では、 @ 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. 結論

このチュートリアルでは、Karate Testing Frameworkを使ってREST APIをテストする方法を調べました。

この記事の完全なソースコードとすべてのコードスニペットはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/rest-testing[GitHubで参照]をご覧ください。

前の投稿:Redditアプリケーションの6回目の改良
次の投稿:Javaでテストするためのシステム時間のオーバーライド