上一篇写了如何从DB获取预期、实际结果,这一篇分别对不同情况说下怎么进行对比。

PS:这部分在JSON对比中也适用。

1、结果只有一张表,只有一条数据

数据格式:因为返回的是dicts_list的格式,因此一条数据时,格式为[dict],可以通过list[0]的方式取到dict,也可以for循环遍历list取dict。

预期结果:id_预期 + 录入的数据 + 代码自动生成的:如createtime

实际结果:id_实际 + 录入的数据 + 代码自动生成的:如createtime

很显然,录入的数据部分是要校验的内容,那么在实现上可以有两种思路:

PS:下面dict1、dict2假设为取到的预期、实际结果

1)新建两个dict,要校验哪些字段,分别从预期结果、实际结果中取那些字段,分别塞入两个dict中,然后进行校验

图3

图4

PS:dict是无序的,因此上面图中dict4故意先把key2放前面,但dict3和dict4还是相等的。

2)把多余的字段从预期结果、实际结果中移除,然后对比剩下的值

图5

这里我们先通过Copy Dictionary复制一下dict1、2,不去动原dict,然后移除dict3、4中的id、createtime,然后做对比,看一下结果

图6

上面展示了数据一致的情况,我们改一下数据,看一下数据不同时,脚本的提示,先改掉预期结果中key2对应的value

图7

执行结果如下图,可以看到问题定位很清晰

图8

2、结果只有一张表,多条数据,容易排序

数据格式:因为返回的是dicts_list的格式,因为是可以排序的,所以预期、实际结果的数据顺序可以一致,假设都为[dict1,dict2……]

先仿照下结果:

图9

图10

其中dict部分同单条数据,也是要校验其中录入的数据部分。

分别处理预期、实际结果中的dict,处理思路同单条数据,这里只拿一种来说明

图11

结果如下

图12

断言,因为是list,所以可以用Lists Should Be Equal

图13

数据一致,case执行通过

图14

我们也一样改一下数据,看下遇到不一致时的提示,先给实际结果加一条数据,即实际数据比预期数据多一条

图15

结果如下图,提示还是比较清楚

图16

再试下一样的条数,但是其中数据不一致的情况,如下图,把dict实际_2的key2的值改成了test3

图17

执行结果如下图,发现提示了错误,但是提示定位不够清晰,可以想象,如果字段数到了10几,20几,就很难找到哪里错了。如果可以像1中,提示具体是哪个字段错就比较好了。

图18

我们修改下判断,先分别获取两个list的长度,判断长度是否一致,然后在for循环遍历list,对dict进行判断

图19

结果如下图,发现成功定位了哪个字段不同,但是又有个问题,看不出来是哪条数据的这个字段不等

图20

在断言前面,加个index的log看下

图21

结果如下,定位比较清晰了

图22

3、结果只有一张表,多条数据,数据乱序,难排序,但是可以获取到他们id间的关联关系

先构造下场景,如下图,预期_1的数据对应实际_2,预期_2的数据对应实际_1,他们之间通过id关联

图23

1)依然考虑排序

因为list是有序的,因此用2中的方法,执行后报如下错

图24

我们做下调整(下面实现方法比较笨,如果有好的方法,请大佬们指教)

先把预期、实际结果改成{id1:dict1,id2:dict2……}格式的dict

图25

结果如下图

图26

然后根据预期、实际结果的关联关系,即${dict_预期_实际_关联},对数据做下排序

图27

排序后则判断方式同2,结果如下

图28

2)不考虑排序

for循环遍历其中一个list,若值在另一个list中,则两个list都移除该值,则两个list留下的都是对方没有的值。

图29

两个list有值不等时,结果如下

图30

4、多表多数据,这里就不细分不能排序的场景了,同3,当做全部都是正常排序

1)第一种方式:分别对各张表对比,则同1、2、3

2)第二种方式:把所有数据组成复杂json,一起判断(多层json嵌套,递归的方式详细判断完整json,该方式也适合接口返回的json串全量判断),考虑内容有点多,再分一篇写。

上一篇  8、大型项目的接口自动化实践记录----DB分别获取预期结果、实际结果

下一篇  9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等

9-1、大型项目的接口自动化实践记录----数据库结果、JSON对比的更多相关文章

  1. 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等

    1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...

  2. 8、大型项目的接口自动化实践记录----DB分别获取预期结果、实际结果

    上一篇实现数据分离升级版--从DB获取数据,以及对应的请求实现,作为一个case,还缺少了预期结果与实际结果的获取及对比.因为前面的文章已经说过接口返回值的获取及对比,所以这篇不说这块了,这篇说一下D ...

  3. 3、大型项目的接口自动化实践记录----开放API练习

    开始做实际项目前,先拿个网上的简单API练下手 一.API说明: 接口信息 接口名:京东获取单个商品价格 地址:http://p.3.cn/prices/mgets 入参:skuids=J_商品ID& ...

  4. 2、大型项目的接口自动化实践记录--接口测试简介及RequestsLibrary关键字简介

    1.接口测试简介 1)先简单介绍下接口测试,那么什么是接口测试呢? 百科的回答:接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点. 看起来有 ...

  5. 1、大型项目的接口自动化实践记录--robotframework环境搭建

    因为人力.团队技术问题,选用robotframework来做自动化,首先说下环境搭建 齐涛道长的入门教程非常棒:http://blog.csdn.net/tulituqi/article/detail ...

  6. 接口自动化平台搭建(二),搭建django项目与接口自动化平台的由来与功能特征

    1.创建django项目 a.使用命令创建,安装完django之后就有django-admin命令了,执行命令创建即可,命令如下: django-admin startproject my_djang ...

  7. python入门以及接口自动化实践

    一.Python入门必备基础语法# 标识符:python中我们自己命名的都是标识符# 项目名 包名 模块名# 变量名 函数名 类名# 1:字母 下划线 数字组成 命名的时候不能以数字开头# 2:见名知 ...

  8. 19 | 真实的战场:如何在大型项目中设计GUI自动化测试策略

  9. python接口自动化(十九)--Json 数据处理---实战(详解)

    简介 上一篇说了关于json数据处理,是为了断言方便,这篇就带各位小伙伴实战一下.首先捋一下思路,然后根据思路一步一步的去实现和实战,不要一开始就盲目的动手和无头苍蝇一样到处乱撞,撞得头破血流后而放弃 ...

随机推荐

  1. 终于有人说清楚了--XGBoost算法

    1. 什么是XGBoost XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不 ...

  2. Jmh测试JDK,CGLIB,JAVASSIST动态代理方式的性能

    前言 JDK,CGLIB,JAVASSIST是常用的动态代理方式. JDK动态代理仅能对具有接口的类进行代理. CGLIB动态代理方式的目标类可以没有接口. Javassist是一个开源的分析.编辑和 ...

  3. Linux命令学习-mv命令

    Linux中,mv命令的全称是move,主要作用是移动文件或文件夹,类似于Windows下的剪切功能,同时还可以用于修改名字. 假设当前处于wintest用户的主目录,路径为 /home/wintes ...

  4. Java底层技术系列文章-hashcode深入理解

    带着问题去理解: 1. Object类HashCode方法是如何实现的,和String类有什么区别? 2.HashCode和Equals之间的关系? 一.hashCode作用 hashCode方法返回 ...

  5. CSS Grid网格布局全攻略

    CSS Grid网格布局全攻略 所有奇技淫巧都只在方寸之间. 几乎从我们踏入前端开发这个领域开始,就不停地接触不同的布局技术.从常见的浮动到表格布局,再到如今大行其道的flex布局,css布局技术一直 ...

  6. liunx某台服务器无法访问其他服务器!!!!!!!!

    针对于可以ping通ip地址,但是无法访问端口!!! 访问端口卡死,未响应, 例如mysql出现当前主机无法远程连接数据库,而其他主机都可以 前提条件:防火墙,mysql账号ip限制问题已经解决 问题 ...

  7. Python爬虫学习代码

    [1]用一个简单的程序来显示Python的数字类型. code: class ShowNumType(object): def __init__(self): self.showInt() self. ...

  8. redis分布式锁的问题和解决

    分布式锁 在分布式环境中,为了保证业务数据的正常访问,防止出现重复请求的问题,会使用分布式锁来阻拦后续请求.具体伪代码如下: public void doSomething(String userId ...

  9. JS浅学

    (变量的名字.focus(); )让打开的新的页面获取焦点 (变量的名字.close();)关闭打开的页面 可以用(!变量名)直接判断是否打开过新的页面 用(变量名.closed)判断是不是被关闭了 ...

  10. 浏览器和Node 中的Event Loop

    前言 js与生俱来的就是单线程无阻塞的脚本语言. 作为单线程语言,js代码执行时都只有一个主线程执行任务. 无阻塞的实现依赖于我们要谈的事件循环.eventloop的规范是真的苦涩难懂,仅仅要理解的话 ...