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

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

图片

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

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

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

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

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

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

#!/usr/bin/env python
#-*-coding:utf-8-*-

#author:wuya


import  os
import  xlrd
import  json


class 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  requests

def getHeaders():
   '''返回请求头'''
   headers= {'Content-Type':'application/json; charset=UTF-8',
           'Parkingwang-Client-Source':'ParkingWangAPIClientWeb'}
   return headers

def 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:wuya

import  unittest
import  requests
import  time as t
import  os
import  json

from page.user import *
from utils.helper import *

class TestUserApi(unittest.TestCase,Helper):
   @classmethod
   def setUpClass(cls):
      t.sleep(1)

   @classmethod
   def tearDownClass(cls):
      pass

   def 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'])

   @property
   def 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.getToken
      return dict1

   def 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')

   @property
   def 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.getToken
      dict1['id']=self.getUserID
      return dict1
      
   def test_user_api_009(self):
      '''用户管理业务:删除用户'''
      r = post(self.getUrl(7), self.setTokenUserID(7))
      self.statusCode(r)

if __name__ == '__main__':
   unittest.main(verbosity=2)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Github新手入门使用方法

**存在问题:**新手如何快速入门github,能够下载开源文件,并且修改后更新远程github仓库; 解决方案: 参考: http://www.360doc.com/content/24/0301/12/60419_1115656653.shtml https://blog.csdn.net/gongd…

一个不知名的开源项目可以带来多少收入

起源 2020 年新冠疫情开始蔓延,当时我在同时经营 3 个不同的公司。除了其中的体育赛事平台因为疫情关门大吉之外,另外两个公司并没有受影响,营收和利润反而都持续增加。但是连续几个月不能出远门,也不能随便见朋友和客户&#xff…

大语言模型的RAG:综述

23年12月同济大学和复旦大学的综述论文“Retrieval-Augmented Generation for Large Language Models: A Survey”。 大语言模型(LLM)展示了强大的功能,但在实际应用中仍然面临挑战,如幻觉、知识更新缓慢以及答案缺乏透明度。检索…

分布式搜索-elaticsearch基础 安装es

这里是在虚拟机的Linux系统里安装es的教程: 1.创建网络 在Finashell终端输入指令 docker network create es-net 2.将es.tar安装包放入tmp的目录下 输入指令加载镜像:docker load -i es.tar 3.再运行docker 命令 docker run -d \--name es \-e "ES_JAVA_O…

触摸播放视频,并用iframe实现播放外站视频

效果&#xff1a; html: <div:style"{ height: homedivh }"class"rightOne_content_div_div"mouseenter"divSeenter(i)"mouseleave"divLeave(i)"click"ItemClick(i)"><!-- isUser是否是用户上传 --><divv-if…

NodeJS编写后端接口

技术栈 1.express&#xff1a;Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建 各种 Web 应用&#xff0c;和丰富的 HTTP 工具&#xff0c;使用 Express 可以快速地搭建一个完整功能的网站。 2.mysql&#xff1a;用于操作MySQL数据库 3.bod…

HarmonyOS应用模型Stage基本介绍

文章目录 <font colorcoral> HarmonyOS应用模型概况<font colorcoral> Stage模型基本概念<font colorcoral> Stage模型UIAbiliry的生命周期<font colorcoral> Stage模型的配置文件<font colorcoral> 写在后面的话<font colorcoral>Referen…

Grafana(CVE-2021-43798)、Apache Druid 代码执行漏洞

文章目录 一、Grafana 8.x 插件模块目录穿越漏洞&#xff08;CVE-2021-43798&#xff09;二、Apache Druid 代码执行漏洞&#xff08;CVE-2021-25646&#xff09; 一、Grafana 8.x 插件模块目录穿越漏洞&#xff08;CVE-2021-43798&#xff09; Grafana是一个系统监测工具。 利…

Spring的核心概念

目录 1、控制反转&#xff08;IoC&#xff09; 什么是控制反转 IoC与IoC容器的关系 Spring框架的控制反转 2、Bean 注解&#xff1a;​​​ 3、DI 4、总结 1、控制反转&#xff08;IoC&#xff09; 什么是控制反转 IoC&#xff08;Inversion of Control&#xff0c;控…

01 Triton backend

1 整体架构 三部分组成&#xff1a; Triton backend tensorRT_backend、onnx_backend、tfs_backend、torch_backend **Triton model ** 不同的模型 **Triton model instance ** 模型实例 ![P2}5X%2ULV(2OAC$_OKOP.png 2 设计思路 需要实现七个接口&#xff1a; TRITON…

给定两点所能得到的数学关系

给定两点所能得到的数学关系 正文 正文 这里介绍一个基础问题&#xff0c;如果给定平面上的两个点的坐标&#xff0c;那么它们之间能够得到什么数学关系呢&#xff1f; ω arctan ⁡ y 1 − y 0 x 1 − x 0 x 1 − x 0 d cos ⁡ ω y 1 − y 0 d cos ⁡ ω d ( x 1 − x…

【 PowerJob 的使用 -分布式调度】

PowerJob 的使用 最近项目中使用了PowerJob做任务调度模块&#xff0c;感觉这个框架真香&#xff0c;今天我们就来深入了解一下新一代的定时任务框架——PowerJob&#xff01; 简介 PowerJob是基于java开发的企业级的分布式任务调度平台&#xff0c;与xxl-job一样&#xff0…

内联函数+auto关键字(C++11)+指针空指针nullptr(C++11)

内联函数auto关键字&#xff08;C11&#xff09;指针空指针nullptr&#xff08;C11&#xff09;详解 内联函数概念特性 auto关键字&#xff08;C11&#xff09;auto简介auto的使用细则auto不能推导的场景 基于范围的for循环(C11)范围for的语法范围for的使用条件 指针空指针null…

什么是外呼系统?企业为什么使用ai电销外呼系统

说起ai电销外呼系统&#xff0c;或许有的人并不了解这是什么&#xff0c;但它却常常出现在我们的生活中&#xff0c;今天我们来看看什么是外呼系统&#xff0c;企业为什么使用ai电销外呼系统&#xff1f; 一、什么是外呼系统 外呼系统就是由系统自动拨打电话的&#xff0c;外呼…

WPF基础学习笔记

目录 基础知识&#xff1a; WPF的特点: WPF的优点 什么是XAML&#xff1f; 布局基础&#xff1a; 样式的应用&#xff1a; 控件模板&#xff08;ControlTemplate&#xff09;&#xff1a; 数据模板&#xff08;DataTemplate&#xff09;&#xff1a; 静态资源StaticRe…

Kasawaki川崎机器人故障维修

在当今的自动化工业领域&#xff0c;川崎工业机器人以其卓越的性能和可靠的工作效率赢得了广泛的赞誉。作为机器人的核心组成部分&#xff0c;伺服电机的作用至关重要。然而&#xff0c;就像所有机械设备一样&#xff0c;也可能会遭遇电机磨损或故障&#xff0c;需要适时的川崎…

如何为域名生成证书签发请求CSR

最近我们在Hostease购买了服务器产品&#xff0c;为了保障我们网站的安全&#xff0c;我们额外还购买了SSL证书产品。在Hostease技术客服的帮助下&#xff0c;我们成功签发了SSL证书。 在签发证书前需要生成一个证书签名请求CSR&#xff0c;证书签名请求(CSR)是一个包含有关你…

【计算机网络】http协议的原理与应用,以及https是如何保证安全传输的

HTTP 超文本传输协议&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 HTTP的发展是由蒂姆伯纳斯-李于1989年在欧洲核子研究组织…

欣意无限信息技术有限公司邀您参观2024长三角快递物流展

参展企业介绍 郑州欣意无限信息技术有限公司成立于2017年&#xff0c;公司经营范围计算机网络技术开发、技术咨询、技术服务、技术转让&#xff1a;商务信息咨询服务&#xff1b;市场营销策划&#xff1b;设计、制作、代理、发布国内广告业务&#xff1b;电脑图文设计&#xff…

[IMX6ULL驱动开发]-GPIO子系统和Pinctrl子系统

目录 Pinctrl子系统的概念 GPIO子系统的概念 定义自己的GPIO节点 GPIO子系统的函数 引脚号的确定 基于GPIO子系统的驱动程序 驱动程序 设备树修改 之前我们进行驱动开发的时候&#xff0c;对于硬件的操作是依赖于ioremap对寄存器的物理地址进行映射&#xff0c;以此来达…