はじめに
ご覧いただきありがとうございます。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のレポートファイルもブラウザで確認してみましょう。
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つのテストでまとめて実行する方法も紹介しました。複数シナリオを管理できるとテストの幅がも広がってきますね。
次回いよいよ最終回では「同じテスト処理を異なる入力データで何度も繰り返し実行するテスト手法(データドリブン)」にチャレンジします!





