#5 :複数パターンを一括テストするデータドリブンテストの方法【Karateで始めるAPI自動テスト入門】

Java

はじめに

こんにちは!Karateで始めるAPI自動テストシリーズもいよいよ最終回です。前回は、POSTで名前を送るAPIとそのテスト方法を紹介しました。今回はJSONファイルで複数の入力パターンを一括でテストする「データドリブンテスト」に挑戦します。

データドリブンテストとは?

データドリブンテスト(Data-Driven Testing)とは、複数の入力データを使って同じテストシナリオを繰り返し実行するテスト手法です。

たとえば「社員IDを指定して対応する社員名を取得するAPI」がある場合、1つのテストで「1」「2」「999」などさまざまなIDを使って一気に検証できます。

特徴とメリット

・テストの網羅性が上がる:1ケースずつ書かず、パターンを増やせる
・コードの再利用性が高い:シナリオは1つでデータだけ変更すればOK
・メンテナンスが楽:CSVやJSONにデータをまとめることでテスト追加や削除も容易

今回は新たに、社員IDを指定して名前を取得するGET APIを追加し、JSONからテストデータを読み込んで複数パターンをテストします。存在しないIDを指定した場合など、エラーが返るパターン(失敗ケース)も含めて検証していきましょう!

【実践】複数の入力データを使ったテストに挑戦しよう

構成

src
├── test
│  ├── java
│  │  └── examples
│  │  ├── EmployeeGetTestRunner.java ←追加
│  │  └── EmployeeGetTest.feature ←追加
│  └── resources ← 作成
│    └── examples 
│      └── employee-test-data.json ← 追加

1.社員検索APIを作成

まずはテスト対象のAPIを用意します。社員IDを受け取り、該当する社員名を返すエンドポイントを作成します。

src/main/java/com/example/demo/EmployeeController.java

package com.example.demo;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
public class EmployeeController {

    @GetMapping("/employee/{id}")
    public ResponseEntity<?> getEmployee(@PathVariable int id) {
        Map<Integer, String> data = Map.of(1, "山田太郎", 2, "高橋花子", 3, "鈴木二郎");
        if (data.containsKey(id)) {
            return ResponseEntity.ok(Map.of("id", id, "name", data.get(id)));
        } else {
            return ResponseEntity.status(HttpStatus.NOT_FOUND)
                    .body(Map.of("message", "社員IDが見つかりません"));
        }
    }
}

存在するID(1〜3)には200で社員情報を返し、それ以外は404とエラーメッセージを返す仕様です。

2.テストシナリオを作成

Karateのテストファイルを作ります。JSONからID、ステータス、レスポンスを読み込み、それに応じたテストを繰り返します。

src/test/java/examples/EmployeeGetTest.feature

Feature: Test GET /employee/{id} with JSON data

Scenario Outline: Get employee info by ID
Given url 'http://localhost:8080/employee/' + id
When method get
Then status <expectedStatus>
And match response == expectedResponse

Examples:
| read('classpath:examples/employee-test-data.json') |

JSONから id, expectedStatus, expectedResponse を読み込み、繰り返し実行します。

3.JSONでテストデータを用意

src/test 配下に新たに resources/examples/ディレクトリを作成し、テストデータを記載したjsonを追加します。

src/test/resources/examples/employee-test-data.json

[
  {
    "id": 1,
    "expectedStatus": 200,
    "expectedResponse": { "id": 1, "name": "山田太郎" }
  },
  {
    "id": 2,
    "expectedStatus": 200,
    "expectedResponse": { "id": 2, "name": "高橋花子" }
  },
  {
    "id": 999,
    "expectedStatus": 404,
    "expectedResponse": { "message": "社員IDが見つかりません" }
  },
  {
    "id": 3,
    "expectedStatus": 200,
    "expectedResponse": { "id": 3, "name": "鈴木じろう" }
  },
  {
    "id": 1000,
    "expectedStatus": 200,
    "expectedResponse": { "id": 1000, "name": "不明" }
  }
]

存在するIDと存在しないIDのケースを両方テストし、さらに、期待値と実際のレスポンスを意図的にズラすことで失敗するテストケースも再現できます。この場合3件成功、2件失敗となりますね。

4.テストランナーを作成

KarateのFeatureファイルを呼び出すためのランナーを作ります。

src/test/java/examples/EmployeeGetTestRunner.java

package examples;

import com.intuit.karate.junit5.Karate;

public class EmployeeGetTestRunner {
    @Karate.Test
    Karate testEmployee() {
        return Karate.run("EmployeeGetTest").relativeTo(getClass());
    }
}

5.テスト実行&結果確認

では、VSCodeの「▷」アイコンまたは以下コマンドでテストを実行します。

./mvnw test -Dtest=EmployeeGetTestRunner

すべてのパターンが一括で実行され、レポートにもまとめて表示されます。

実行結果の確認

ログが表示されるので、想定した結果になっているか確認していきましょう。

実行した5件のテストシナリオのうち3件成功、2件失敗していることが分かります。想定通りですね!Karateのレポートファイルもブラウザで確認してみましょう。

(例:file:/xxxxxx/target/karate-reports/examples.EmployeeGetTest.html
緑が3、赤が2になっており、それぞれ詳細にどこでエラーになったかも確認できます。シナリオ4件目ではAnd match response == expectedResponseレスポンスの内容がテストデータの期待値と一致しなかったことを示しています。
また、シナリオ5件目のThen status 200のエラーではテストデータで期待されたステータスコードと実際のレスポンスが一致しなかったことを示しています。

見た目で直感的にわかるのでテスト結果を確認するのにも便利ですね~

まとめ

今回は、JSONからテストデータを読み込む形でデータドリブンテストを実施しました。外部ファイルから読み込むと複数のテストケースの管理も楽になりますね。

Karateで始めるAPI自動テストシリーズを通してSpringBootやKarateを使ってきましたがいかがだったでしょうか?開発の効率UPにこのシリーズが役立つとうれしいです!

タイトルとURLをコピーしました