KotlinでREST APIを安全にテストする!モックサーバー活用法と実装例

Kotlinアプリケーションの開発において、REST APIのテストは非常に重要です。しかし、APIの実際のエンドポイントを使ってテストするのは、ネットワークの問題やサーバーの応答遅延、エラーシミュレーションの難しさなど、さまざまな課題があります。これらの問題を解決するために、モックサーバーが活用されます。

モックサーバーを使うことで、テスト環境をコントロールし、特定のレスポンスやエラーシナリオを容易にシミュレーションできます。Kotlinでのモックサーバーの導入により、効率的で信頼性の高いAPIテストが可能になります。本記事では、Kotlinアプリ開発でのREST APIテストを安全かつ効果的に行うためのモックサーバーの活用方法と具体的な実装例を解説します。

目次
  1. REST APIテストの課題とは
    1. 1. ネットワーク依存の問題
    2. 2. APIサーバーの不安定さ
    3. 3. テストデータの一貫性
    4. 4. エラーシミュレーションの難しさ
    5. 5. コストとアクセス制限
  2. モックサーバーとは何か
    1. モックサーバーの基本的な役割
    2. なぜモックサーバーが必要なのか
    3. モックサーバーの使用例
  3. Kotlinで利用可能なモックサーバーライブラリ
    1. 1. MockWebServer
    2. 2. WireMock
    3. 3. MockServer
    4. 4. JSON Server
  4. MockWebServerのセットアップ手順
    1. 1. 依存関係の追加
    2. 2. MockWebServerのインスタンス作成
    3. 3. テスト用のリクエストとレスポンスの設定
    4. 4. MockWebServerの終了処理
    5. 5. 実行結果の確認
  5. MockWebServerを使ったシンプルなテスト例
    1. 1. テスト対象のAPIクライアント
    2. 2. MockWebServerを使用したテストコード
    3. 3. テストの解説
    4. 4. テストの実行結果
  6. モックサーバーでのエラーシミュレーション
    1. 1. 404 Not Found エラーのシミュレーション
    2. 2. 500 Internal Server Error のシミュレーション
    3. 3. タイムアウトのシミュレーション
    4. 4. レスポンスヘッダーのシミュレーション
    5. エラーシミュレーションのポイント
  7. 複雑なAPIテストのシナリオ例
    1. 1. ユーザー認証とデータ取得のシナリオ
    2. APIクライアントの実装例
    3. テストコードの例
    4. 2. 複数のリクエストと順序の検証
    5. 複雑なAPIテストのポイント
  8. モックサーバーを使う際のベストプラクティス
    1. 1. テストごとにモックサーバーを初期化する
    2. 2. レスポンスを柔軟に設定する
    3. 3. 遅延やエラーのシミュレーションを活用する
    4. 4. リクエストの検証を行う
    5. 5. テストケースをシナリオごとに分ける
    6. 6. レスポンスのテンプレート化
    7. 7. CI/CDパイプラインに統合する
    8. ベストプラクティスのまとめ
  9. まとめ

REST APIテストの課題とは


Kotlinアプリケーション開発でREST APIをテストする際、開発者は以下のような課題に直面することがよくあります。

1. ネットワーク依存の問題


本番APIを使用すると、ネットワーク遅延や接続障害がテストに影響を与えることがあります。これにより、正確なテストが難しくなります。

2. APIサーバーの不安定さ


開発中にAPIサーバーがダウンしていたり、メンテナンス中の場合、テストが進められない状況が発生します。

3. テストデータの一貫性


APIのレスポンスが動的な場合、テストデータが一貫せず、再現性のあるテストが困難になります。

4. エラーシミュレーションの難しさ


本番APIで特定のエラー状態(例:タイムアウト、500エラー)を意図的に再現するのは困難です。

5. コストとアクセス制限


サードパーティAPIを使用している場合、リクエスト回数に制限があったり、コストが発生することがあります。

これらの課題を解決するために、モックサーバーを利用することで、ネットワークやサーバー依存を排除し、効率的で正確なテストを実施できます。

モックサーバーとは何か


モックサーバーとは、本物のAPIサーバーの代わりに動作するテスト用のサーバーです。モックサーバーは、あらかじめ定義したリクエストとレスポンスをシミュレーションし、APIの挙動を模倣します。

モックサーバーの基本的な役割


モックサーバーは、以下のような役割を果たします:

  • リクエストとレスポンスのシミュレーション:本番環境と同じようなリクエストに対して、事前に設定したレスポンスを返します。
  • エラー状態の再現:タイムアウトや500エラーといった異常系のシミュレーションが可能です。
  • テスト環境の制御:ネットワークやサーバーの状態に左右されず、安定したテストが行えます。

なぜモックサーバーが必要なのか


モックサーバーを使うことで、以下のメリットが得られます:

  • 高速なテスト実行:ネットワーク遅延がないため、テストが素早く実行できます。
  • 安定したテスト環境:APIサーバーがダウンしていても、テストを継続できます。
  • エラーシナリオのテスト:意図的にエラーをシミュレーションし、エッジケースを確認できます。
  • コスト削減:サードパーティAPIの利用制限やコストを気にせずテスト可能です。

モックサーバーの使用例


例えば、Kotlinで天気情報を取得するアプリを開発する場合、実際の天気APIにリクエストを送る代わりにモックサーバーで次のようなレスポンスを返すことができます:

{
  "location": "Tokyo",
  "temperature": 25,
  "condition": "Clear"
}

このようにモックサーバーを利用することで、APIの挙動を自由に制御し、効率的にテストを行うことができます。

Kotlinで利用可能なモックサーバーライブラリ


KotlinでREST APIのテストを効率化するために利用できる、代表的なモックサーバーライブラリを紹介します。

1. MockWebServer


概要
Square社が提供する、KotlinおよびJava向けのモックサーバーライブラリです。RetrofitやOkHttpと連携して使用されることが多く、シンプルなセットアップでHTTPリクエストとレスポンスのシミュレーションが可能です。

特徴

  • リアルなHTTP通信を模擬できる
  • シンプルなAPIで容易に導入可能
  • 非同期リクエストのテスト対応
  • エラーや遅延のシミュレーションが可能

利用例

val mockWebServer = MockWebServer()
mockWebServer.enqueue(MockResponse().setBody("{ \"message\": \"Hello World\" }"))
mockWebServer.start()

2. WireMock


概要
WireMockは強力なモックサーバーで、複雑なシナリオやエラーケースのシミュレーションが可能です。HTTPベースのAPIを完全に模倣でき、設定も柔軟です。

特徴

  • 複雑なリクエスト/レスポンスのマッチングが可能
  • スタンドアロンで動作可能
  • レスポンスの遅延やエラーのシミュレーション
  • JSON形式で設定可能

利用例

WireMock.stubFor(
    get(urlEqualTo("/api/hello"))
    .willReturn(aResponse().withBody("{ \"greeting\": \"Hello World\" }"))
)

3. MockServer


概要
MockServerは、HTTPやHTTPSのリクエストとレスポンスをモックできる強力なツールです。柔軟な設定が可能で、CI/CDパイプラインにも統合しやすいです。

特徴

  • 複数のリクエストとレスポンスのパターンを定義可能
  • クライアントのリクエストを検証できる
  • JavaおよびKotlinで利用可能
  • Dockerコンテナでの実行が可能

4. JSON Server


概要
シンプルなJSONファイルを元にモックAPIを作成できるツールです。データベースの代わりにJSONファイルを使用し、簡単にCRUD操作をテストできます。

特徴

  • JSONファイルを元にモックAPIを自動生成
  • 簡単なセットアップで即時利用可能
  • RESTful APIのCRUD操作をサポート

これらのモックサーバーライブラリを活用することで、KotlinアプリケーションのREST APIテストを効率的かつ柔軟に行うことができます。用途やプロジェクトに応じて最適なライブラリを選択しましょう。

MockWebServerのセットアップ手順


KotlinでREST APIをテストするために、MockWebServerをセットアップする手順を解説します。MockWebServerは、Square社が提供するモックサーバーで、OkHttpやRetrofitと一緒に利用されることが多いです。

1. 依存関係の追加


まず、build.gradle.ktsファイルにMockWebServerの依存関係を追加します。

dependencies {
    testImplementation("com.squareup.okhttp3:mockwebserver:4.9.1")
    testImplementation("com.squareup.okhttp3:okhttp:4.9.1")
    testImplementation("junit:junit:4.13.2")
}

2. MockWebServerのインスタンス作成


テストクラスでMockWebServerをインスタンス化します。

import okhttp3.mockwebserver.MockWebServer
import okhttp3.mockwebserver.MockResponse
import org.junit.After
import org.junit.Before
import org.junit.Test

class ApiTest {

    private lateinit var mockWebServer: MockWebServer

    @Before
    fun setUp() {
        mockWebServer = MockWebServer()
        mockWebServer.start()
    }

    @After
    fun tearDown() {
        mockWebServer.shutdown()
    }
}

3. テスト用のリクエストとレスポンスの設定


MockWebServerに対して、テスト用のレスポンスを設定します。

@Test
fun `test API returns expected response`() {
    // モックレスポンスを定義
    val mockResponse = MockResponse()
        .setResponseCode(200)
        .setBody("{\"message\": \"Hello, world!\"}")

    // モックサーバーにレスポンスをキューに追加
    mockWebServer.enqueue(mockResponse)

    // リクエストを送るURLを取得
    val baseUrl = mockWebServer.url("/api/hello")

    // HTTPクライアントでリクエストを送る (例:OkHttp)
    val client = okhttp3.OkHttpClient()
    val request = okhttp3.Request.Builder().url(baseUrl).build()

    val response = client.newCall(request).execute()

    // レスポンスを検証
    assert(response.isSuccessful)
    assert(response.body?.string() == "{\"message\": \"Hello, world!\"}")
}

4. MockWebServerの終了処理


テストが完了したら、tearDownメソッドでMockWebServerをシャットダウンし、リソースを解放します。

@After
fun tearDown() {
    mockWebServer.shutdown()
}

5. 実行結果の確認


テストを実行し、期待したレスポンスが返ってくるか確認します。エラーや例外が発生した場合は、モックの設定やリクエストURLを見直しましょう。


これでMockWebServerのセットアップと基本的なテストの準備が完了です。これを活用することで、REST APIのテストをネットワークやサーバーの制約に影響されず、効率的に行うことができます。

MockWebServerを使ったシンプルなテスト例


ここでは、MockWebServerを使用してKotlinでシンプルなREST APIテストを行う方法を紹介します。具体的に、HTTPリクエストを送信し、期待したレスポンスが返るかを確認するテストを実装します。

1. テスト対象のAPIクライアント


まず、テストするためのシンプルなAPIクライアントを作成します。OkHttpを使用してリクエストを送るクライアントです。

import okhttp3.OkHttpClient
import okhttp3.Request

class ApiClient(private val baseUrl: String) {

    private val client = OkHttpClient()

    fun fetchMessage(): String? {
        val request = Request.Builder()
            .url("$baseUrl/api/message")
            .build()

        client.newCall(request).execute().use { response ->
            return if (response.isSuccessful) {
                response.body?.string()
            } else {
                null
            }
        }
    }
}

2. MockWebServerを使用したテストコード


次に、MockWebServerを使用してAPIクライアントの動作をテストします。

import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test

class ApiClientTest {

    private lateinit var mockWebServer: MockWebServer
    private lateinit var apiClient: ApiClient

    @Before
    fun setUp() {
        mockWebServer = MockWebServer()
        mockWebServer.start()
        apiClient = ApiClient(mockWebServer.url("/").toString())
    }

    @After
    fun tearDown() {
        mockWebServer.shutdown()
    }

    @Test
    fun `fetchMessage returns expected response`() {
        // モックレスポンスを設定
        val mockResponse = MockResponse()
            .setResponseCode(200)
            .setBody("{\"message\": \"Hello, Kotlin!\"}")

        mockWebServer.enqueue(mockResponse)

        // APIクライアントでメッセージを取得
        val response = apiClient.fetchMessage()

        // レスポンスの検証
        assertEquals("{\"message\": \"Hello, Kotlin!\"}", response)
    }
}

3. テストの解説

  1. MockWebServerの起動
    setUp()メソッドでMockWebServerを起動し、ベースURLをAPIクライアントに渡しています。
  2. モックレスポンスの設定
    mockWebServer.enqueue()でモックレスポンスを定義します。HTTPステータスコードとレスポンスボディを設定します。
  3. API呼び出しと結果検証
    apiClient.fetchMessage()でAPIリクエストを送信し、期待通りのレスポンスが返るかを検証します。
  4. MockWebServerの終了
    tearDown()メソッドでMockWebServerをシャットダウンします。

4. テストの実行結果


テストを実行すると、以下のような結果が得られます:

Tests passed: 1 of 1 test - ApiClientTest.fetchMessage returns expected response

このように、MockWebServerを活用することで、KotlinのREST APIクライアントを簡単かつ効率的にテストできます。ネットワーク依存を排除し、安定したテスト環境を構築することが可能です。

モックサーバーでのエラーシミュレーション


モックサーバーを使うことで、REST APIのエラーシナリオや例外ケースをシミュレーションできます。エラーの発生を意図的に再現し、Kotlinアプリケーションのエラーハンドリングが正しく機能するかを確認しましょう。

1. 404 Not Found エラーのシミュレーション


リクエストしたリソースが存在しない場合の404エラーをシミュレーションします。

@Test
fun `test 404 Not Found error`() {
    // 404エラーのモックレスポンスを設定
    val mockResponse = MockResponse()
        .setResponseCode(404)
        .setBody("{\"error\": \"Resource not found\"}")

    mockWebServer.enqueue(mockResponse)

    // APIクライアントでメッセージを取得
    val response = apiClient.fetchMessage()

    // レスポンスの検証
    assertEquals(null, response)
}

解説

  • setResponseCode(404) でHTTP 404エラーを設定しています。
  • APIクライアントがエラーを検出し、nullを返すことを確認しています。

2. 500 Internal Server Error のシミュレーション


サーバー内部エラーである500エラーをシミュレーションします。

@Test
fun `test 500 Internal Server Error`() {
    // 500エラーのモックレスポンスを設定
    val mockResponse = MockResponse()
        .setResponseCode(500)
        .setBody("{\"error\": \"Internal server error\"}")

    mockWebServer.enqueue(mockResponse)

    // APIクライアントでメッセージを取得
    val response = apiClient.fetchMessage()

    // レスポンスの検証
    assertEquals(null, response)
}

解説

  • setResponseCode(500) でHTTP 500エラーを設定し、内部サーバーエラーをシミュレーションします。

3. タイムアウトのシミュレーション


ネットワーク遅延によるタイムアウトをシミュレーションします。

@Test
fun `test network timeout`() {
    // レスポンスに遅延を設定
    val mockResponse = MockResponse()
        .setBody("{\"message\": \"Delayed response\"}")
        .setBodyDelay(5, TimeUnit.SECONDS) // 5秒の遅延

    mockWebServer.enqueue(mockResponse)

    // タイムアウトを短めに設定したクライアントでリクエストを送る
    val client = OkHttpClient.Builder()
        .callTimeout(2, TimeUnit.SECONDS) // 2秒のタイムアウト設定
        .build()

    val request = Request.Builder()
        .url(mockWebServer.url("/api/message"))
        .build()

    try {
        client.newCall(request).execute()
    } catch (e: SocketTimeoutException) {
        println("Timeout occurred: ${e.message}")
    }
}

解説

  • setBodyDelay(5, TimeUnit.SECONDS) でレスポンスを5秒遅延させます。
  • クライアントのタイムアウト設定を2秒にし、タイムアウト例外が発生することを確認します。

4. レスポンスヘッダーのシミュレーション


認証エラーやリダイレクトなど、特定のヘッダー情報を含めたレスポンスをシミュレーションします。

@Test
fun `test unauthorized access`() {
    val mockResponse = MockResponse()
        .setResponseCode(401)
        .setHeader("WWW-Authenticate", "Bearer")
        .setBody("{\"error\": \"Unauthorized access\"}")

    mockWebServer.enqueue(mockResponse)

    val response = apiClient.fetchMessage()
    assertEquals(null, response)
}

エラーシミュレーションのポイント

  • 複数のエラーシナリオをテストし、エラーハンドリングが網羅的にカバーされているか確認する。
  • 遅延やタイムアウトをシミュレーションし、ネットワーク不安定時の挙動をテストする。
  • HTTPステータスコードやレスポンスヘッダーを設定して、認証やリダイレクトのシミュレーションを行う。

モックサーバーを活用することで、現実的なエラーケースをシミュレーションし、堅牢なAPIクライアントを構築できます。

複雑なAPIテストのシナリオ例


複数のAPIエンドポイントを利用するアプリケーションや、状態を持つリクエストの連続呼び出しをテストするには、モックサーバーを使った複雑なシナリオのテストが必要です。ここでは、MockWebServerを活用して複数のAPIリクエストや状態管理をテストする具体例を紹介します。


1. ユーザー認証とデータ取得のシナリオ


このシナリオでは、以下の手順でAPIをテストします:

  1. 認証APIにリクエストを送信し、認証トークンを取得する。
  2. データ取得APIに認証トークンを付与してリクエストを送信し、データを取得する。

APIクライアントの実装例

import okhttp3.*

class ApiClient(private val baseUrl: String) {
    private val client = OkHttpClient()

    fun login(username: String, password: String): String? {
        val requestBody = FormBody.Builder()
            .add("username", username)
            .add("password", password)
            .build()

        val request = Request.Builder()
            .url("$baseUrl/api/login")
            .post(requestBody)
            .build()

        client.newCall(request).execute().use { response ->
            return if (response.isSuccessful) {
                response.body?.string()
            } else {
                null
            }
        }
    }

    fun fetchData(authToken: String): String? {
        val request = Request.Builder()
            .url("$baseUrl/api/data")
            .addHeader("Authorization", "Bearer $authToken")
            .build()

        client.newCall(request).execute().use { response ->
            return if (response.isSuccessful) {
                response.body?.string()
            } else {
                null
            }
        }
    }
}

テストコードの例

import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.Assert.assertEquals

class ApiClientTest {

    private lateinit var mockWebServer: MockWebServer
    private lateinit var apiClient: ApiClient

    @Before
    fun setUp() {
        mockWebServer = MockWebServer()
        mockWebServer.start()
        apiClient = ApiClient(mockWebServer.url("/").toString())
    }

    @After
    fun tearDown() {
        mockWebServer.shutdown()
    }

    @Test
    fun `test login and fetch data`() {
        // モックの認証レスポンス
        val loginResponse = MockResponse()
            .setResponseCode(200)
            .setBody("{\"token\": \"12345\"}")

        // モックのデータ取得レスポンス
        val dataResponse = MockResponse()
            .setResponseCode(200)
            .setBody("{\"data\": \"Hello, Kotlin!\"}")

        // モックサーバーにレスポンスを設定
        mockWebServer.enqueue(loginResponse)
        mockWebServer.enqueue(dataResponse)

        // 認証APIを呼び出してトークンを取得
        val loginResult = apiClient.login("user", "password")
        val token = loginResult?.let { "12345" }

        // データ取得APIを呼び出してデータを取得
        val dataResult = apiClient.fetchData(token ?: "")

        // レスポンスの検証
        assertEquals("{\"data\": \"Hello, Kotlin!\"}", dataResult)
    }
}

2. 複数のリクエストと順序の検証


MockWebServerでは、送信されたリクエストの順序や内容を検証できます。

@Test
fun `test multiple requests in sequence`() {
    // モックレスポンスを連続して設定
    mockWebServer.enqueue(MockResponse().setResponseCode(200).setBody("{\"step\": \"1\"}"))
    mockWebServer.enqueue(MockResponse().setResponseCode(200).setBody("{\"step\": \"2\"}"))
    mockWebServer.enqueue(MockResponse().setResponseCode(200).setBody("{\"step\": \"3\"}"))

    // APIクライアントで連続してリクエストを送信
    val result1 = apiClient.fetchData("token")
    val result2 = apiClient.fetchData("token")
    val result3 = apiClient.fetchData("token")

    // レスポンスの検証
    assertEquals("{\"step\": \"1\"}", result1)
    assertEquals("{\"step\": \"2\"}", result2)
    assertEquals("{\"step\": \"3\"}", result3)

    // リクエストの順序確認
    val request1 = mockWebServer.takeRequest()
    val request2 = mockWebServer.takeRequest()
    val request3 = mockWebServer.takeRequest()

    assertEquals("/api/data", request1.path)
    assertEquals("/api/data", request2.path)
    assertEquals("/api/data", request3.path)
}

複雑なAPIテストのポイント

  • 状態を管理するテストケースを作成し、APIの呼び出し順序や依存関係を確認する。
  • 複数のエンドポイントを組み合わせたシナリオで、アプリの一連の動作を検証する。
  • レスポンス内容とリクエストの順序を検証し、期待通りに動作しているか確認する。

MockWebServerを活用することで、複雑なAPIシナリオのテストを効率的に行い、信頼性の高いアプリケーションを構築できます。

モックサーバーを使う際のベストプラクティス


モックサーバーを効果的に利用するためには、適切な設定や運用方法を理解することが重要です。ここでは、Kotlinでモックサーバー(MockWebServer)を使う際のベストプラクティスを紹介します。


1. テストごとにモックサーバーを初期化する


モックサーバーは、テストごとに初期化し、終了することが推奨されます。これにより、テストケース間の状態が干渉することを防ぎます。

@Before
fun setUp() {
    mockWebServer = MockWebServer()
    mockWebServer.start()
}

@After
fun tearDown() {
    mockWebServer.shutdown()
}

2. レスポンスを柔軟に設定する


複数のテストシナリオをカバーするために、レスポンスを柔軟に設定しましょう。HTTPステータスコード、ヘッダー、ボディを必要に応じて設定できます。

mockWebServer.enqueue(
    MockResponse()
        .setResponseCode(200)
        .setHeader("Content-Type", "application/json")
        .setBody("{\"message\": \"Success\"}")
)

3. 遅延やエラーのシミュレーションを活用する


実際のネットワーク環境を考慮し、遅延エラーのシミュレーションを行いましょう。

mockWebServer.enqueue(
    MockResponse()
        .setResponseCode(500)
        .setBody("{\"error\": \"Internal Server Error\"}")
)

mockWebServer.enqueue(
    MockResponse()
        .setBodyDelay(3, TimeUnit.SECONDS) // 3秒の遅延
        .setBody("{\"message\": \"Delayed Response\"}")
)

4. リクエストの検証を行う


テスト時に、送信されたリクエストの内容や順序を検証することで、APIクライアントの動作を確認できます。

val request = mockWebServer.takeRequest()
assertEquals("/api/data", request.path)
assertEquals("GET", request.method)

5. テストケースをシナリオごとに分ける


正常系、異常系、エッジケースといった異なるシナリオごとにテストケースを分け、網羅的にテストしましょう。

@Test
fun `test successful response`() { ... }

@Test
fun `test 404 error`() { ... }

@Test
fun `test network timeout`() { ... }

6. レスポンスのテンプレート化


複数のテストで同じようなレスポンスを返す場合、レスポンスをテンプレート化して管理すると、コードが整理されます。

fun createMockResponse(body: String, code: Int = 200): MockResponse {
    return MockResponse()
        .setResponseCode(code)
        .setBody(body)
}

7. CI/CDパイプラインに統合する


モックサーバーを用いたテストは、CI/CDパイプラインに組み込むことで、自動で品質を担保できます。常に最新のコードがテストをパスするようにしましょう。


ベストプラクティスのまとめ

  • テストごとにモックサーバーを初期化・終了する
  • 柔軟にレスポンスやエラーを設定する
  • 遅延やエラーのシミュレーションを活用する
  • 送信リクエストを検証する
  • テストケースをシナリオごとに整理する
  • レスポンスをテンプレート化して再利用する
  • CI/CDパイプラインに統合する

これらのベストプラクティスを守ることで、KotlinアプリケーションのREST APIテストが効果的かつ効率的に行えます。

まとめ


本記事では、KotlinでREST APIを安全かつ効率的にテストするためのモックサーバーの活用方法について解説しました。モックサーバーを利用することで、ネットワークやサーバーの依存を排除し、安定したテスト環境を構築できます。

MockWebServerを使った基本的なセットアップ手順から、エラーシミュレーション、複雑なAPIテストシナリオ、そしてベストプラクティスまでを紹介しました。これにより、APIの正常系・異常系の動作確認や、エラーハンドリングのテストを効率的に行うことができます。

モックサーバーを適切に活用し、堅牢で信頼性の高いKotlinアプリケーションを開発しましょう。

コメント

コメントする

目次
  1. REST APIテストの課題とは
    1. 1. ネットワーク依存の問題
    2. 2. APIサーバーの不安定さ
    3. 3. テストデータの一貫性
    4. 4. エラーシミュレーションの難しさ
    5. 5. コストとアクセス制限
  2. モックサーバーとは何か
    1. モックサーバーの基本的な役割
    2. なぜモックサーバーが必要なのか
    3. モックサーバーの使用例
  3. Kotlinで利用可能なモックサーバーライブラリ
    1. 1. MockWebServer
    2. 2. WireMock
    3. 3. MockServer
    4. 4. JSON Server
  4. MockWebServerのセットアップ手順
    1. 1. 依存関係の追加
    2. 2. MockWebServerのインスタンス作成
    3. 3. テスト用のリクエストとレスポンスの設定
    4. 4. MockWebServerの終了処理
    5. 5. 実行結果の確認
  5. MockWebServerを使ったシンプルなテスト例
    1. 1. テスト対象のAPIクライアント
    2. 2. MockWebServerを使用したテストコード
    3. 3. テストの解説
    4. 4. テストの実行結果
  6. モックサーバーでのエラーシミュレーション
    1. 1. 404 Not Found エラーのシミュレーション
    2. 2. 500 Internal Server Error のシミュレーション
    3. 3. タイムアウトのシミュレーション
    4. 4. レスポンスヘッダーのシミュレーション
    5. エラーシミュレーションのポイント
  7. 複雑なAPIテストのシナリオ例
    1. 1. ユーザー認証とデータ取得のシナリオ
    2. APIクライアントの実装例
    3. テストコードの例
    4. 2. 複数のリクエストと順序の検証
    5. 複雑なAPIテストのポイント
  8. モックサーバーを使う際のベストプラクティス
    1. 1. テストごとにモックサーバーを初期化する
    2. 2. レスポンスを柔軟に設定する
    3. 3. 遅延やエラーのシミュレーションを活用する
    4. 4. リクエストの検証を行う
    5. 5. テストケースをシナリオごとに分ける
    6. 6. レスポンスのテンプレート化
    7. 7. CI/CDパイプラインに統合する
    8. ベストプラクティスのまとめ
  9. まとめ