使用REST-Assured的JSON模式验证

2023/05/09

1. 概述

Rest-Assured库提供对测试REST API的支持,通常采用JSON格式。

有时可能需要在不详细分析响应的情况下首先了解JSON主体是否符合某种JSON格式。

在本快速教程中,我们将了解如何根据预定义的JSON模式验证JSON响应

2. 设置

初始的Rest-Assured设置与我们之前的文章相同。

另外,我们还需要在pom.xml文件中包含json-schema-validator模块:

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>3.3.0</version>
    <scope>test</scope>
</dependency>

为确保你拥有最新版本,请点击此链接

3. JSON模式验证

作为JSON模式,我们将使用保存在名为event_0.json的文件中的JSON,该文件存在于类路径中:

{
    "id": "390",
    "data": {
        "leagueId": 35,
        "homeTeam": "Norway",
        "visitingTeam": "England"
    },
    "odds": [
        {
            "price": "1.30",
            "name": "1"
        },
        {
            "price": "5.25",
            "name": "X"
        }
    ]
}

然后假设这是我们的REST API返回的所有数据后跟的通用格式,然后我们可以检查JSON响应的一致性,如下所示:

@Test
void givenUrl_whenJsonResponseConformsToSchema_thenCorrect() {
	get("/events?id=390")
	    .then()
	    .assertThat()
	    .body(matchesJsonSchemaInClasspath("event_0.json"));
}

请注意,我们仍将从io.restassured.module.jsv.JsonSchemaValidator静态导入matchesJsonSchemaInClasspath。

4. JSON Schema验证设置

4.1 验证响应

Rest-Assured的json-schema-validator模块使我们能够通过定义自己的自定义配置规则来执行细粒度验证。

假设我们希望我们的验证始终使用JSON模式版本4:

@Test
void givenUrl_whenValidatesResponseWithInstanceSettings_thenCorrect() {
	JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory
	    .newBuilder()
	    .setValidationConfiguration(
	        ValidationConfiguration.newBuilder()
	            .setDefaultVersion(SchemaVersion.DRAFTV4)
	            .freeze()).freeze();
	get("/events?id=390")
	    .then()
	    .assertThat()
	    .body(matchesJsonSchemaInClasspath("event_0.json")
	        .using(jsonSchemaFactory));
}

我们将通过使用JsonSchemaFactory并指定版本4 SchemaVersion并断言它在发出请求时使用该模式来执行此操作。

4.2 检查验证

默认情况下,json-schema-validator对JSON响应字符串运行检查验证。这意味着如果模式将odds定义为数组,如以下JSON所示:

{
    "odds": [
        {
            "price": "1.30",
            "name": "1"
        },
        {
            "price": "5.25",
            "name": "X"
        }
    ]
}

那么验证器将始终期望一个数组作为odds的值,因此odds是一个字符串的响应将无法通过验证。因此,如果我们希望对我们的响应不那么严格,我们可以在验证期间通过首先进行以下静态导入来添加自定义规则:

io.restassured.module.jsv.JsonSchemaValidatorSettings.settings;

然后在验证检查设置为false的情况下执行测试:

@Test
void givenUrl_whenValidatesResponseWithStaticSettings_thenCorrect() {
	get("/events?id=390")
	    .then()
	    .assertThat()
	    .body(matchesJsonSchemaInClasspath("event_0.json")
	        .using(settings()
	            .with()
	            .checkedValidation(false)));
}

4.3 全局验证配置

这些自定义非常灵活,但是对于大量的测试,我们必须为每个测试定义一个验证,这很麻烦而且不太容易维护。

为了避免这种情况,我们可以自由地只定义一次配置并将其应用于所有测试

我们将验证配置为未选中并始终针对JSON模式版本3使用它:

JsonSchemaFactory factory = JsonSchemaFactory.newBuilder()
    .setValidationConfiguration(ValidationConfiguration.newBuilder()
                                .setDefaultVersion(SchemaVersion.DRAFTV3)
                                .freeze())
    .freeze();
JsonSchemaValidator.settings = settings()
    .with().jsonSchemaFactory(factory)
    .and()
    .with().checkedValidation(false);

然后,要删除此配置,请调用reset方法:

JsonSchemaValidator.reset();

5. 总结

在本文中,我们展示了如何在使用Rest-Assured时根据模式验证JSON响应。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章