8
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

junitでWebAPIをテスト

Last updated at Posted at 2017-08-24

jUnitとrest-assuredを使ってWebAPIをテストする

JSON形式のフォーマットを使うAPIのテストをする必要になったので以下にまとめます。
検証しながらなので間違いもあるかと思います。

必要なもの

  • rest-assured
  • junit
  • dbunit(DBのレコードもテストするなら)

リクエストのの設定

rest-assuredが自動的にリクエストに用いるObjectクラスをJsonに変換してくれます。
今回はJackson2を使っています。

  • 以下の順でclasspathの存在を確認してシリアライズが行われます。
  1. Jackson2
  2. Jackson
  3. 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);

8
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?