自动化脚本实现Json Schema验证
应用场景 测试场景中,我们会先做一些SMOKE测试,以便先了解一下基本的测试是否通过,如在API测试中,先验证返回的Json文件一样,在没有具体到细节时,我们会先了解返回的Json文件是否符合正确的Json格式,以及某次字段数据类型、格式是不是和预先定义的相匹配。今天就介绍一下Rest-Assured支持的Json schema-validator一次验证整个回应的Json文件。
测试框架: Java + Rest-Assured
语言: Java
IDE: Intellij IDEA
项目类型: Maven
公共API 地址:
https://api.data.gov.sg/v1/environment/air-temperature?date=2020-01-02
公共API开发文档:
https://data.gov.sg/dataset/realtime-weather-readings?resource_id=5dcf8aa5-cf6a-44e4-b359-1173eecfdf4c
Rest-Assured 项目配置
为了能让跟着步骤操作的小伙伴们真正地运行起代码来,所以下面是有关配置的操作(注:如您已经熟悉这些配置,可以跳过)。
1. 创建一个新的Maven项目。
2. POM Dependency配置(这里介绍的清楚一些,有时就是因为配置没设好,脚本就是运行不起来)。
http://www.51testing.com/attachments/2021/04/15326825_202104021541581X1lo.png
http://www.51testing.com/attachments/2021/04/15326825_202104021541582Wkgg.png
创建测试用例
1. 创建测试脚本
如下图,这段测试脚本最后一段验证代码就是对返回的Json文件进行的格式验证。
2. 下面详细讲解一下每段代码的含义
given()-可以看作是测试之前的准备,比如API的path、header、query parameter。
spec(reqSpec)-这里我把所有应该request API的信息写成一个变量,模块化之后方便应用于改变或添加不一样的参数,而应用于多种测试功能。
log().uri()-是打印出当前测试的request API完整的URL。
expect().contentType(ContentType.JSON). and().statusCode(200)-此处是期待当Request API得到回应后,内容是以JSON格式返回,响应代码是200。
when().get().then()...-就是真正地发出请求 (get)request API。
assertThat().body(JsonSchemaValidator.matchesJsonSchemaInClasspath("schema-drf7.json"))-对返回的JSON文件进行预定义的规则验证 (schema-drf7.json 验证规则文件,下个小节中介绍的Schema,不要忘了等下把这里改写好哦)。
http://www.51testing.com/attachments/2021/04/15326825_202104021541583mZxu.png
reqSpec 变量化
http://www.51testing.com/attachments/2021/04/15326825_202104021541584s5nd.png
1. 变量reqSpec是RequestSpecification类型。
这是Rest-Assured 内置的一个类,我们可以直接使用。
2. 在setup 方法里,我们给reqSpec 指定了Request API 的基本URI以及需要的参数。
.queryParam(), .basePath() 这两个 Rest-Assured 内置的方法,为的就是自由灵活添加 reqesut API 的参数。
3. 分解一下get() 请求
URI: https://api.data.gov.sg/v1/environment/
Path Parameter: air-temperature
Query Parameter: date=2021-03-08
测试中真正发出的 get() 请求完整路径:https://api.data.gov.sg/v1/environment/air-temperature?date=2021-03-08
注意:路径中连接符号?或&,当使用Rest-Assured内置类或参数时会自动识别添加。
4. 注释reqSpec(进一步讲解 reqSpec的用处,如果初学者不太明白,就按下面的代码写测试用例)。
下面的代码中注释了 reqSpec, 直接使用.baaseUri().basePath().queryParam().queryParam()在测试用例中,这样和使用reqSpec效果一样。
这种方法就是简单、方便、直观。麻烦的一点是测试用例多的时候,参数或有了新的变更,每个用例都必须要重复地改写。
这里强调一下我自己的观点:测试的目的是确保相关的功能被检验过且没有缺陷。至于你是用怎样的方法检验的,在技术上没必要钻牛角尖,你怎么写都可以,只要目的达到了。每一种写法都存在优缺点,千万不要因为技术让测试本源本末倒置了。
http://www.51testing.com/attachments/2021/04/15326825_2021040215415859RNZ.png
JSON Schema 准备
本示例中使用的 JSON schema版本7。
1. 复制示例中用的 Request API 的get()路径,然后粘贴到你的浏览器并打开它。
此时你会得到开放数据返回的当天气温状况以JSON 格式。
http://www.51testing.com/attachments/2021/04/15326825_20210402154158627iF.png
2. 复制返回的JSON文件,打开Jsonschmea 生成器在浏览器中(https://extendsclass.com/json-schema-validator.html)。
粘贴复制的JSON文件到左边的文本框里,然后点击 Generate Schema From JSON按钮,右边的文本框里就会自动生成以draft-07的schme文件。
http://www.51testing.com/attachments/2021/04/15326825_202104021541587R0RF.png
3. 复制生成的Schema 文件,新建一个.json文件在测试项目的src>test>resources>的路径下。
注意,这里的路径一定要用对。然后将复制的schema文件内容粘贴到新建的.json文件里,保存一下文件。
http://www.51testing.com/attachments/2021/04/15326825_202104021541588Tje0.png
现在,我们的 schema 文件就准备好了。
注意,真实的环境下一定要用正确Json的文件生成 Schema文件,示例中因为我们不知道需求,就只有把结果当做需求规则了。
验证规则匹配
通过阅读公开的开发文档,我们只知道返回的日期格式规定如下表所示。但是有些数据我们并不知道返回是小数,或是整数?有哪些字段是必需的,为此我们不可能使用多个schmea文件,况且这里并没有规则什么时候返回小数,什么时候返回整数?
http://www.51testing.com/attachments/2021/04/15326825_202104021541589We5a.png
http://www.51testing.com/attachments/2021/04/15326825_2021040215415810CvAq.png
http://www.51testing.com/attachments/2021/04/15326825_2021040215415811U1Ga.png
在生成的schema文档中,显示的是源数据(即生成schema时用的Json文件中的数据)。
如上述,实际测试中这些数据是会变更的。这时如果用这个生成的规则与返回的真实数据相对比就会出错。
不用担心:我们可以改写一些验证规则让这个schema 工作起来更有效。
1. 必需字段验证
如下图:required 的部份,这里就根据上面提到的公开文档中说明定义成是必需的。换句话说,就是在与真实返回的JSON对比时,这些信息是一定要出现的,否则就认为返回的数据不正确。定位是root根结点下 。
http://www.51testing.com/attachments/2021/04/15326825_2021040215415812lMYK.png
子节点 root /metadata 的必需项 :
http://www.51testing.com/attachments/2021/04/15326825_2021040215415813Hxl9.png
2. 使用正则表达式验证不确定返回值
比如下图pattern定义root/items/items/readings/items/value字段的数据可以是小数,也可以是整数。
这里返回的JSON内容只要是其中任何一个值就不会出错,否则验证就通不过。
http://www.51testing.com/attachments/2021/04/15326825_2021040215415814hnMC.png
http://www.51testing.com/attachments/2021/04/15326825_2021040215415815FIVj.png
脚本运行
1. 运行在IDE
右键点击测试用例方法,在弹出的菜单列表中点击Run测试用例方法名。收割的时候到了,快看一下结果吧。
http://www.51testing.com/attachments/2021/04/15326825_2021040215415816RzrF.png
2. 运行MVN
在控制台的路径下中执行命令mvn test, 可以看到返回结果测试通过。
http://www.51testing.com/attachments/2021/04/15326825_2021040215415817ysg6.png
结语
希望这篇文章对大家有所帮助,这也是我的愿望了。对于验证这一部分,希望大家灵活运用正则表达式来实现真实测试场景中的需求。想一下,上面提到的日期格式的规则应该怎样写呢?
欢迎小伙伴们留言分享你们的学习,大家共同进步。
页:
[1]