Python接口自动化测试之动态数据处理

 在前面的知识基础上介绍了在接口自动化测试中,如何把数据分离出来,并且找到它的共同点,然后依据这个共同点来找到解决复杂问题的思想。我一直认为,程序是人设计的,它得符合人性,那么自动化测试的,就是需要在复杂世界的背后,找到一个共同的点,然后把复杂的程序进行简单化。再次看如下的截图:

图片

       在这个图片中,可以看到这是不同的接口请求的数据,那么我们在自动化测试中就得定位到具体的行和列,才可以找到这条数据,那么就涉及到一个问题,这个问题就是在一个excel中有太多的数据,如果精确到行和列,某些时候会出现混乱,按照行和列的方式并不是解决问题的最佳思想。在接口测试中,客户端发送请求到服务端的过程中,除了请求方法和请求头外,必须要带的是请求地址和请求参数,那么也就是说在接口自动化测试中,应该更多的去关心请求地址和请求参数这部分,在如上截图中,可以看到共同点是虽然有很多的数据,但是请求地址永远是在第二列,请求数据永远是在第三列,这个数据不管它是在那一行,这个是不变的,那么读取数据的思想方式是:

1、首先读取excel中的数据,读取XX行的数据并且返回

2、读取XX行中请求地址数据

3、读取XX行中请求参数的数据

4、对post请求进行二次封装,让调用的时候只传请求地址和请求参数,至于请求头,超时处理,以及cookie这些信息,在二次封装的时候直接处理好

先看对excel数据中对数据的处理代码:

#!/usr/bin/env python
#-*-coding:utf-8-*-#author:wuyaimport  os
import  xlrd
import  jsonclass Helper(object):'''公共方法'''def base_dir(self,filePath,folder='data'):'''返回公共路径:parameter folder:文件夹:parameter filePath:文件名称'''return os.path.join(os.path.dirname(os.path.dirname(__file__)),folder,filePath)def readExcel(self,rowx,filePath='data.xlsx'):'''读取excel中数据并且返回:parameter filePath:xlsx文件名称:parameter rowx:在excel中的行数'''book=xlrd.open_workbook(self.base_dir(filePath))sheet=book.sheet_by_index(0)return sheet.row_values(rowx)def getUrl(self,rowx):'''获取请求地址:parameter rowx:在excel中的行数'''return self.readExcel(rowx)[1]def getData(self,rowx):'''获取数据并且返回:parameter rowx:在excel中的行数'''return  json.loads(self.readExcel(rowx)[2])

接着看post请求的二次封装代码:

import  requestsdef getHeaders():'''返回请求头'''headers= {'Content-Type':'application/json; charset=UTF-8','Parkingwang-Client-Source':'ParkingWangAPIClientWeb'}return headersdef post(url,data):'''对post请求方法进行二次封装:parameter url:请求地址:parameter data:请求参数'''r=requests.post(url=url,json=data,headers=getHeaders(),timeout=6)return r

      解决了如上问题后,接着来思考另外一个问题,基于业务的来思考, 比如添加一个用户,然后在删除该用户,那么删除该用户的时候必须要带的参数是用户的ID,用户的ID获取的方式是在添加用户之后,获取用户的ID,步骤具体为:

1、添加用户

2、查询用户获取用户的ID并且返回这个用户的ID

3、删除用户,把这个返回的用户ID当作参数传进去

见删除用户的数据,见截图:

图片

虽然在数据中有用户ID的参数,但是这个用户ID的参数是写死的,实际接口测试中用户的ID参数是动态的,因为每次添加用户之后用户的ID是不同的,那么如何可以做到删除用户的时候这个用户的ID就是创建用户之后拿到的最新的用户的ID了,处理的思路是:

1、读取删除用户的请求数据

2、把读取的数据是字符串类型,通过反序列化的形式转为字典的数据类型

3、成为字典的类型后,对字典中的参数用户ID进行赋值,值为添加用户之后获取的用户ID

4、对字典赋值后,然后返回字典

5、调用删除用户接口的时候,请求参数直接调用对用户ID赋值后的方法

6、这样就可以保证用户ID与创建后的用户ID数据是一致的

通过如上的思路,可以很好的解决了动态数据的处理,以及数据关联性的处理,在Jmeter测试工具中,使用的方案是后置处理器中的正则表达式提取器,见python实现如上的代码:

#!/usr/bin/env python 
#-*-coding:utf-8-*-#author:wuyaimport  unittest
import  requests
import  time as t
import  os
import  jsonfrom page.user import *
from utils.helper import *class TestUserApi(unittest.TestCase,Helper):@classmethoddef setUpClass(cls):t.sleep(1)@classmethoddef tearDownClass(cls):passdef statusCode(self,r):'''对HTTP状态码和业务状态码校验'''self.assertEqual(r.status_code,200)self.assertEqual(r.json()['status'],0)def test_user_api_001(self):'''登录业务:登录系统'''r=post(self.getUrl(1),self.getData(1))self.statusCode(r)self.assertEqual(r.json()['data']['name'],'666a666666')with open(self.base_dir('token'),'w') as f:f.write(r.json()['data']['token'])@propertydef getToken(self):'''获取登录成功后的token'''with open(self.base_dir('token'),'r') as f:return f.read()def setToken(self,rowx):'''对excel中的请求参数token重新赋值:parameter rowx:在excel中的行数'''dict1=self.getData(rowx)dict1['token']=self.getTokenreturn dict1def test_user_api_002(self):'''登录业务:查看登录成功后的用户信息'''r=post(self.getUrl(2),self.setToken(2))self.statusCode(r)self.assertEqual(r.json()['data']['username'],'6666666666')def test_user_api_003(self):'''用户管理业务:添加用户'''r=post(self.getUrl(3),self.setToken(3))self.statusCode(r)def test_user_api_004(self):'''用户管理业务:用户查询'''r=post(self.getUrl(4),self.setToken(4))self.statusCode(r)self.assertEqual(r.json()['data']['records'][0]['name'],'666666')@propertydef getUserID(self):'''获取用户的ID'''r = post(self.getUrl(4), self.setToken(4))return r.json()['data']['records'][0]['id']def setTokenUserID(self,rowx):'''对excel中的请求参数token,用户ID重新赋值:parameter rowx:在excel中的行数'''dict1=self.getData(rowx)dict1['token']=self.getTokendict1['id']=self.getUserIDreturn dict1def test_user_api_009(self):'''用户管理业务:删除用户'''r = post(self.getUrl(7), self.setTokenUserID(7))self.statusCode(r)if __name__ == '__main__':unittest.main(verbosity=2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自由职业是种怎样的体验?普通人如何成为一名自由职业者?

自由职业在哪都能办公自由职业在哪都要办公。 放弃幻想,没有不辛苦的工作,5年经验后端开发程序员,已经从事自由职业1年半,今天就来客观分享一下自由职业的利与弊。 时间自由,减少中间商赚差价 自由职业最让人羡慕的就…

React Native 开发心得分享

有一段时间没更新了,花了点时间研究了下 React Native(后续用 RN 简称),同时也用该技术作为我的毕设项目(一个校园社交应用,仿小红书),经过了这段时间的疯狂折腾,对 RN 生态有了一定的了解&…

图搜索算法-最小生成树问题-普里姆算法(prim)

相关文章: 数据结构–图的概念 图搜索算法 - 深度优先搜索法(DFS) 图搜索算法 - 广度优先搜索法(BFS) 图搜索算法 - 拓扑排序 图搜索算法-最短路径算法-戴克斯特拉算法 图搜索算法-最短路径算法-贝尔曼-福特算法 图搜索…

【069】基于SpringBoot+Vue实现的企业资产管理系统

系统介绍 基于SpringBootVue实现的企业资产管理系统管理员功能有个人中心,用户管理,资产分类管理,资产信息管理,资产借出管理,资产归还管理,资产维修管理。用户可以对资产进行借出和归还操作。因而具有一定…

软考-下午题-试题一

1、概念 2、答题技巧和规范 问题1、2:直接看 格式: 问题3: 格式: 3、例题 eg2:可以以后写完问题4之后,把问题3补充完整 问题4: 问题4 官方解释: 问题4(3‘) 2…

在做题中学习(58):和为K的子数组

560. 和为 K 的子数组 - 力扣(LeetCode) 因为是判断子数组的和 要返回 k 的次数,所以 解法:前缀和 哈希表 提出一个概念:以下标i为结尾的所有子数组 那要找出所有和 k的子数组 就相当于:找出所有值为…

JAVA实验项目(二): 抽象类、接口的定义与使用

实验项目二 抽象类、接口的定义与使用 Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊&…

C#实现多线程的几种方式

前言 多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景,可以充分利用多核处理器和系统资源,提高应用程序的性能和效率。 多线程常用场景 CPU 密集型任务…

物联网促进信息化——​青创智通工业物联网解决方案​

随着传感器网络(WSN)、无线射频识别(RFID)以及微电子机械系统(MEIVIS)等技术的不断成熟,扩展了人们对信息获取和使用的能力,并将提高制造效率、改善产品质量、降低产品成本和资源消耗、为用户提供更加透明和个性化的服…

玩转Matlab-Simscape(初级)- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(理论部分1)

** 玩转Matlab-Simscape(初级)- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(理论部分1) ** 目录 玩转Matlab-Simscape(初级)- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&am…

网关过滤器实现接口签名检验

背景 往往项目中的开放接口可能被别有用心者对其进行抓包然后对请求参数进行篡改,或者重复请求占用系统资源为此我们行业内使用比较多的策略是接口签名校验。签名校验的实现可以用注解aop的形式实现,也可以使用过滤器统一拦截校验实现,此篇文…

图形化编程桌面 跨部门协作的新工具

中午,阳光洒满大地,微风轻拂,给人带来温暖和活力。卧龙和凤雏在享用过午餐后,决定到公司附近的湖边散步,享受这难得的宁静时光。 卧龙望着湖面泛起的波光,顺手折下一根嫩绿的柳枝,在手中不停地摆…

运维别卷系列 - 云原生监控平台 之 04.prometheus 查询语句 promql 实践

文章目录 [toc]PromQL 简介什么是时间序列 PromQL 数据类型即时向量 Instant vector范围向量 Range vectorTime DurationsOffset modifier modifier 浮点值 Scalar字符串 String PromQL FUNCTIONSfloor()irate()rate()round()sort()sort_desc() PromQL 运算符算术运算符比较运算…

TortoiseGit的安装

TortoiseSvn和TortoiseGit都是针对代码进行版本管理的工具,又俗称小乌龟,简洁而可视化的操作界面,免去繁琐的命令行输入。只需要记住常用的几个操作步骤就能快速上手。 TortoiseGit安装 1、TortoiseGit作为git的版本管理工具 ,但…

无感自动透明加密系统

无感透明加密系统是一种高级的数据安全技术,它在不影响用户正常操作的前提下,对指定的文件或数据进行自动加密和解密。这种系统设计的目的是为了提高信息安全级别,确保敏感信息在存储和传输过程中的保密性,同时又不会给合法用户的…

5.9网络协议

由网卡发送数据通过网线进行发送,当网卡接收到信号以后将数据传给内核数据区,然后由操作系统交给相应的进程。 将数据进行发送的时候需要借助于网线实现,这个时候会出现当传输的数据比较远的时候就借助于中继器将信号进行再生扩大&#xff0…

FedDML:Federated Mutual Learning

这篇把DML运用到FL上 论文地址:arvix code: 作者git 贡献 我们针对三种异质性(DOM)提出了一种新颖的联邦学习范式,称为联邦相互学习(FML)。 首先,FML 处理数据和目标通过使每个客户能够训练个性化模型来实现异质性。 从OH的意义上来说,DH对服务器有害,但对客户端有…

STL—string类(1)

一、string类 1、为什么要学习string? C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP(面向对象…

爱校对新功能上线:领导人讲话和职务排序校对

我们很高兴地宣布,爱校对网站正式推出两项新功能:领导人讲话校对和领导人职务排序校对。这些新功能旨在帮助用户更准确地引用和整理领导人讲话内容,以及正确排列领导人的职务顺序。 领导人讲话校对 在撰写报告或文章时,引用领导…

气膜建筑使用寿命由什么决定—轻空间

气膜建筑作为一种新型建筑结构,以其独特的优点在全球范围内逐渐普及。其使用寿命是投资者和用户关注的关键问题。气膜建筑的使用寿命主要由以下几个方面决定: 1. 膜材 膜材是气膜建筑的核心组成部分,其质量直接影响到建筑的使用寿命。以下是影…