在做接口测试的时候, 我们需要对返回的数据进行分析校验, 一般返回的都是json格式的数据, 怎么来解析校验呢? 之前有看过使用递归遍历json数据的, 然后找到了jsonpath, 可以很方便的对json数据进行解析分析。

jsonpath

jsonpath是一种信息抽取类库, 是从json文档中抽取指定信息的工具 
jsonpath对于json来说, 相当于xpath对于xml

[官方文档地址](‘http://goessner.net/articles/JsonPath‘)

jsonpath和xpath语法对比

json结构信息, 可读性高, 复杂度低, 非常容易匹配, 下表对应了xpath的用法

xpath jsonpath 描述
/ $ 根节点
. @ 现行节点
/ .or[] 取子节点
.. n/a 父元素
// .. 递归下降,所有符合条件的
* * 通配符, 表示所有元素
@ n/a 属性访问字符
[] [] 子元素操作符
  [,] 数组索引
n/a [start:end:step] 数组分割
[] ?() 应用过滤表达式

jsonpath例子


“store”: { 
“book”: [ 

“category”: “reference”, 
“author”: “Nigel Rees”, 
“title”: “Sayings of the Century”, 
“price”: 8.95 
}, 

“category”: “fiction”, 
“author”: “Evelyn Waugh”, 
“title”: “Sword of Honour”, 
“price”: 12.99 
}, 

“category”: “fiction”, 
“author”: “Herman Melville”, 
“title”: “Moby Dick”, 
“isbn”: “0-553-21311-3”, 
“price”: 8.99 
}, 

“category”: “fiction”, 
“author”: “J. R. R. Tolkien”, 
“title”: “The Lord of the Rings”, 
“isbn”: “0-395-19395-8”, 
“price”: 22.99 

], 
“bicycle”: { 
“color”: “red”, 
“price”: 19.95 

}, 
“expensive”: 10 
}

有这样一个json数据

XPath JSONPath 结果
/store/book/author $.store.book[*].author 所有书的作者
//author $..author 所有的作者
/store/* $.store.* store的所有元素。所有的bookst和bicycle
/store//price $.store..price store里面所有东西的price
//book[3] $..book[2] 第三个书
//book[last()] $..book[(@.length-1)] 最后一本书
//book[position()<3] ..book[:2] 前面的两本书
//book[isbn] $..book[?(@.isbn)] 过滤出所有的包含isbn的书
//book[price<10] $..book[?(@.price<10)] 过滤出价格低于10的书。
//* $..* 所有元素。
 
 

那么如何利用jsonpath进行接口测试?

 
通常我们校验接口有这样几种:
1. 判断字段值与预期是否相等
2.判断是否包含某字段
3.判断数据数量是否正确
4.判断数据格式
 
如果是数据格式校验, 个人认为可以用jsonschema, 既然要做到整体数据格式校验层了就应该做的完善了。后面会记录下如何用jsonschema来进行数据格式校验。
 
利用jsonschema对返回数据做整体校验(数据结构, 数据类型, 数据value等):  https://www.cnblogs.com/dreamyu/p/9317721.html
 
import requests
import jsonpath CHECK_TYPE = (
'equal',
'contains',
'data_size',
'data_type',
)
url = "http://www.lagou.com/lbs/getAllCitySearchLabels.json"
data1 = requests.get(url)
print(data1.json()) citylist = jsonpath.jsonpath(data1.json(), "$..[?(@.name=='安庆')]")
print(citylist)

# 例如我们要校验 parentId是否等于 541
check_dic = {
'key': 'parentId',
'check_type': 'equal',
'value': 541
} # 在jsonpath中它是去找到所有符合path规则的数据, 会以list的形式返回,所以判断是否相等和是否包含其实是一样的, 只要在json中找到 key=value就会返回数据
def check_json(dic, data): if dic['key'] and dic['check_type']:
key = dic['key']
check_type = dic['check_type'] if check_type == 'data_size':
expo = '$..%s' % key
json_data = jsonpath.jsonpath(data.json(), expo)
print('data_size: ' + str(len(json_data[0])))
return json_data = get_json(dic, data)
if json_data:
print('pass')
print(json_data)
else:
print('false')
else:
print('check_dic有问题') def get_json(dic, data): # 判断value是int 还是str
if isinstance(dic['value'], int):
expo = "$..[?(@.%s==%s)]" % (dic['key'], dic['value'])
elif isinstance(dic['value'], str):
expo = "$..[?(@.%s=='%s')]" % (dic['key'], dic['value']) json_data = jsonpath.jsonpath(data.json(), expo)
return json_data check_json(check_dic, data1)

jsonpath对json数据进行分析校验做接口测试的更多相关文章

  1. FastJson和Gson和Json数据解析分析和用法

    首先分析下目前号称最快的FastJson,这个是所有人都验证过的,解析速度确实比较快,不过也需要根据数据量来看,数据量小的时候,Gson性能要稍微优于FastJson,但在数据量大解析的情况下,Fas ...

  2. swift http请求返回json数据和分析

    1 AppDelegate.swift // // AppDelegate.swift // QQDemo // // Created by 赵超 on 14-6-21. // Copyright ( ...

  3. (数据科学学习手札125)在Python中操纵json数据的最佳方式

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常使用Python的过程中,我们经常会 ...

  4. 使用TSQL查询和更新 JSON 数据

    JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...

  5. 使用Gson解析复杂的json数据

    Gson解析复杂的json数据 最近在给公司做一个直播APK的项目,主要就是通过解析网络服务器上的json数据,然后将频道地址下载下来再调用Android的播放器进行播放,原先本来打算使用普通的jso ...

  6. 用JQuery解析获取JSON数据

    JSON 是一种比较方便的数据形式,下面使用$.getJSON方法,实现获得JSON数据和解析,都挺方便简单的.从http://api.flickr.com/services/feeds/photos ...

  7. 使用postman做接口测试(一)

    参考大神的总结:https://www.cnblogs.com/Skyyj/p/6856728.html 一,先了解一下基础知识,虽然工作中没什么卵用,但背会了,可以显摆自己很专业的样子,以下内容来自 ...

  8. Python | JSON 数据解析(Json & JsonPath)

    一.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一 ...

  9. python中jsonpath模块,解析多层嵌套的json数据

    1. jsonpath介绍用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, ...

随机推荐

  1. 走进windows编程的世界-----消息处理函数(3)

    二 定时器消息 1 定时器消息 WM_TIMER   依照定时器设置时间段,自己主动向窗体发送一个定时器消息WM_TIMER. 优先级比較低.   定时器精度比較低,毫秒级别.消息产生时间也精度比較低 ...

  2. python 读写数据

    开源标准数据集 —— mnist(手写字符识别) 下载地址:mnist.pkl.gz 1. 使用 python 读取和解析 mnist.pkl.gz import pickle import gzip ...

  3. MySQL 用户与权限管理

    MySQL权限系统的主要功能是证实连接到一台给定主机的用户,而且赋予该用户在数据库上的相关DML,DQL权限.MySQL存取控制包括2个阶段,一是server检查是否同意你连接:二是假定你能连接,se ...

  4. opencv--python--anaconda----contrib 安装

    https://pypi.python.org/pypi/opencv-python/3.4.0.12 https://pypi.python.org/pypi?%3Aaction=search&am ...

  5. Active Directory的基本概念

    前言 本文是面对准备加入Active Directory编程的初学者的一份文章,主要是讲解Active Directory(活动目录)的一些概念和相关知识.这篇文章本来是不想写下来的,因为概念性内容的 ...

  6. php7.0 出现 curl_setopt(): Disabling safe uploads is no longer supported in 报错!

    项目换成php7.0,进行了测试,使用curl时,出现: curl_setopt(): Disabling safe uploads is no longer supported in xxx.定位到 ...

  7. PHP性能之语言性能优化说明

    PHP语言性能优化优化啥? 如下图所示,PHP直接执行的是opcode,所以我们尽量减少扫描和转码解析. 这是我们第一个优化点,尽量使用PHP内置的函数代替我们的代码来实现同样的功能. 和我们自己写的 ...

  8. 产生n个数全排列的算法

    给定n个数{1...n},如何给出这n个数的全排列呢? 给定一个整数k,我们给它一个向左或向右的方向,k(->)或者k(<-),我们说k是可以移动的,如果它的方向指向一个相邻的比它小的数, ...

  9. mysql解压版安装和卸载

    问题1:发生系统错误 5. 解决:使用管理员身份安装即可 问题2:发生系统错误 2. 解决:cd C:\Program Files\MySQL\MySQL Server 5.6\bin 进入mysql ...

  10. JVM调优- 学习笔记(转)

    http://blog.csdn.net/fenglibing/article/details/6321453 GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就 ...