jUnitとrest-assuredを使ってWebAPIをテストする
JSON形式のフォーマットを使うAPIのテストをする必要になったので以下にまとめます。
検証しながらなので間違いもあるかと思います。
必要なもの
- rest-assured
- junit
- dbunit(DBのレコードもテストするなら)
リクエストのの設定
rest-assuredが自動的にリクエストに用いるObjectクラスをJsonに変換してくれます。
今回はJackson2を使っています。
- 以下の順でclasspathの存在を確認してシリアライズが行われます。
- Jackson2
- Jackson
- Gson
ObjectMapperを使うので、その設定と接続先を指定します。
// api接続先ホスト名
RestAssured.baseURI = "http://localhost"
// ObjectMapperの設定
RestAssured.config = RestAssuredConfig.config().objectMapperConfig(
ObjectMapperConfig.objectMapperConfig().jackson2ObjectMapperFactory(new Jackson2ObjectMapperFactory() {
@SuppressWarnings("rawtypes")
@Override
public ObjectMapper create(Class cls, String charset) {
ObjectMapper objectMapper = new ObjectMapper();
// ObjectMapperの設定をここに
return objectMapper;
}
})
);
リクエスト送信
// staticインポート
import static io.restassured.RestAssured.given;
ResponseClass response = given()
.contentType(ContentType.JSON) // content type
.body(reqest) // リクエスト
.when()
.post("/api/hoge/1") // APIのエンドポイントを指定
.then()
.statusCode(200)
.extract().as(ResponseClass.class); // 指定したクラスにデシリアライズ
レスポンスのアサート
junitのアサートを使って想定通りの値が返って来てるか確認します。
Assert.assertThat(response.hoge, is("hoge"));
DbUnitとエクセルを使ってレコード一致確認
DbUnitを使えば現在のDBのレコードとエクセルに書き出したデータを期待値として比較することができます。
また、エクセルファイルにDBのレコードを書き出すことも出来るので便利です。
Connection connection = DriverManager.getConnection(url, username, password)
IDatabaseConnection iDbConnection = new IDatabaseConnection(connection);
// 実行後のデータ
IDataSet dataSet = dbConn.createDataSet();
// 指定したテーブル名のレコードを取得
ITable data= dataSet.getTable("table");
// アサートから除外したいカラムを設定
data = DefaultColumnFilter.excludedColumnsTable(iTable, "created_at");
// カラムを指定してソート
data= new SortedTable(iTable, "hoge_name");
// 期待値データ(エクセル)
ITable 期待値 = new XlsDataSet(new File("hoge/huga/期待値.xls"));
期待値 = DefaultColumnFilter.excludedColumnsTable(iTable, "created_at");
期待値 = new SortedTable(iTable, "hoge_name");
// junitのassertEqualsではなく、DbUnitのAssertion#assertEqualsを使うように気を付けること
Assertion.assertEquals(期待値, data);
型の異なる値をリクエストパラメータに含めたい
- ObjectMapperを使ってリクエストObjectをMapに変換後、jsonのkeyを指定し任意のパラメータをmapにputします。
// リクエストオブジェクトをMAPに変換
RequestObj request = new RequestObj():
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(request);
LinkedHashMap<String, Object> map = objectMapper.readValue(jsonString, new TypeReference<LinkedHashMap<String, Object>>(){});
// 任意のkey:valueを設定
map.put("dinner", "焼肉")
// mapをStringに変換
String jsonString = objectMapper.writeValueAsString(map);
// json文字列をbodyに設定しリクエスト送信
ResponseClass response = given()
.contentType(ContentType.JSON)
.body(jsonString)
.log().body()
.when()
.post(endpoint)
.then()
.log().body()
.statusCode(200)
.extract().as(responseClass);