API 自動化テストのための REST Assured チュートリアル (例)

安心とは何ですか?

安心してください Java ライブラリを使用して REST API をテストし、Maven と適切に統合できます。非常に効率的なマッチング技術を備えているため、期待される結果のアサートも非常に簡単です。Rest Assured には、JSON 構造がいかに複雑であっても、リクエストとレスポンスのほぼすべての部分からデータを取得するメソッドがあります。

テスト コミュニティにとって、API 自動テストはまだ新しく、ニッチな分野です。JSON の複雑さにより、API テストは未開拓のままです。しかし、テスト プロセスでの重要性が下がるわけではありません。Rest Assured.io フレームワークは、コア Java の基礎を使用してテストを非常にシンプルにしており、学習する価値のあるものとなっています。

Rest-Assured が必要な理由は何ですか?

Google マップ ビューを開いて行きたい場所を探すと、すぐに近くのレストランが表示され、通勤の選択肢が表示されます。 いくつかの大手旅行会社から提供されており、非常に多くのオプションをすぐに見ることができます。 これらが Google 製品ではないことは誰もが知っていますが、では Google はどうやってそれを表示しているのでしょうか。 これらのプロバイダーの公開された API を使用します。 さて、この種の設定をテストするように求められた場合、UI が構築される前または開発中であっても、API のテストが非常に重要になり、さまざまなデータの組み合わせで API を繰り返しテストすることが、自動化に非常に適したケースとなります。

以前は、これを実現するために Groovy や Ruby などの動的言語を使用していましたが、それは困難でした。 したがって、API テストは機能テストでは検討されませんでした。

しかし、Rest Assured を使用すると、API のテストを自動化し、ユーザーフレンドリーなカスタマイズでシンプルな https リクエストを送信するのは、Java の基本的な知識があれば簡単です。API テストと統合テストを理解する必要がありますが、自動化後の Rest Assured はバックエンドに非常に優れた信頼性をもたらし、フロントエンド テストは UI とクライアント側の操作に集中できます。Rest Assured はオープンソースであり、多くの追加メソッドとライブラリが追加されているため、API 自動化に最適です。

Rest Assured.io をセットアップする方法 Eclipse

ステップ1)インストール Java。こちらを参照してください ガイド

ステップ 2) IDE をダウンロードして開始します。 日食

ステップ3) MavenをインストールしてEclipseをセットアップします。 こちら.

セットアップも安心

  1. IDE で Maven プロジェクトを作成します。 ここでは Intellij を使用していますが、使用しているどの IDE でも同様の構造が得られます。
  2. POM.xml を開きます
プロジェクトの構造
プロジェクトの構造

Rest Assured.ioの場合: Java バージョン < 9 ユーザー:

以下の依存関係を POM.xml に追加します。

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-path</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>xml-path</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>

Rest Assured.ioの場合: Java バージョン9以降のユーザー:

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured-all</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>

トラブルシューティング:

エラーが表示され、依存関係が正しくダウンロードされたかどうかわからない場合は、

  1. Maven ビルドを実行してすべての依存関係をインポートします。Maven のセットアップに関するヘルプは guru99 にあります。
  2. それでもエラーが表示される場合は、Maven クリーンを実行してから Maven インストールを実行すると、エラーなしでビルドされるはずです。
  3. Java クラスに以下の行を追加すると、コンパイル エラーが存在しないことが確認できます。
import io.restassured.RestAssured.*;
import io.restassured.matcher.RestAssuredMatchers.*;
import org.hamcrest.Matchers.*;

最初の単純な Rest Assured スクリプト

構文:

Rest Assured.io の構文は、非常に BDD らしく、理解しやすいため、最も美しい部分です。

Given(). 
        param("x", "y"). 
        header("z", "w").
when().
Method().
Then(). 
        statusCode(XXX).
        body("x, ”y", equalTo("z"));

説明:

Code 説明
与えられた() 「Given」キーワードを使用すると、背景を設定できます。ここでは、リクエスト ヘッダー、クエリとパスのパラメータ、本文、Cookie を渡します。 これらの項目がリクエストに必要ない場合、これはオプションです。
いつ() 「when」キーワードは、シナリオの前提を示します。 たとえば、何かを取得/投稿/配置した「とき」には、別のことを行います。
方法() これをCRUD操作(get/post/put/delete)のいずれかに置き換えます。
それから() ここにアサート条件とマッチャー条件が入ります

これでセットアップと構文の背景がわかったので、最初の簡単なテストを作成しましょう。 ここまでの構造が新しいように見えても問題ありません。各行をさらに解釈してコードを作成するにつれて、コツを掴むことができます。

何を取ってきますか?

ブラウザを開いて – を押します。 https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1。 以下のように表示されることを確認してください。

安心してくださいスクリプト

リクエストに対するレスポンスを取得しようとしたときにブラウザでエラーが発生した場合は、

  1. Https または Http を使用したかどうかを確認してください。 ブラウザには、安全でない Web サイトを開かないように設定されている可能性があります。
  2. ブラウザーが Web サイトを開くことをブロックするプロキシまたはファイアウォールがあるかどうかを確認してください。

*注意 – ここではヘッダー、本文、Cookie を使用していません。 これは URL であり、API からコンテンツを取得しており、既存のコンテンツを投稿または更新していないため、GET 呼び出しになります。 最初のテストをよりよく理解するために、これを覚えておいてください。

テストの目的:

スクリプトの目的は、Rest Assured を通じてブラウザで受信した出力と同じ出力を IDE コンソールに出力することです。

以下の手順でこれをコード化してみましょう。

レスポンス本文の取得

ステップ1) 「myFirstRestAssuredClass」という名前のクラスを作成します。

ステップ2) 「getResponseBody」というメソッドを作成します。

ステップ3) 以前に学習した特定の構造と同様に、次のコードを入力します。

与えられた()。 -> ヘッダーもクエリもパスパラメータも必要ありません。

いつ()。 →特に条件設定なし

得る('https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1')。 -> URL のみを指定する必要があります

それから()。 -> 特定のアサーションは必要ありません

ログ()。 all() -> すべての応答がフェッチされたら、応答、ヘッダー、基本的に要求が返すすべてのものをログに記録します。

public static void getResponseBody(){
   given().when().get("https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1").then().log()
  .all();
 
}

使用されているURLが長くて読みにくいことに注意してください。よく見ると、3つのクエリパラメータが使用されていることがわかります。

  1. 顧客ID
  2. パスワード
  3. アカウントなし

Rest Assured は、各部分 (クエリ、パス、ヘッダー パラメータ) を個別に渡すことができるため、コードが読みやすくなり、保守も容易になります。また、必要に応じて外部ファイルからのデータをパラメータ化することもできます。

クエリ パラメータを使用する場合は、構文の定義に戻り、それらがすべて指定されたパラメータの一部として渡されることを確認します。

public static void getResponseBody(){
 
   given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1")
           .when().get("https://demo.guru99.com/V4/sinkministatement.php").then().log()
           .body();
}

**「all」の代わりに「body」を使用していることに注意してください。 これは、応答の本文のみを抽出するのに役立ちます。

出力:

レスポンスステータスコードの取得

次にスクリプトを作成するメソッドは、ステータス コードを取得し、それを検証するためのアサーションを追加することです。

ステップ1) getResponseStatus() というメソッドを作成します。

ステップ2) 上で使用したものと同じリクエスト構造を使用します。 コピーして貼り付けます。

ステップ3) ログに記録する代わりに、Rest Assured の組み込みメソッド「getStatusCode」を使用してステータス コード値を取得します。

ステップ4) ステータス コードが 200 であることを主張するには、キーワード –assertThat().statusCode(expectedCode) を使用します。

**注 – URL はわかりやすくするために使用される変数です。 URL には API リクエスト URL 全体が保持されます

public static void getResponseStatus(){
   int statusCode= given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1") .when().get("https://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

   given().when().get(url).then().assertThat().statusCode(200);
}

出力:

ビジネスニーズ

自動化の基本ルールの 2 つは、必要な条件がすべて満たされた場合にのみテストが続行されるようにチェックポイントを設定する必要があるということです。 API テストにおける最も基本的な検証は、リクエストのステータス コードが XNUMXXX 形式であるかどうかを確認することです。

これまでの完全なコード:

import java.util.ArrayList;
import static io.restassured.RestAssured.*;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

public class myFirstRestAssuredClass {

   final static String url="https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1";

   public static void main(String args[]) {

     getResponseBody();
     getResponseStatus();

; }

   //This will fetch the response body as is and log it. given and when are optional here
   public static void getResponseBody(){
       given().when().get(url).then().log()
      .all();

  given().queryParam("CUSTOMER_ID","68195")
               .queryParam("PASSWORD","1234!")
               .queryParam("Account_No","1") .when().get("https://demo.guru99.com/V4/sinkministatement.php").then().log().body();
   }

public static void getResponseStatus(){
   int statusCode= given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1")
           .when().get("https://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

   given().when().get(url).then().assertThat().statusCode(200);
}

}

*注意:

  1. 200 は、このシナリオの正常な応答です。 場合によっては、リクエストも失敗する必要があり、その場合は 4XX または 5XX を使用することがあります。 無効なパラメータを指定してステータス コードを変更して確認してください。
  2. 条件をアサートすると、エラーがない限り、コンソールには表示されません。

応答のさまざまな部分を取得するスクリプト

応答本文と応答ステータス コードの取得については、上記のセグメントですでに説明されています。 応答のさまざまな部分を取得するには、キーワード「抽出」が非常に重要であることに注意してください。

ヘッダ

Rest Assured は非常に単純な言語であり、ヘッダーの取得も同様に簡単です。 メソッド名は headers() です。 前と同様に、同じことを行うスタンドアロン メソッドを作成します。

public static void getResponseHeaders(){
   System.out.println("The headers in the response "+
                   get(url).then().extract()
           .headers());
}

ここでは「given().when()」がスキップされ、コード行が get() から始まることに注意してください。これは、ここではリクエストをヒットしてレスポンスを取得するための前提条件や検証が行われていないためです。 このような場合、同じものを使用するかどうかは任意です。

出力:

ビジネスニーズ:

多くの場合、後続のリクエストでは認証トークンまたはセッション Cookie を使用する必要がありますが、ほとんどの場合、これらの詳細はレスポンスのヘッダーとして返されます。

反応時間

バックエンドまたは他のダウンストリーム システムから応答を取得するのに必要な時間を取得するために、Rest Assured は、応答を返すのにかかる時間を取得するための適切な timeUnit を備えた「timeIn」と呼ばれるメソッドを提供します。

public static void getResponseTime(){
  System.out.println("The time taken to fetch the response "+get(url)
         .timeIn(TimeUnit.MILLISECONDS) + " milliseconds");
}

出力:

ビジネスニーズ:

API をテストする際の非常に重要な機能は、アプリケーションのパフォーマンスを測定するための応答時間です。 通話にかかる時間は、インターネット速度、その時点の API のパフォーマンス、サーバーの負荷、および時間に影響を与えるその他の要因に応じて、多少前後する場合があることに注意してください。

コンテンツタイプ

返されたレスポンスの content-Type は「contentType()」メソッドを使用して取得できます。

public static void getResponseContentType(){
   System.out.println("The content type of response "+
           get(url).then().extract()
              .contentType());
}

出力

ビジネスニーズ:

場合によっては、クロスオリジンの脅威に対するセキュリティ ギャップがないことを確認したり、渡されたコンテンツが API の標準に従っていることを確認したりするために、コンテンツ タイプの取得が不可欠になることがあります。

個々の JSON 要素を取得する

与えられた応答から合計金額を計算するように求められ、すべての金額を取得して合計する必要があります。

ステップ:

ステップ1) 金額フィールドは、キー「ステートメント」を含む配列内にあり、キー「結果」を含むリスト内にあります。

ステップ2) 「パス」を使用して API の値に到達するメカニズムを提供しますので、ご安心ください。

ステップ3) 金額に到達するためのパスは「result.statements.AMOUNT」です。これは、Selenium の Xpath のようなものだと考えてください。

ステップ4) コレクション内のすべての金額をフェッチし、すべての値をループして合計を計算します。

public static void getSpecificPartOfResponseBody(){

ArrayList<String> amounts = when().get(url).then().extract().path("result.statements.AMOUNT") ;
int sumOfAll=0;
for(String a:amounts){

    System.out.println("The amount value fetched is "+a);
    sumOfAll=sumOfAll+Integer.valueOf(a);
}
System.out.println("The total amount is "+sumOfAll);

}

注: 金額値は文字列データ型であるため、整数に変換して合計に使用します。

出力:

まとめ

  • Rest Assured は、自動化を可能にする Java ライブラリのグループです。 残りの API テスト
  • 安心してください Javaベース、コアの知識 Java それを学ぶには十分です
  • 複雑な JSON 構造からリクエストとレスポンスの値をフェッチするのに役立ちます
  • この API リクエストは、さまざまなヘッダー、クエリ、パス パラメーター、および設定するセッションや Cookie を使用してカスタマイズできます。
  • これは、assert ステートメントと条件を設定するのに役立ちます。
  • Rest Assured は、応答が JSON タイプの場合には非常に役立ちますが、コンテンツ タイプが HTML またはプレーン テキストの場合、そのメソッドはシームレスに機能しない可能性があります。

続きを読む readmore