#4 : POSTリクエストと複数シナリオのテスト方法【Karateで始めるAPI自動テスト入門】

Java

はじめに

ご覧いただきありがとうございます。API自動テストシリーズ、前回はGETリクエストに対するAPIテストをKarateで行いました。今回はその応用として、POSTメソッドを使ったAPIのリクエストとJSONレスポンスの検証を行っていきます!

APIの追加

まずは、POSTでユーザー情報を受け取るエンドポイントを作成します。
HelloController.java を以下のように修正します。

package com.example.demo;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, API!";
    }

    // 新規POST API
    @PostMapping("/hello")
    public Map<String, Object> helloPost(@RequestBody Map<String, Object> payload) {
        String name = (String) payload.get("name");
        return Map.of(
            "message", "こんにちは、" + name + "さん!",
            "length", name.length()
        );
    }
}

@PostMapping(“/hello”)でPOSTメソッドのAPIエンドポイントを作成しました。
POSTの処理では、リクエストボディからnameを受け取り、メッセージと名前の長さを返します。

KarateのPOSTテストファイル作成

src/test/java/examples に、POST用テストファイルを追加します。

src/
   └── test/
       └── java/
           └── examples/
               ├── HelloTest.feature
               └── HelloPostTest.feature ← 追加
               └── HelloTestRunner.java 
               └── HelloPostTestRunner.java ← 追加
HelloPostTest.teature の作成

作成したHelloPostTest.teatureファイルに以下のテストコードを記載します。

Feature: Test for /hello API POST

Scenario: Send name and receive message
Given url 'http://localhost:8080/hello'
And request { name: 'はなこ' }
When method post
Then status 200
And match response == { message: 'こんにちは、はなこさん!', length: 3 }

このシナリオでは、名前をPOSTで送信し、メッセージと文字数(3文字)が返ってくることを確認しています。

HellPostTestRunner.java の作成

次に、POSTテスト用ランナーを作成していきます。

package examples;

import com.intuit.karate.junit5.Karate;

class HelloTestRunner {


    @Karate.Test
    Karate testHello() {
        return Karate.run("HelloTest").relativeTo(getClass());
    }
}
テストを実行

ではテストを実行していきましょう。APIがSpring Bootで起動している状態で、VSCodeの「▷」アイコンや以下コマンドでテストできます。

./mvnw test -Dtest=HelloPostTestRunner
 実行結果の確認

実行されるとログが表示されるので確認していきます。

実行したHelloPostTestのテストシナリオが、正常に通ったことが分かります。
自動で生成されたkarate-reports/examples.HelloPostTest.htmlのレポートファイルもブラウザで確認してみましょう。

(例:file:/xxxxxx/target/karate-reports/examples.HelloPostTest.html
各ステップごとに詳細が表示されているので、失敗した場合はどこで失敗したかが分かりやすいですね。

Given : テスト対象のURL (http://localhost:8080/hello) を指定
And : リクエストに使う JSON ボディ(例: { name: ‘はなこ’ })を指定
When : POST メソッドを実行
Then : ステータスコード 200 を確認
And : レスポンスボディの内容({ message: ‘こんにちは、はなこさん!’, length: 3 })と一致するか検証

複数シナリオをまとめてテストする

ここまでで、GETとPOSTを個別にテストしてきましたが、複数の.featureファイルを含むテストランナークラスを作成することで、複数のシナリオテストをまとめて実行できます。
AllApiTestRunner.javaを新規に作成して、以下のコードを記載します。

package examples;
import com.intuit.karate.junit5.Karate;

class AllApiTestRunner {

    @Karate.Test
    Karate testAllApis() {
        return Karate.run(
            "HelloTest", // GETのテスト
            "HelloPostTest" // POSTのテスト
        ).relativeTo(getClass());
    }
}

このテストテストランナーで実行し、テストがすべて成功すれば、両方の.featureファイルの結果がコンソールに表示されます。

Karateのレポートファイルkarate-summary.htmlでも、2件のシナリオテストの結果がまとめて表示されています。

まとめ

今回はPOST APIを作りKarateでテストをしてみました。また、GETとPOSTの両方を1つのテストでまとめて実行する方法も紹介しました。複数シナリオを管理できるとテストの幅がも広がってきますね。
次回いよいよ最終回では「同じテスト処理を異なる入力データで何度も繰り返し実行するテスト手法(データドリブン)」にチャレンジします!

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