• 12
  • 12
分享
  • 自动化脚本实现Json Schema验证——软件测试圈
  • 曼倩诙谐 2021-04-25 10:04:33 字数 3294 阅读 1798 收藏 12

  应用场景

  测试场景中,我们会先做一些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配置(这里介绍的清楚一些,有时就是因为配置没设好,脚本就是运行不起来)。

1-1.png

1-2.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,不要忘了等下把这里改写好哦)。

1-3.png

  reqSpec 变量化

1-4.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效果一样。

  这种方法就是简单、方便、直观。麻烦的一点是测试用例多的时候,参数或有了新的变更,每个用例都必须要重复地改写。

  这里强调一下我自己的观点:测试的目的是确保相关的功能被检验过且没有缺陷。至于你是用怎样的方法检验的,在技术上没必要钻牛角尖,你怎么写都可以,只要目的达到了。每一种写法都存在优缺点,千万不要因为技术让测试本源本末倒置了。

1-5.png

  JSON Schema 准备

  本示例中使用的 JSON schema版本7。

  1. 复制示例中用的 Request API 的get()路径,然后粘贴到你的浏览器并打开它。

  此时你会得到开放数据返回的当天气温状况以JSON 格式。

1-6.png

  2. 复制返回的JSON文件,打开Jsonschmea 生成器在浏览器中(https://extendsclass.com/json-schema-validator.html)。

  粘贴复制的JSON文件到左边的文本框里,然后点击 Generate Schema From JSON按钮,右边的文本框里就会自动生成以draft-07的schme文件。

1-7.png

  3. 复制生成的Schema 文件,新建一个.json文件在测试项目的src>test>resources>的路径下。

  注意,这里的路径一定要用对。然后将复制的schema文件内容粘贴到新建的.json文件里,保存一下文件。

1-8.png

  现在,我们的 schema 文件就准备好了。

  注意,真实的环境下一定要用正确Json的文件生成 Schema文件,示例中因为我们不知道需求,就只有把结果当做需求规则了。

  验证规则匹配

  通过阅读公开的开发文档,我们只知道返回的日期格式规定如下表所示。但是有些数据我们并不知道返回是小数,或是整数?有哪些字段是必需的,为此我们不可能使用多个schmea文件,况且这里并没有规则什么时候返回小数,什么时候返回整数?

1-9.png

1-10.png

1-11.png

  在生成的schema文档中,显示的是源数据(即生成schema时用的Json文件中的数据)。

  如上述,实际测试中这些数据是会变更的。这时如果用这个生成的规则与返回的真实数据相对比就会出错。

  不用担心:我们可以改写一些验证规则让这个schema 工作起来更有效。

  1. 必需字段验证

  如下图:required 的部份,这里就根据上面提到的公开文档中说明定义成是必需的。换句话说,就是在与真实返回的JSON对比时,这些信息是一定要出现的,否则就认为返回的数据不正确。定位是root根结点下 。

1-12.png

  子节点 root /metadata 的必需项 :

1-13.png

  2. 使用正则表达式验证不确定返回值

  比如下图pattern定义root/items/items/readings/items/value字段的数据可以是小数,也可以是整数。

  这里返回的JSON内容只要是其中任何一个值就不会出错,否则验证就通不过。

1-14.png

1-15.png

  脚本运行

  1. 运行在IDE

  右键点击测试用例方法,在弹出的菜单列表中点击Run测试用例方法名。收割的时候到了,快看一下结果吧。

1-16.png

  2. 运行MVN

  在控制台的路径下中执行命令mvn test, 可以看到返回结果测试通过。

1-17.png

  结语

  希望这篇文章对大家有所帮助,这也是我的愿望了。对于验证这一部分,希望大家灵活运用正则表达式来实现真实测试场景中的需求。想一下,上面提到的日期格式的规则应该怎样写呢?

  欢迎小伙伴们留言分享你们的学习,大家共同进步。


作者:胡军英   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 软件测试人员只有一个梦想,那就是尽可能多的找到错误,但应该记住的是找到错误,可以帮助使任何软件更可用和更高的质量。如果测试人员在开始测试之前记住了一些重要的要点,则应用测试不是火箭科学。在本文中,我们将在开始实际测试任何应用程序之前,先看看软件测试技巧和技巧。所有这些技巧都来自多年的经验,所以他们是非常有效的,如果用于实践。测试任何应用程序的提示和技巧:1、有效的测试用例:首先是提供有效的测试用例,而不是更多的测试用例。有效的测试用例是找到缺陷的最有可能的测试用例。在编写测试用例或进行自我检查时,测试者必须通过参考需求文档来关注测试的有效性,并了解哪些功能可能出错。2、了解完整的应用程序:当测...
            0 0 1413
            分享
          •   很多小伙伴在了解到软件测试这个行业之后,都免不了在各个平台上进行了解。但是在了解到性能测试之后,都开始一头雾水。在软件测试中,性能测试是一个非常重要的阶段,所以很多学生不太了解性能测试包括什么。  下面小编将分析性能测试包括哪些内容:性能测试主要分为哪些类别?  1.负载测试:  模拟实际软件系统的负载条件,通过连续加载或其他加载方式找出性能指标变化的拐点。检查系统的行为和特性,发现系统可能存在的性能问题,估计系统的一般性能指标(并发数)。  2.压力测试:  模拟一定负载条件下的长期运行,软件系统能否正常运行.稳定运行,系统性能指标是否在预期范围内。它还可以测试系统是否具有良好的容错能力...
            0 0 264
            分享
          • postman一个入门比较简单的接口测试工具。本人在之前没有接触过接口测试工具,也没有做过接口测试。在今年3月份开始,由于项目中需要进行接口测试,所以postman接口测试是在项目实践中学习和研究的。本次记录主要对学过的知识和工具进行一个记录和总结,加强接口测试方面的知识,相当于一个阶段性的总结。postman是接口测试入门比较简单的接口测试工具。使用postman可以进行功能上的接口测试。下载安装比较简单,其中有两种安装方式,一种是直接从官网下载安装,一种是在chrome上下载安装插件。本次建议从官网上下载安装。接口测试是测试系统组件间接口的一种测试,主要测试内容包括检查数据的交换、传递和控...
            0 0 1366
            分享
          • 读者提问:免费好用的在线身份证号码生成工具,有推荐的吗 ?阿常回答:有,这 3 款在线身份证号码生成工具,推荐使用 !1、随机身份证号码生成包含功能:设置出生地、出生日期、性别、生成个数。官网地址:http://sfz.uzuzuz.com2、随机身份证号码生成包含功能:设置出生地、出生日期、性别、生成个数。官网地址:http://www.chineseidcard.com3、在线身份证号码生成器包含功能:设置生成个数(无需设置出生地、出生日期、性别,直接生成身份证号码)。官网地址:https://www.suijidaquan.com/shenfenzheng阿常碎碎念:平时的测试...
            0 0 34626
            分享
          • 使用python3.6编写一个单元测试demo,例如:对学生Student类编写一个简单的单元测试。1、编写Student类:#!/usr/bin/env python3 # -*- coding: utf-8 -*-   class Student(object):   def __init__(self,name,score): self.name = name self.score = score def get_grade(self): if&nb...
            1 1 1440
            分享
      • 51testing软件测试圈微信