二、Json Schema Validation—断言ノート

2520 ワード

ディレクトリ:1、アサーション要求結果のフィールド値2、匿名JSONルート検証3、Json Schema Validationアサーションjson構造が仕様を複合するか否か4、rest-assuredを使用しないJson Schema Validation
一、要求結果の断言
次のようなjson列があれば
{
"lotto":{
 "lottoId":5,
 "winning-numbers":[2,45,34,23,7,5,3],
 "winners":[{
   "winnerId":23,
   "numbers":[2,45,34,23,3,5]
 },{
   "winnerId":54,
   "numbers":[52,3,12,11,18,22]
 }]
}
}
      lottoId      5,     :
get("/lotto").then().body("lotto.lottoId", equalTo(5));

    winnerId     23 54:
get("/lotto").then().body("lotto.winners.winnerId", hasItems(23, 54));

  : equalTo   hasItems   Hamcrest matchers   ,         org.hamcrest.Matchers。

二、匿名JSONルートノード検証
JSONファイルにルートノード名が不確定な場合は、$またはスペース文字列をパスとして認識することができ、例えばJSONは以下のようになる.
[1,2,3]

検証方法は次のとおりです.
when().
     get("/json").
then().
     body("$", hasItems(1, 2, 3));

三、json構造が複合規範であるかどうかを断言する
step1:
schemaを生成します.jsonファイルは、classpathに配置されます(ideaならresourcesディレクトリの下に置くことができます).
step2:
pom.xmlファイルの下でmaven依存を追加

   io.rest-assured
   json-schema-validator
   3.0.1


step3: matchesJsonSchemaInClasspath静的インポートio.restassured.module.jsv.JsonSchemaValidatorこのクラスからすべての静的インポートを推奨する方法
step4:
// Given
JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory.newBuilder().setValidationConfiguration(ValidationConfiguration.newBuilder().setDefaultVersion(DRAFTV4).freeze()).freeze();

// When
get("/products").then().assertThat().body(matchesJsonSchemaInClasspath("products-schema.json").using(jsonSchemaFactory));

四、rest-assuredを使用しないJson Schema Validation
rest-assuredに依存せずにjson-schema-validator moduleを使用することもできます.jsonテキストをStringタイプの文字列として表すには、次のようにします.
import org.junit.Test;
import static io.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath;
import static org.hamcrest.MatcherAssert.assertThat;

public class JsonSchemaValidatorWithoutRestAssuredTest {


    @Test 
    public void validates_schema_in_classpath() {
        // Given
        String json = ... // Greeting response

        // Then
        assertThat(json, matchesJsonSchemaInClasspath("greeting-schema.json"));
    }
} ```