DUICUO

Rest Assured ライブラリと Cucumber BDD フレームワークを使用して API テストを自動化します。

翻訳者 |ヤン・シャオジュアン

校正:孫淑娟

Rest Assuredライブラリの紹介

REST(Representational State Transfer)は、HTTP呼び出しを用いたシステム間通信のためのアーキテクチャです。クライアントは固有のURIを使用して、サーバーのリソースとそのレスポンスにアクセスできます。リソースのURIはリソース識別子として機能し、GET、POST、PUT、PATCH、DELETEなどのHTTP操作をリソースに対して実行できます。

REST Assuredは、ドメイン固有言語(DSL)を活用して、RESTful API向けの堅牢で保守性の高いテストを開発できるJavaライブラリです。REST Assuredライブラリの注目すべき機能をいくつか見てみましょう。

  1. ライセンス料がかからないオープンソースアプリケーションです。
  2. 一般的に使用されているプログラミング言語Javaを使用する
  3. REST サービスの API テストと検証がシンプルかつシームレスになります。
  4. GPath を使用して応答を反復処理することは、XML および JSON 応答の読み取りに最適です。
  5. JSONスキーマの検証
  6. TestNG や JUnit などの他のテスト フレームワークと簡単に統合できます。
  7. GET、POST、PUT、DELETE、PATCH など、あらゆるタイプの HTTP メソッドの API 自動化をサポートします。
  8. BDD Gherkin 言語をサポートし、簡潔なコーディングと読みやすさを実現します。

Cucumberフレームワークの紹介

Cucumberは、ビヘイビア駆動開発(BDD)をサポートするオープンソースのテストフレームワークであり、広く利用されています。テスターはGherkinのシンプルな英語を使ってテストケースを作成できます。

テストプロセスとワークフローを技術者以外の人にも分かりやすくするため、多くの組織では、CucumberフレームワークをSeleniumやRest Assuredと統合し、アプリケーションの自動化を実現したいと考えています。Cucumberの主な利点は、テストとシナリオを平易な英語で記述できることです。これにより、多くのチームメンバー(ビジネスアナリスト、プロジェクトマネージャー、手動テスター)や技術者以外の人がテストワークフローを非常に簡単に確認・理解できます。Cucumberは、機能ファイルを読むだけでアプリケーションの機能的な振る舞いを誰でも理解できるため、ビヘイビア駆動開発(BDD)フレームワークとして知られています。

Cucumber フレームワークの 3 つのコンポーネント:

1. 機能ファイル:このファイルは、テスト機能、テスト シナリオ、テスト タグ、テスト ケース、テスト データなどの形式で、テスト対象のアプリケーションに関する高レベルの情報を提供します。機能ファイルの作成に使用されるコンポーネントは次のとおりです。

  • 機能 -テストする特性 (通常はタイトル) を定義します。
  • シナリオ - テスト フローを作成する必要がある特定のテスト シナリオを定義します。
  • シナリオ アウトラインは、さまざまなテスト データに対する特定のテスト シナリオを定義します。これらのシナリオは、パイプ記号 (|) で区切られたテーブル構造で提供されます。
  • タグ – 各シナリオにタグ名を定義します。これにより、フィーチャーファイルのすべてのテストシナリオを整理またはグループ化できます。上記のFeatureキーワードでタグを使用することで、実行する必要があるフィーチャーファイルを指定できます。
  • 与えられた条件 - 特定のテストシナリオを定義するための前提条件
  • いつ - アクションを定義します。これは、まだ実行されていないアプリケーションとの対話アクションにすることもできます。
  • And - 前のアクションに関連付けられた追加のアクションを定義します。
  • 次に、予想されるテスト出力と実行する後操作を定義します。
  • 例 - 「シナリオアウトライン」に記述されたテストケースのテストデータセットを定義する

2. ステップ定義ファイル:ステップ定義ファイルは、プレイブックファイル内のすべてのテストケースステップをコードにリンクするために作成されます。ステップ定義ファイルでは、Given、When、Thenなどのアノテーションを使用して、テストケースステップを実行コードにマッピングします。実行される各テストケースについて、アノテーションの記述はプレイブックファイルに記載されているテストステップと一致している必要があります。

3. テストランナーファイル:このファイルはテストスイートのドライバーファイルであり、プレイブックベースのステップ定義ファイルを駆動または実行するために使用されます。テストランナーファイルには、プレイブックとステップ定義ファイルへのパス、およびCucumberベースのテストレポートの実行に必要なタグが含まれています。CucumberベースのHTMLレポートには、洞察に富んだレポートを生成するためのプラグインを追加するオプションも用意されています。

Rest AssuredライブラリをCumberフレームワークに統合する

Rest AssuredライブラリとCucumberフレームワークについて学んだので、次はテストシナリオの作成方法と、様々なテストデータセットでのAPIテストの手順を学びましょう。前述の通り、Rest AssuredライブラリをCucumberフレームワークに統合するには、機能、ステップ定義、ランナーなどのファイルを作成する必要があります。

先に進む前に、簡単な Maven プロジェクトを作成し、Rest Assured ライブラリと Cucumber フレームワークのすべての依存関係を pom.xml ファイルにインポートしましょう。

 <依存関係>
<groupId> info.cukes </groupId>
<artifactId> キュウリ- java </artifactId>
<バージョン> 1.2.5 </バージョン>
</依存関係>

<依存関係>
<groupId> info.cukes </groupId>
<artifactId> キュウリ- jvm - deps </artifactId>
<バージョン> 1.0.5 </バージョン>
<スコープ> テスト</スコープ>
</依存関係>

<依存関係>
<groupId> info.cukes </groupId>
<artifactId> キュウリ- テスト</artifactId>
<バージョン> 1.2.5 </バージョン>
<スコープ> コンパイル</スコープ>
<除外>
<除外>
<グループID> ジュニット</グループID>
<アーティファクトID> ジュニット</アーティファクトID>
</除外>
</除外>
</依存関係>

<依存関係>
<グループID> net.masterthought </グループID>
<artifactId> キュウリ- レポート</artifactId>
<バージョン> 5.0.2 </バージョン>
</依存関係>

<依存関係>
<groupId> io.rest - 安心しました</groupId>
<artifactId> 安心ください</artifactId>
<バージョン> 4.3.2 </バージョン>
<スコープ> テスト</スコープ>
</依存関係>

<依存関係>
<groupId> io.rest - 安心しました</groupId>
<artifactId> json - パス</artifactId>
<バージョン> 4.3.2 </バージョン>
<スコープ> テスト</スコープ>
</依存関係>

<依存関係>
<groupId> io.rest - 安心しました</groupId>
<artifactId> xml - パス</artifactId>
<バージョン> 4.3.2 </バージョン>
<スコープ> テスト</スコープ>
</依存関係>

<依存関係>
<groupId> io.rest - 安心しました</groupId>
<artifactId> json - スキーマ- バリデーター</artifactId>
<バージョン> 4.3.2 </バージョン>
<スコープ> テスト</スコープ>
</依存関係>

<依存関係>
<グループID> org.hamcrest </グループID>
<artifactId> ハムクレスト- すべて</artifactId>
<バージョン> 1.3 </バージョン>
<スコープ> テスト</スコープ>
</依存関係>

Cucumber フレームワークを使用する場合は、異なる Cucumber コンポーネントごとに異なるパッケージを使用することをお勧めします。これにより、プロジェクト階層がより適切に構築され、テスト スイートを理解しやすくなります。

機能ファイル

 Reqres_api_test . 機能
機能: Rest Assured ライブラリと Cucumber フレームワークを使用して、 ユーザーAPIテスト要件を実行します
@スモークテスト
シナリオ概要: GET API テストが必要

ユーザーを取得するための有効なエンドポイントが指定されている
ページ番号 < ページ> リクエストサーバー送信れる
次に、 メールアドレス <emailID> ある最初ユーザーレコードレスポンス検証します

:
| ページ| メールID |
| 2 | マイケル・ローソン@reqres . in |
| 1 | george . bluth @reqres . in |

@スモークテスト
シナリオ概要: POST API テストが必要

ユーザー作成するためのペイロードを持つ有効エンドポイントが与えられた場合
リクエストサーバー送信れる
次に、 < ユーザー名> という名前新しいユーザー作成する必要があります

:
| ユーザー名|
| ジョン|

上記のプレイブックファイルの目的は、複数のテストケースを用いてパラメータ化されたテストを実行することです。そのため、テストケースの作成時には「Examples」というキーワードを使用し、テストケースはパイプ記号(|)で区切られています。プレイブックファイル内のテストステップにパラメータを追加するには、「<variableName>」という構文を使用します。上記のファイルでも同じ方法が使用されています。さらに、特定のパラメータに基づいてテストケースを区別するために、Examplesの最初の行でも同じ変数名を使用する必要があります。

ステップ定義ファイル

 GetApiTest.java
パッケージstepDefinitions ;

static io . restassured . RestAssured . given をインポートします
org.testng.Assert インポートします
cucumber . api . java . en . Given をインポートします
cucumber.api.java.en インポートします そして;
cucumber . api . java . en . When をインポートします
io . restassured . RestAssured をインポートします
io.restassured.http.ContentType インポートます
io . restassured . response . Response をインポートします

パブリッククラスGetApiTest {
応答応答;

@Given ( "^ユーザーを取得するための有効なエンドポイント$" )
パブリックvoid セットアップエンドポイント()
{
安心してくださいBaseURI = "https://reqres.in/" ;
RestAssured . basePath = "/api/users" ;
}

@When ( "^リクエストはページ番号を \"([^\"]*)\"$" としてサーバーに送信されます)
public void sendRequest ( int pageNumber )
{
応答= 与えられた()
queryParam ( "ページ" , pageNumber )
いつ()
。得る()
それから()
.contentType ( コンテンツタイプ.JSON )
.extract (). response ();
}

@Then ( "^メールアドレスが \"([^\"]*)\"$" である最初のユーザーレコードの応答を検証します)
パブリックvoid 検証ユーザーデータ( 文字列emailID )
{
文字列userEmail = レスポンス. path ( "data[0].email" );
アサートします。assertEquals ( userEmailemailID )。
}
}

PostApiTest.java
パッケージstepDefinitions ;

static io . restassured . RestAssured . given をインポートします
java.util.HashMap インポートします
org.testng.Assert インポートします
cucumber . api . java . en . Given をインポートします
cucumber.api.java.en インポートします そして;
cucumber . api . java . en . When をインポートします
io . restassured . RestAssured をインポートします
io.restassured.http.ContentType インポートます
io . restassured . response . Response をインポートします

パブリッククラスPostApiTest {

応答応答;
パブリックHashMap < ObjectObject > map = new HashMap < ObjectObject > ();

@Given ( "^ユーザーを作成するためのペイロードを持つ有効なエンドポイント$" )
パブリックvoid セットアップエンドポイントとポストデータ ()
{
安心してくださいBaseURI = "https://reqres.in/" ;
RestAssured . basePath = "/api/users" ;

map . put ( "name" , "john" );
map . put ( "job" , "ソフトウェア開発者" );
}

@When ( "^リクエストがサーバーに送信される$" )
パブリックvoid sendRequest ()
{
応答= 与えられた()
.contentType ( コンテンツタイプ.JSON )
.body ( マップ)
いつ()
役職()
それから()
. statusCode ( 201 ). contentType ( ContentType . JSON )
.extract (). response ();
}

@Then ( "^新しいユーザーは \"([^\"]*)\"$" という名前で作成する必要があります)
public void validResponse ( 文字列)
{
文字列userName = レスポンス. path ( "name" );
アサートします。assertEquals ( userNamename )。
}
}

上記では、スクリプト ファイルに記載されている 2 つのシナリオに対して、GET API 検証用と POST API 検証用の 2 つのステップ定義ファイルを作成しました。

プレイブックファイルで定義された各テストステップの実行コードを、ステップ定義ファイル内に記述しました。これは、Rest AssuredをCucumberフレームワークに統合するためのファイルであり、すべてのAPIがここで検証されます。プレイブックファイルに記述されたテストステップは、アノテーション内のテストステップと同じ方法で定義する必要があります。また、ここではサーバーレスポンスのアサーションにTestNGを使用しています。

ランナーファイル

 ランナー.java
パッケージtestRunner ;

org.testng.annotations.AfterClass インポートします
org.testng.annotations.BeforeClass インポートします
組織をインポートしますテスト注釈データプロバイダー;
org.testng.annotations.Test インポートます
cucumber.api.CucumberOptions インポートします
cucumber.api.testng.CucumberFeatureWrapper インポートます
cucumber.api.testng.TestNGCucumberRunner インポートます

@キュウリオプション(
features = "src/test/java/FeatureFile"
グルー= { "ステップ定義" },
タグ= { "@SmokeTest" },
フォーマット= {
"かわいい"
「html:target/cucumber-reports/cucumber-pretty」
"json:target/cucumber-reports/CucumberTestReport.json"
「再実行:target/cucumber-reports/rerun.txt」
},
プラグイン= "json:target/cucumber-reports/CucumberTestReport.json" )

パブリッククラスランナー{
プライベートTestNGCucumberRunner testNGCucumberRunner ;

@授業前
public void setUp () は例外をスローします
{
testNGCucumberRunner = 新しいTestNGCucumberRunner ( Runner . クラス) ;
}


@Test ( データプロバイダー= "features" )
パブリックvoid my_test ( CucumberFeatureWrapper cucumberFeature )
{
testNGCucumberRunner . runCucumber ( cucumberFeature . getCucumberFeature ());
}

@データプロバイダー
パブリックオブジェクト[][] 機能()
{
testNGCucumberRunner .provideFeatures () を返します
}

@授業後
パブリックvoid ティアダウン()
{
testNGCucumberRunner.finish ( ) ;
}
}

コードレビュー

Cucumber テスト実行ファイルには、プレイブック ファイルとステップ定義ファイルへのパス、タグ名、レポート形式、HTML レポート プラグインなどのパラメータを受け入れる CucumberOptions アノテーションが含まれています。

Rest AssuredライブラリのCucumberフレームワークをTestNGフレームワークに統合するために、「TestNGCucumberRunner」という定義済みのCucumberフレームワーククラスを使用します。このクラスは、runCucumber、provideFeatures、finishなどのメソッドを提供します。さらに、「CucumberFeatureWrapper」は、Testアノテーションのメソッドパラメータで使用されるインターフェースで、TestNGレポートをより詳細に記述します。

テストNG.xml

 <? xml バージョン= "1.0" エンコーディング= "UTF-8" ?>
<! DOCTYPE スイートSYSTEM "http://testng.org/testng-1.0.dtd" >
< スイート= "TestNG-Cucumber Suite" スレッド- = "10" 並列= "tests" >
< テスト= "Apple テスト" >
<クラス>
< クラス= "testRunner.Runner" />
</クラス>
</テスト>
</ スイート>

これは、テストスイートの実行を設定するためのTestNG XMLファイルです。APIテストの実行にはRunner Javaクラスを使用します。完了すると、ターゲットディレクトリ->cucumber-reports->cucumber-pretty->index.htmlからレポートを表示できます。

翻訳者紹介

楊暁娟は51CTOのコミュニティエディターです。西安電子科技大学でコンピュータサイエンスの修士号を取得し、シニアR&Dエンジニア兼情報システムプロジェクトマネージャーとして、約20年のJava開発経験を有しています。NEC、Oracle、Infrontで勤務し、データストレージ、Oracleデータベースのデータ移行、同種/異種データベースのレプリケーションに注力してきました。データベースとデータエンコーディングに関する深い知識と専門知識を有しています。

原題: API テスト自動化 (RestAssured ライブラリと Cucumber BDD フレームワークを使用) 、著者: Ramit Dhamija