rest api testing with spring resttemplate
この詳細なチュートリアルでは、SpringRestTemplateを使用したRESTAPIテストと簡単な例を使用したTestNGの開始方法について説明します。
この記事では、RestTemplateとTestNGフレームワークを使用したRESTAPIテストの開始方法を説明します。
RestTemplateとTestNGフレームワークを使用したRESTAPIテストを検討する前に、それに関連するいくつかの基本的な概念を理解しましょう。
はじめましょう!!
学習内容:
- RESTとは何ですか?
- JSONとは何ですか?
- REST APIテストとは何ですか?
- TestNGとは何ですか?
- Spring RESTテンプレートとは何ですか?
- RESTAPIテストの手順
- WindowsでのTestNGテストフレームワークのセットアップ
- 完全なTestCRUDファイルコード
- 結論
- 推奨読書
RESTとは何ですか?
今日、RESTはWebサービスを構築するための非常に人気のある選択肢になっています。 例えば 、Googleにはカレンダーのような複数のRESTサービスがあります。 マップAPI 、など。
残り つまり 代表的な状態転送 ソフトウェアアーキテクチャスタイルです。このスタイルでは、一連の制約が定義され、これらの制約を満たすために構築されたWebサービスが必要です。 RESTアーキテクチャスタイルに準拠するこのようなWebサービスは、RESTfulWebサービスとして知られています。
「Representationalstatetransfer」という用語は、最初に ロイフィールディング 彼の博士号で2000年の論文。RESTの基本的な考え方は、サーバー側のオブジェクトを作成または削除できるリソースとして扱うことです。
JSONとは何ですか?
JSON つまり JavaScriptオブジェクト表記 は、ブラウザとサーバー間でデータを保存および交換するためにRESTサービスで非常に一般的に使用される構文です。
JSONの主な利点は、軽量であり、次に、読み取り可能な形式でもあります。データはKey:Valueペア形式で保存されます。 例えば、 従業員データを次のようなJSON形式で保存できます:{“ name”:” Emp1”、” salary”:” 3000”、” age”:” 23”、” id”:” 52686”}。
REST APIテストとは何ですか?
REST APIテストとは、基本的に、リソースに対してCreate、Edit、Read、およびDeleteアクションを、それぞれPOST、GET、PUT、およびDELETEの4つの主要なメソッドで実行することによってAPIをテストすることです。
TestNGとは何ですか?
TestNGは、JUnitとNUnitに触発されたテストフレームワークです。 Javaプログラミング言語用です。 TestNGは、ユニット、機能、エンドツーエンド、統合など、幅広いテストカテゴリをカバーしています。
これは、Apacheライセンスに基づくオープンソースフレームワークです。これは、テストスクリプトの開発を加速する豊富な注釈のセットを提供します。
Spring RESTテンプレートとは何ですか?
Spring RestTemplateクラスは、Spring3で導入されたspring-webの一部です。
RestTemplateクラスは、GET、POST、PUT、DELETEなどのHTTPメソッドにオーバーロードされたメソッドを提供することにより、HTTPベースのRESTfulWebサービスをテストするための非常に便利な方法を提供します。Springフレームワークもオープンソースです。
RESTAPIテストの手順
明確に理解するために、いくつかの例を使用して、RESTAPIテストで通常実行される手順を理解しましょう。
この記事では、RESTAPI従業員サービスのサンプルを1つ検討しました。 このソース。
最初に、POSTMANツールを使用して手動で手順を実行しましょう。
#1) まず、アクセスするAPIのエンドポイントを把握します。
例えば、 http://dummy.restapiexample.com/api/v1/create to Create a new employee resource
#二) HTTPメソッドに必要な場合は、ヘッダーと本文を設定します。
この例では、POSTを使用して新しいリソースを作成しようとしています。 POSTの場合、リクエスト本文が必要です。
したがって、ボディを次のように設定します。
「名前」:「zozo100」、「給与」:「123」、「年齢」:「23」
受け入れる :アプリケーション/ JSONおよび コンテンツタイプ :アプリケーション/ JSON。
ソフトウェアテストのユースケースは何ですか
#3) 適切なHTTPメソッド(この場合はPOST)を設定します。
#4) Restサービスサーバーにリクエストを送信します。
#5) サーバーから応答を受信します。
POSTMANツールを使用したRESTAPI呼び出し
#6) 応答コードを使用して、期待どおりに応答を確認します 例えば。 成功として200OK。
# 7) 必要に応じて、応答本文をベンチマークファイルと比較して、期待どおりに確認します。
次に、テスト自動化スイートの同じ手順を自動化する必要があります。自動化に必要なセットアップから始めましょう。
WindowsでのTestNGテストフレームワークのセットアップ
#1)インストール
- テストスクリプトの開発にはJavaを使用します。だから、最初のダウンロード Windows用のJDKインストーラー マシンにJavaをインストールします。
- IDE(統合開発環境) :Automation TestSuite開発のIDEとしてEclipseを使用しました。クリック ここに ダウンロードします。
- TestNG用のEclipseプラグインを入手します。 EclipseプラグインのTestNGを実行するには、Java1.7以降が必要であることに注意してください。 Eclipse4.2以降が必要です。 (参照: TestNG )。 Eclipseで以下の手順に従います。
- (ヘルプ) / (新しいソフトウェアのインストール)を選択します。
- (追加)->をクリックします http://beust.com/eclipse/と入力します
- URLの横にあるチェックボックスを選択し、(次へ)ボタンをクリックします。
TestNGのインストール
-
- 次の画面が表示されるまで、(次へ)ボタンをクリックし続けます。
TestNGインストールの最終画面
最後に、Apacheライセンス契約に同意し、(完了)ボタンをクリックしてインストールを完了します。
Eclipseを再起動して、プラグインのインストールを有効にします。
- 春の瓶: 最後にもう1つ、SpringフレームワークのRestTemplateクラスを使用します。あなたはできる Springjarをダウンロードする ローカルフォルダに保存し、 例えば 、C:/ projectJar
- JSON-シンプルジャー: JSON解析を実行する必要があります。そのために、軽量のJson-simpleAPIを使用します。したがって、Json-simple-1.1.jarをC:/ projectJarにダウンロードします
これで、必要なインストールが完了しました。それでは、テスト自動化プロジェクトを作成しましょう。
#2)プロジェクトの設定
- ファイルの作成->新規-> Javaプロジェクト->「」という名前を付けます EmployeeTestSuite ’。
- 次に、新しいJavaパッケージを作成します com.demo :
- ビルドパスの構成:
- 前のセクションで見たように、TestNGをインストールし、SpringとJSONの単純なjarをダウンロードしました。したがって、これらを使用するには、プロジェクトにビルドパスを追加する必要があります。そのために、 lib のフォルダ EmployeeTestSuite フォルダを作成し、すべてのjarファイルをC:/ projectJarから lib フォルダ。
- ‘を右クリック EmployeeTestSuite ’’ ->ビルドパス->ビルドパスの構成。
- クリックしてください lib タブ。
- クリックしてください ライブラリを追加 ボタン-> TestNGを選択します。これにより、テストNGがビルドパスに追加されます。
- クリック jarファイルを追加します ボタン-> libからすべてのjarファイルを選択します。これにより、すべてのSpringjarとJSON-simplejarがプロジェクトビルドパスに追加されます。
Javaビルドパス
プロジェクト構造は、Eclipse PackageExplorerに次のように表示されます。
パッケージ構造
#3)テストクラス
CRUD(Create-Read-Update-Delete)操作をカバーできるTestクラスを作成する必要があります。
新しいクラスFile-> New-> TestNGクラスを作成し、TestCRUD.javaという名前を付けます。
#4)試験方法
個別のテストメソッドを作成しましょう。
- addEmployee(): HTTPPOSTメソッドを使用してCreateAPIをテストするためのテストメソッド。
- getEmployee(): HTTPGETメソッドを使用してReadAPIをテストするためのテストメソッド。
- updateEmployee(): HTTPPUTメソッドを使用してUpdateAPIをテストするためのテストメソッド。
- deleteEmployee(): HTTPDELETEメソッドを使用してDeleteAPIをテストするためのテストメソッド。
TestNGの@Testアノテーションのみを使用して任意のJavaメソッドとしてテストメソッドを作成し、TestNGフレームワークによってテストメソッドとして識別されるようにすることができます。
例えば、以下は、addEmployeeテストメソッドです。
@Test public void addEmployee () {}
この例では、 サンプルRESTサービス。
それでは、POST呼び出しを自動化しましょう。そのためには、「RESTAPIテスト手順」セクションで手動で実行した手順にコードを1つずつマッピングする必要があります。
#1) まず、アクセスするAPIのエンドポイントを把握します。
String addURI = 'http://dummy.restapiexample.com/api/v1/create';
#二) HTTPメソッドのヘッダーを設定します。
HttpHeaders headers = new HttpHeaders();
//ヘッダーを追加します
headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json');
HTTPメソッドのBodyを設定します。
String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}';
//本文とヘッダーを設定してHttpEntityオブジェクトを作成します。
HttpEntity entity = new HttpEntity(jsonBody, headers);
次の手順を1つのステートメントで自動化します。
#3) 適切なHTTPメソッド(この場合はPOST)を設定します。
#4) RESTfulサービスサーバーにリクエストを送信します。
#5) サーバーから応答を受信します。
RestTemplate restTemplate = new RestTemplate(); ResponseEntity response =restTemplate.postForEntity(addURI, entity, String.class);
使用しています postForEntity POSTメソッドをサーバーに送信します。サーバーのResponseEntityオブジェクトから応答を受け取ります。
#6) 応答コードを使用して、期待どおりに応答を確認します。
Assert.assertEquals(response.getStatusCode(), HttpStatus.OK);
ここでは、TestNGのAssertツールクラスを使用して、実際の値、つまりresponse.getStatusCode()を期待値HttpStatus.OKと比較するステータスコードassertEqualsメソッドを検証しています。
ただし、ここでは、もう1つ検証を行っています。つまり、追加された従業員が応答本文に存在するかどうかを検証しています。
Assert.assertTrue(responseBody.contains(employeeId));
どのようにしてemployeeIdを取得しましたか?
このために、JSONパーサーAPI、つまりJson-simpleを利用しています。
従業員のRESTサービスでクライアントとサーバー間でデータを保存および交換するためにJSON形式が使用されるため、JSONパーサーを使用しています。前述のように、JSONデータはに保存されます キー:値 フォーマット。ここでは、 「id」 値。
次のように応答本文を解析することで取得します。
JSONParser parser = new JSONParser(); // Instantiate JSONParser object JSONObject jsonResponseObject = new (JSONObject) parser.parse(jsonString); //Parse jsonString i.e. Response body string in json format to JSON object String employeeId = jsonResponseObject.get('id').toString(); // Get id attribute
つまり、これはすべてCreateメソッドテストに関するものです。
メソッドの更新、取得、削除
- 個別のテストメソッドを作成し、必要に応じてヘッダーを設定します。
- ステータスコードの検証も同様に行われます。
- 主な違いは、サーバーにリクエストを送信する方法です。
次の方法を使用できます。
#1)従業員の更新 :HTTPPUTリクエストです。使用できるRestTemplatePUTメソッドは次のとおりです。
public void put(String url,Object request, Object... urlVariables) throws RestClientException
#2)従業員を取得する: これはHTTPGETリクエストです。使用できるRestTemplateGETメソッドは次のとおりです。
public ResponseEntity getForEntity(String url, Class responseType, Object... urlVariables) throws RestClientException
#3)従業員リソースの削除: これはHTTPDELETEリクエストです。使用できるRestTemplateDELETEメソッドは次のとおりです。
public void delete(String url, Object... urlVariables) throws RestClientException
これらのメソッドとは別に、exchange()およびexecute()の便利なメソッドがあります。
例えば、 お気づきの方は、Deleteメソッドは無効です。ただし、応答本文を検証する場合は、メソッド実行からの応答が必要になります。そのために、ResponseEntityを返すexchange()メソッドを使用できます。を参照してください SpringFramework 詳細については。
#5)テストの実行
これで、テストスクリプトの開発タスクが完了したので、テストを実行してみましょう。右クリックするだけ TestCRUD.java オプションを選択します 「TestNGテストとして実行」 。
テストの実行結果は次のように表示されます。
コンソール出力
注意: テストスイートはで定義できます testng.xml ファイルも。この例では、これは1つのテストスクリプトのみです。ただし、実際のシナリオでは、常に複数のスクリプトのコレクションです。
したがって、testg.xmlファイルは次のようになります。
#6)レポート
コンソールで結果を確認しました。ただし、TestNGは、利害関係者と共有できる、より見栄えの良いhtml形式でテスト結果を提供します。開いた テスト出力 -> emailable-report.html ブラウザで。
どのvrがxboxoneで動作するか
テストレポートは次のように表示されます。レポートページでは、テスト名がTestCRUDとして表示され、いくつかの合格したテスト、つまり4、スキップされた数と失敗した数(この場合は0)が表示されます。また、各テストメソッドの実行に必要な合計時間も表示されます。
Html形式のテスト結果
完全なTestCRUDファイルコード
package com.demo; import java.io.IOException; import java.text.ParseException; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import org.testng.Assert; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import org.testng.log4testng.Logger; /** * This test class has test methods for CRUD actions on REST API * REST Service http://dummy.restapiexample.com/api * * It has test methods for Create , Edit , Get and Delete Employee items * https://docs.spring.io/spring-framework/docs/current/javadoc- api/org/springframework/web/client/RestTemplate.html * https://docs.spring.io/autorepo/docs/spring/3.2.3.RELEASE/javadoc- api/org/springframework/web/client/RestTemplate.html * @author * */ public class TestCRUD { private String responseBody; public String responseBodyPOST; final static Logger logger = Logger.getLogger(TestCRUD.class); //RESTTemplate Object private RestTemplate restTemplate; //Employee ID private String employeeId; // Create Response Entity - Stores HTTPStatus Code, Response Body, etc private ResponseEntity response; @BeforeTest public void beforeTest() throws IOException, ParseException { logger.info('Setting up prerequisite for test execution'); logger.info('Creating RestTemplate object before tests'); this.restTemplate = new RestTemplate(); } /** * Test Method to add employee using HTTP POST request * * Verifies POST action Status Code * * @throws IOException * @throws ParseException */ @Test public void addEmployee() throws IOException, ParseException { String addURI = 'http://dummy.restapiexample.com/api/v1/create'; HttpHeaders headers = new HttpHeaders(); headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json'); logger.info('Add URL :'+addURI); String jsonBody = '{'name':'zozo100','salary':'123','age':'23'}'; System.out.println('
' + jsonBody); HttpEntity entity = new HttpEntity(jsonBody, headers); //POST Method to Add New Employee response = this.restTemplate.postForEntity(addURI, entity, String.class); responseBodyPOST = response.getBody(); // Write response to file responseBody = response.getBody().toString(); System.out.println('responseBody --->' + responseBody); // Get ID from the Response object employeeId = getEmpIdFromResponse(responseBody); System.out.println('empId is :' + employeeId); // Check if the added Employee is present in the response body. Assert.assertTrue(responseBody.contains(employeeId)); // System.out.println(propertyFile.get('EmployeeAddResBody')); // Check if the status code is 201 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee is Added successfully employeeId:'+employeeId); } /** * Method to get Employee ID from REsponse body * I have used Json Simple API for Parsing the JSON object * * @param json * @return */ public static String getEmpIdFromResponse(String json) { JSONParser parser = new JSONParser(); JSONObject jsonResponseObject = new JSONObject(); Object obj = new Object(); try { obj = parser.parse(json); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } jsonResponseObject = (JSONObject) obj; String id = jsonResponseObject.get('id').toString(); return id; } /** * Test Method to Update employee using HTTP PUT request * * Verifies PUT action Status Code * Verifies Updated Name exists in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'addEmployee', enabled = true) public void updateEmployee() throws IOException, ParseException { String updateURI = 'http://dummy.restapiexample.com/api/v1/update/'+employeeId; logger.info('Update URL :'+updateURI); String jsonBody = responseBodyPOST; jsonBody = jsonBody.replace('zozo100', 'update_zozo100'); HttpHeaders headers = new HttpHeaders(); headers.add('Accept', 'application/json'); headers.add('Content-Type', 'application/json'); HttpEntity entity = new HttpEntity(jsonBody, headers); //PUT Method to Update the existing Employee //NOTE that I have Not used restTemplate.put as it's void and we need response for verification response = restTemplate.exchange(updateURI, HttpMethod.PUT, entity, String.class); responseBody = response.getBody().toString(); System.out.println('Update Response Body :'+responseBody); // Check if the updated Employee is present in the response body. Assert.assertTrue(responseBody.contains('update_zozo100')); // Check if the status code is 200 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee Name is Updated successfully employeeId:'+employeeId); } /** * Test Method to Get employee using HTTP GET request * * Verifies GET action Status Code * Verifies Name exists in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'updateEmployee', enabled = true) void getEmployee() throws IOException, ParseException { String getURI = 'http://dummy.restapiexample.com/api/v1/employee/'+this.employeeId; logger.info('Get URL :'+getURI); HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); //GET Method to Get existing Employee response = restTemplate.getForEntity(getURI,String.class); // Write response to file responseBody = response.getBody().toString(); //Suppressing for log diffs System.out.println('GET Response Body :'+responseBody); // Check if the added Employee ID is present in the response body. Assert.assertTrue(responseBody.contains('update_zozo100')); // Check if the status code is 200 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); logger.info('Employee is retrieved successfully employeeId:'+employeeId); } /** * Test Method to Delete employee using HTTP DELETE request * * Verifies DELETE action Status Code * Verifies Success Message Text in Response Body * * @throws IOException * @throws ParseException */ @Test(dependsOnMethods = 'getEmployee', enabled = true) public void deleteEmployee() throws IOException, ParseException { String delURI = 'http://dummy.restapiexample.com/api/v1/delete/'+this.employeeId; HttpHeaders headers = new HttpHeaders(); HttpEntity entity = new HttpEntity(headers); //DELETE Method to Delete existing Employee response = restTemplate.exchange(delURI, HttpMethod.DELETE, entity, String.class); // Check if the status code is 204 Assert.assertEquals(response.getStatusCode(), HttpStatus.OK); responseBody = response.getBody(); Assert.assertEquals(getMessageFromResponse(responseBody), 'successfully! deleted Records'); logger.info('Employee is Deleted successfully employeeId:'+employeeId); } /** * Gets 'text' key value from Response body text for verification * I have used Json Simple API for Parsing the JSON object * * @param json * @return text string */ public static String getMessageFromResponse(String json) { String successMessageText = null; try { JSONParser parser = new JSONParser(); JSONObject jsonResponseObject = new JSONObject(); jsonResponseObject = (JSONObject) (parser.parse(json)); String successMessage = jsonResponseObject.get('success').toString(); jsonResponseObject = (JSONObject) (parser.parse(successMessage)); successMessageText = jsonResponseObject.get('text').toString(); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } return successMessageText; } @AfterTest public void afterTest() { logger.info('Clean up after test execution'); logger.info('Creating RestTemplate object as Null'); this.restTemplate = new RestTemplate(); } }
結論
この記事の学習成果を以下にまとめました。最初から、RESTAPIテスト自動化フレームワークをセットアップするためのすべてのステップを見てきました。
これで私たちは次のことを学びました:
- テスト自動化のために、プログラミング言語としてJavaを選択しました。
- @TestのようなTestNGアノテーションを使用するテストスクリプトを作成するためのテストフレームワークとしてTestNGを選択しました。
- 実際のHTTPリクエストをサーバーに送信するために、SpringフレームワークのRestTemplateクラスを使用しました。
- これらのAPIを使用するために、TestNGをインストールし、SpringjarとJsonをダウンロードしました。パーサーAPI用の単純なjarです。
- 最後に、Testクラスを実行し、結果をコンソールと、より見やすく、読みやすいHTML形式で確認しました。
一言で言えば、この記事では、SpringRestTemplateを使用したRESTAPIテスト自動化の開始方法を学びました。すべての重要なソフトウェアのインストール、プロジェクトセットアップ、テストスクリプトの開発からテストの実行、生成されたレポートの表示まで、テスト自動化フレームワークのセットアップについて説明しました。
これは、自動化QAがテスト自動化フレームワークを開始するのに十分です。ただし、それぞれから必要な部分のみを確認しました。たとえば、TestNGインストール、@ Testアノテーションを使用したテスト方法、レポートを使用しました。ただし、TestNGは、データ駆動型テスト用のDataProviderなどの多くの機能を提供します。
SpringRestTemplateを使用したRESTAPIテスト自動化を開始する準備はできていますか?