Apidog

オールインワンのAPI開発プラットフォーム

API設計

API仕様書生成

APIデバッグ

API Mock

APIテスト自動化

無料登録
Home / 初めてのRest Assured APIテスト入門

初めてのRest Assured APIテスト入門

REST Assured APIテストの基本を学ぶ初心者向けガイドです。APIテストの自動化、初めてのテストスクリプト作成、REST Assuredによるテスト効率の向上を理解します。

ソフトウェア開発の世界では、API(アプリケーションプログラミングインターフェイス)が現代のアプリケーションの基本となっています。これらのAPIが複雑さと重要性を増す中、堅牢で効率的なテスト手法の必要性はこれまで以上に重要です。ここで登場するのが、APIテストのアプローチを一新したJavaベースのライブラリであるRest Assuredです。

Rest Assuredは、そのシンプルさとREST APIテストの自動化のパワーにより、開発者やQAプロフェッショナルの間で絶大な人気を博しています。表現力豊かな構文とJavaとのシームレスな統合は、包括的なAPIテスト戦略を実装しようとするチームにとって理想的な選択肢となります。

この完全ガイドでは、Rest AssuredによるAPIテストについて、基本的なセットアップから高度なテクニックまで深く掘り下げ、さらにAPIテストの領域における他のツールとの比較も行います。

Rest Assuredとは何か?

Rest Assuredは、RESTful APIのテスト専用に設計されたJavaベースのライブラリです。HTTPリクエストを送信し、レスポンスを検証するためのドメイン特化言語(DSL)を提供します。主な機能は以下の通りです:

  • テスト記述を簡単にするフルエントAPI
  • XMLおよびJSONの解析サポート
  • Javaエコシステムツール(TestNG、JUnitなど)との統合
  • 広範な検証機能

テストにおけるREST APIとは何か?

REST(表現状態遷移)APIは、ネットワークアプリケーションを設計するためのアーキテクチャスタイルです。テストの文脈では、REST APIテストには以下が含まれます:

  1. HTTPメソッド(GET、POST、PUT、DELETEなど)の正しい処理を検証
  2. レスポンスのステータスコードを検証
  3. レスポンスペイロードの構造と内容を確認
  4. 異なるシナリオでのAPIの動作をテスト(有効/無効な入力、認証など)
  5. API操作後の状態変化を検証

PostmanとRest Assuredの違いは何ですか?

両方のツールはAPIテストに使用されますが、異なる目的に応じてそれぞれ異なる役割を持っています:

機能 Postman Rest Assured
インターフェース GUIベース コードベース
言語 JavaScript Java
学習曲線 低い 急な
自動化 Newmanを使用 ネイティブ
CI/CD統合 追加の設定が必要 シームレス
スクリプトの柔軟性 Postmanのスクリプトに制限される 完全なJavaエコシステム

Rest Assuredは、Javaベースのテスト自動化フレームワークにAPIテストを統合する必要がある場合や、より複雑なテストシナリオが必要な場合に好まれます。

TestNGとRest Assuredの違いは何ですか?

TestNGとRest Assuredは異なる目的を持っているが、しばしば一緒に使われます:

機能 TestNG Rest Assured
主要目的 テストフレームワーク APIテストライブラリ
範囲 一般的なテスト APIテスト特化
特徴 テストの整理、並列実行、レポート作成 HTTPリクエスト、レスポンス検証
言語サポート Java Java

TestNGを使用してRest Assuredテストを構成し、両方のツールの強みを組み合わせることができます。例えば:

import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;

public class CombinedTest {

    @BeforeClass
    public void setup() {
        baseURI = "https://api.example.com";
        basePath = "/v1";
    }

    @Test(groups = "smoke")
    public void testGetUser() {
        given()
            .pathParam("id", 1)
        .when()
            .get("/users/{id}")
        .then()
            .statusCode(200)
            .body("name", notNullValue());
    }

    @Test(groups = "regression")
    public void testCreateUser() {
        String newUser = "{\"name\":\"ジョン・ドー\",\"email\":\"john@example.com\"}";
        
        given()
            .contentType("application/json")
            .body(newUser)
        .when()
            .post("/users")
        .then()
            .statusCode(201)
            .body("id", notNullValue());
    }
}

この例では、TestNGのアノテーションを使用してテストを整理し、Rest Assuredを実際のAPIテストロジックに使用しています。

Rest Assured APIテストの開始

Rest Assuredの詳細に入る前に、テスト開始の準備をするために開発環境を設定しましょう。

環境の設定

Javaをインストールする:Rest AssuredはJava 8以上を必要とします。Oracleのウェブサイトから最新のJDKをダウンロードしてインストールするか、OpenJDKを使用してください。

IDEを選ぶ:任意のテキストエディタを使用できますが、統合開発環境(IDE)は生産性を大幅に向上させることができます。人気の選択肢には:

  • IntelliJ IDEA
  • Eclipse
  • Java拡張機能付きのVisual Studio Code

Mavenプロジェクトを設定する:Mavenは依存関係の管理に役立ちます。IDEで新しいMavenプロジェクトを作成するか、コマンドラインを使用します:

mvn archetype:generate -DgroupId=com.example -DartifactId=rest-assured-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Rest Assured依存関係を追加するpom.xmlファイルを開いて、以下の依存関係を追加します:

<dependencies>
    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>4.4.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.4.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest</artifactId>
        <version>2.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

これには、Rest Assured、テストの整理のためのTestNG、追加のマッチャーのためのHamcrestが含まれています。

Mavenを更新するmvn clean installを実行して依存関係をダウンロードします。

これらの手順が完了すると、Rest Assuredテストの作成を開始する準備が整います!

基本的なRest Assured APIテストの概念

Rest Assuredは、振る舞い駆動開発(BDD)に触発されたGiven-When-Then構文に従います。この構造により、コードベースに不慣れな人々でさえテストを読みやすく、直感的にします。

Given-When-Then構造

  • Given:テストの前提条件を設定(例:パラメータ、ヘッダー、認証)
  • When:APIアクションを実行(GET、POST、PUT、DELETEなど)
  • Then:レスポンスを検証(ステータスコード、ボディ内容、ヘッダー)

簡単な例を見てみましょう:

import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
import org.testng.annotations.Test;

public class SimpleTest {
    @Test
    public void testGetRequest() {
        given()
            .baseUri("https://api.example.com")
        .when()
            .get("/users")
        .then()
            .statusCode(200)
            .body("data.size()", greaterThan(0))
            .body("data[0].id", notNullValue())
            .body("data[0].email", containsString("@"));
    }
}

このテストは以下のことを行います:

  1. APIのベースURIを設定
  2. "/users"エンドポイントにGETリクエストを送信
  3. 次を検証:
  • ステータスコードが200であること
  • レスポンスが空でないデータ配列を含むこと
  • 配列の最初のユーザーが非nullのIDを持つこと
  • 最初のユーザーのメールが"@"記号を含むこと

Rest Assured構文の理解

Rest Assuredは流暢なインターフェースを使用し、メソッド呼び出しをチェーンすることを可能にします。以下に一般的なメソッドのいくつかを示します:

  • given():テスト仕様を開始
  • baseUri()basePath():リクエストの基本URLとパス設定
  • param()queryParam():クエリパラメータを追加
  • header()headers():リクエストヘッダーを設定
  • body():リクエストボディを設定
  • when():リクエストセクションの開始を示す
  • get()post()put()delete():HTTPメソッド
  • then():検証セクションの開始を示す
  • statusCode():レスポンスステータスコードを検証
  • body():レスポンスボディを検証

高度なRest Assured APIテスト技術

Rest Assuredに慣れてくると、堅牢で包括的なテストスイートを作成するために、より高度な機能を探求したくなるでしょう。

Rest Assured APIテストにおける認証の処理

多くのAPIは認証を必要とします。Rest Assuredはさまざまな認証方法をサポートしています:

基本認証

given()
    .auth().basic("ユーザー名", "パスワード")
.when()
    .get("/secure-endpoint")
.then()
    .statusCode(200);

OAuth 2.0

given()
    .auth().oauth2("あなたのアクセス・トークン")
.when()
    .get("/oauth2-protected-endpoint")
.then()
    .statusCode(200);

カスタム認証

カスタム認証スキームを持つAPIの場合、ヘッダーを手動で追加できます:

given()
    .header("X-API-Key", "あなたのAPIキー")
.when()
    .get("/custom-auth-endpoint")
.then()
    .statusCode(200);

Rest Assured APIテストのパラメータ化

パラメータ化テストを使用すると、異なる入力で同じテストを実行でき、テストカバレッジが向上します:

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParameterizedTest {

    @DataProvider(name = "userIds")
    public Object[][] createUserIds() {
        return new Object[][] {{1}, {2}, {3}, {4}, {5}};
    }

    @Test(dataProvider = "userIds")
    public void testMultipleUsers(int userId) {
        given()
            .pathParam("id", userId)
        .when()
            .get("https://api.example.com/users/{id}")
        .then()
            .statusCode(200)
            .body("id", equalTo(userId))
            .body("name", notNullValue());
    }
}

このテストは、データプロバイダーによって提供された各ユーザーIDについて、5回実行されます。

Rest Assured APIテストにおけるJSONレスポンスの検証

Rest Assuredは、JSONPathを使用して強力なJSON解析機能を提供します:

given()
.when()
    .get("https://api.example.com/users/1")
.then()
    .statusCode(200)
    .body("name", equalTo("ジョン・ドー"))
    .body("email", endsWith("@example.com"))
    .body("roles", hasItems("user", "admin"))
    .body("address.city", equalTo("New York"))
    .body("phoneNumbers.size()", greaterThanOrEqualTo(1));

このテストは、ネストされたオブジェクトや配列を含むJSONレスポンスのさまざまな側面を検証します。

XMLレスポンスの処理

JSONが一般的ですが、一部のAPIはまだXMLを使用しています。Rest AssuredはXMLレスポンスも処理できます:

given()
.when()
    .get("https://api.example.com/data.xml")
.then()
    .statusCode(200)
    .body("root.data.name", equalTo("テスト名"))
    .body("root.data.value", equalTo("100"));

ファイルのアップロードとダウンロード

Rest Assuredはファイル操作も処理できます:

ファイルのアップロード

File fileToUpload = new File("path/to/file.txt");

given()
    .multiPart("file", fileToUpload)
.when()
    .post("/upload")
.then()
    .statusCode(200)
    .body("message", equalTo("ファイルが正常にアップロードされました"));

ファイルのダウンロード

byte[] downloadedFile = given()
.when()
    .get("/download/file.pdf")
.then()
    .statusCode(200)
    .extract().asByteArray();

// バイト配列をファイルに書き込むか、さらに処理できます

Rest Assured APIテストでのApidogの使用

Rest Assuredは単独でも強力ですが、APIドキュメンテーションおよびテストプラットフォームであるApidogを組み込むことで、APIテストワークフローを強化できます。Rest Assuredと一緒にApidogを使用する方法は次の通りです:

APIの設計:実装前にAPIdogを使用してAPIを設計および文書化します。これにより、開発者やテスターのために明確な仕様を作成できます。

テストの生成:APIdogはAPI仕様に基づいてテストケースを生成できます。これらは直接Rest Assuredテストではありませんが、テストすべきことの青写真として機能します。

テストの実施:APIdogが生成したテストケースをRest Assuredテストに翻訳します。これにより、テストがすべての指定された動作をカバーしていることが保証されます。

協力:API仕様やテスト結果をAPIdogのコラボレーション機能を通じてチームと共有します。これにより、APIの期待される動作について全員が一致した理解を持つことができます。

文書の維持:Rest Assuredテストを更新する際は、APIdog文書が同期されるようにします。これにより、正確で最新のAPI文書が維持されます。

APIdogとのREST API統合方法

REST APIとAPIdogを統合するには、いくつかの基本ステップが必要です。REST APIとAPIdogを統合するための詳細なステップバイステッププロセスは以下の通りです:

ボタン
Apidogアカウント登録

2. 「新しいプロジェクト」をクリックし、プロジェクト名を付けます。

新しいプロジェクト名の追加

3. 新しいAPIを作成します。

新しいAPIを作成

4. 次に、「エンドポイントを追加」ボタンをクリックし、「すべての本を取得」エンドポイントの詳細を入力します。

URL: http://localhost:5000/books

メソッド:GET

エンドポイント名:すべての本を取得

エンドポイントを追加

5. エンドポイントに必要なクエリパラメータやヘッダーを追加するには、「パラメータを追加」または「ヘッダーを追加」ボタンをクリックしてください。

パラメータを追加

6. 「送信」ボタンをクリックしてエンドポイントをテストし、正常に機能していることを確認します。エンドポイントが期待通りに機能している場合は、「APICaseを保存」ボタンをクリックしてApidogプロジェクトに追加します。

APICaseを保存

7. これで、Apidogを使用してエンドポイントをテストし、Flask APIのドキュメントを生成できます。

Flask APIを生成

8. テストケースのテスト手順を定義し、テストに含めるエンドポイントを選択します。必要に応じてテストケースをカスタマイズします。

テストケースをカスタマイズ

9. ケースをテストした後、Web上に公開したり、PDFやMarkdownファイルにエクスポートしたりできます。

テストケースをエクスポート

Apidogは、ユーザーが特定の要件に応じてAPIを利用しテストするのを支援するための多くのカスタマイズオプションを提供しています。

Rest Assured APIテストのベストプラクティス

Rest Assured APIテストから最大の効果を得るために、以下のベストプラクティスを考慮してください:

テストを整理する:TestNGやJUnitを使用して、論理的にテストを構成します。関連するテストをグループ化し、セットアップおよびティアダウンのために適切なアノテーションを使用します。

コードを再利用する:共通操作のためのユーティリティメソッドを作成し、テストをDRY(自分自身を繰り返さない)に保ちます。例えば:

public class TestUtils {
    public static RequestSpecification getBaseRequestSpec() {
        return given()
            .baseUri("https://api.example.com")
            .contentType(ContentType.JSON)
            .accept(ContentType.JSON);
    }
}

その後、テストで使用します:

@Test
public void testSomething() {
    TestUtils.getBaseRequestSpec()
        .when()
            .get("/endpoint")
        .then()
            .statusCode(200);
}

ロギングを使用する:ログを有効にして、問題をより簡単にデバッグします。Rest Assuredはさまざまなログオプションを提供しています:

given()
    .log().all()  // すべてのリクエスト詳細をログに記録
.when()
    .get("/endpoint")
.then()
    .log().ifValidationFails()  // 検証が失敗した場合にレスポンスをログに記録
    .statusCode(200);

スキーマを検証する:JSONスキーマ検証を使用して、レスポンスの構造が正しいことを確認します:

given()
.when()
    .get("/users")
.then()
    .assertThat()
    .body(matchesJsonSchemaInClasspath("user-schema.json"));

環境固有のデータを処理する:プロパティファイルや環境変数を使用して、異なる環境を管理します:

public class Config {
    public static String getBaseUrl() {
        return System.getProperty("api.baseUrl", "https://api.example.com");
    }
}

その後、これをテストで使用します:

@Test
public void testEndpoint() {
    given()
        .baseUri(Config.getBaseUrl())
    .when()
        .get("/users")
    .then()
        .statusCode(200);
}

レスポンス抽出を使用する:複雑な検証の場合、レスポンスを抽出し、アサーションを実行します:

Response response = given()
    .when()
        .get("/users")
    .then()
        .extract().response();

JsonPath jsonPath = response.jsonPath();
List<String> names = jsonPath.getList("name");
Assert.assertTrue(names.contains("ジョン・ドー"));

カスタムマッチャーを実装する:特定の検証のために、カスタムのHamcrestマッチャーを作成します:

public class CustomMatchers {
    public static Matcher<String> isValidEmail() {
        return new TypeSafeMatcher<String>() {
            @Override
            protected boolean matchesSafely(String item) {
                return item.matches("^[A-Za-z0-9+_.-]+@(.+)$");
            }

            @Override
            public void describeTo(Description description) {
                description.appendText("有効なメールアドレスである必要があります");
            }
        };
    }
}

テストで使用します:

given()
.when()
    .get("/users/1")
.then()
    .body("email", CustomMatchers.isValidEmail());

包括的なテストのためにデータプロバイダーを使用する:TestNGのデータプロバイダーを活用して、複数のシナリオをテストします:

@DataProvider(name = "userRoles")
public Object[][] userRoles() {
    return new Object[][] {
        {"admin", 200},
        {"user", 403},
        {"guest", 401}
    };
}

@Test(dataProvider = "userRoles")
public void testAccessControl(String role, int expectedStatus) {
    given()
        .auth().oauth2(getTokenForRole(role))
    .when()
        .get("/admin-endpoint")
    .then()
        .statusCode(expectedStatus);
}

リトライメカニズムを実装する:不安定なテストや信頼できないネットワークのために、リトライメカニズムを実装します:

@Test(retryAnalyzer = RetryAnalyzer.class)
public void testWithRetry() {
    // テストコードをここに書きます
}

public class RetryAnalyzer implements IRetryAnalyzer {
    private int retryCount = 0;
    private static final int MAX_RETRY_COUNT = 3;

    @Override
    public boolean retry(ITestResult result) {
        if (retryCount < MAX_RETRY_COUNT) {
            retryCount++;
            return true;
        }
        return false;
    }
}

仕様を使用する:一貫したリクエスト/レスポンスの期待値のために、仕様を使用します:

RequestSpecification requestSpec = new RequestSpecBuilder()
    .setBaseUri("https://api.example.com")
    .setContentType(ContentType.JSON)
    .build();

ResponseSpecification responseSpec = new ResponseSpecBuilder()
    .expectStatusCode(200)
    .expectContentType(ContentType.JSON)
    .build();

@Test
public void testWithSpecs() {
    given()
        .spec(requestSpec)
    .when()
        .get("/users")
    .then()
        .spec(responseSpec);
}

結論

Rest Assured APIテストは、APIテストを自動化するための強力で柔軟な方法を提供します。TestNGやAPIdogなどのツールと組み合わせることで、Javaベースのプロジェクトとシームレスに統合された包括的なAPIテスト戦略を作成できます。

Rest Assuredを使用することの主な利点は以下の通りです:

  1. シンプルさ:流暢なAPIにより、テストを書くことが直感的で読みやすくなります。
  2. パワー:リクエスト構築やレスポンス検証のための広範な機能を提供します。
  3. 統合:ビルドツールやCI/CDパイプラインを含むJavaエコシステムと良好に連携します。
  4. 柔軟性:シンプルなGETリクエストから複雑な認証やファイル処理まで、Rest Assuredはすべてを処理できます。

APIが現代のソフトウェアアーキテクチャにおいて重要な役割を果たし続ける中、堅牢なAPIテストがますます重要になっています。Rest Assuredは、APIが信頼性が高く、性能が良く、期待どおりに動作するためのツールを提供します。

効果的なAPIテストは、バグを見つけるだけでなく、システム全体の品質と信頼性を確保することが重要です。Rest Assuredを使用すれば、APIを徹底的にテストし、製品にリリースされる前に問題を見つけることができます。

Rest Assuredとの旅を続ける中で、機能を探求し続け、最新バージョンにアップデートし、オープンソースコミュニティへの貢献をためらわないでください。楽しいテストライフを!

Apidogのニュースレターを購読する

今すぐ購読すると、いつでもApidogから更新情報と最新観点を手に入れることができます。

有効なメールアドレスを入力してください。
ネットワークエラー、後で再試行してください
購読していただきありがとうございます!