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

news2025/2/25 4:33:44

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

图片

       在这个图片中,可以看到这是不同的接口请求的数据,那么我们在自动化测试中就得定位到具体的行和列,才可以找到这条数据,那么就涉及到一个问题,这个问题就是在一个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)

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

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

相关文章

使用命令查看电脑最大支持物理内存容量

一、Windows 系统 以管理员身份运行 cmd C:\WINDOWS\system32>wmic memphysical get maxcapacity /format:value将返回值除以1024,再除以1024,即本机最大支持的内存容量 或一行命令直接获取返回值 for /f "tokens2 delims" %I in (wmic…

怎么给视频加水印?2招轻松搞定

在数字媒体时代,视频水印作为一种有效的版权保护手段,被广泛应用于各种场景。给视频添加水印不仅可以防止内容被恶意盗用,还能增加视频的辨识度,提升品牌形象。本文将为您介绍2种简单易行的方法,教您怎么给视频加水印&…

保研机试之【动态规划】

本文为博客:动态规划解题套路框架 | labuladong 的算法笔记 的笔记 前言 动态规划问题的一般形式就是求最值,求解动态规划的核心问题是穷举。动态规划三要素为:最优子结构、重叠子问题、状态转移方程。首先要判断,该问题是否具有…

模电·场效应管放大电路的动态分析_039

场效应管放大电路的动态分析 一、场效应管的低频小信号等效模型二、基本共源放大电路的动态分析三、基本共漏放大电路的动态分析 一、场效应管的低频小信号等效模型 与分析晶体管的 h h h参数等效模型相同,将场效应管也看成一个两端口网络,栅极与源极之间…

MobileNet 网络详解

一、了解 网络亮点: 1、DW网络,大大减少运算量和参数数量 2、增加超参数:控制卷积层卷积核个数的超参数 ,控制图像输入大小的超参数 ,这两个超参数是人为设定的,不是机器学习到的。 二、DW卷积&#xff…

怎么防止源代码防泄密

随着数字化时代的到来,源代码作为企业和个人的重要资产之一,承载着无价的知识和创新。然而,源代码泄露已成为当今信息安全领域的重要挑战之一,给企业带来了严重的经济损失和声誉风险。面对这一挑战,我们有责任加强对源…

亿级流量系统架构设计与实战

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

【火热征稿~~】2024年心理、哲学与历史国际会议(ICPPH 2024)

2024年心理、哲学与历史国际会议(ICPPH 2024) 2024 International Conference on Psychology, Philosophy, and History 【会议简介】 2024年心理、哲学与历史国际会议将于历史文化名城武汉召开。此次盛会集结了来自世界各地的心理学家、哲学家和历史学…

01软件下载安装和P解

凯哥英语视频 软件下载安装和P解 凯哥英语视频1.官网直接下,专业版安装不会有人不会吧实在下载不到就去我这百度云吧结语 1.官网直接下,专业版 点击前往逛网下载https://www.jetbrains.com/pycharm/ 下载专业版,奶茶外卖都能点,只…

【爬虫】爬取股票数据写入数据库并显示(四)

本文所涉及代码已全部打包上传,需要可以到文章末尾查看获取方式,免费,仅做学习交流!!! 股票客户端软件 2024/05,本文主要内容如下: 使用python requests爬取东方财富官网数据。将爬…

ros1版本apollo感知融合算法

apollo.ros-7.0.0 本文章针对apollo 7.0.0版本进行了ros1移植,具体介绍见下文。 PS:项目开发详细了解可在评论区留言。 ros版本apollo7.0.0感知算法 基于ros1的apollo 7.0.0感知融合算法。 简介 此项目基于ros1的apollo 7.0.0感知融合算法&#xff0…

05. 【Java教程】第一个 Java 程序

本节我们将以Windows操作系统为例,编写并执行第一个Java程序。在这之前,请确保你的操作系统上已经安装了JDK 1. 编译程序 大家可能有个疑问,为什么需要编译程序呢?计算机不能直接执行我们编写的源代码吗? 这是由于计…

OV SSL证书的特点

OV SSL证书,全称为Organization Validation SSL Certificate(组织验证型SSL证书),是一种中级的SSL证书类型。与仅验证域名所有权的DV(Domain Validation)证书不同,OV证书在颁发前会执行更加严格…

Jmeter接口测试之参数化

在接口测试中,某些时候一些场景会使用到参数化的场景,参数化简单的说就是同一个请求需要不同的数据,比如在性能测试中需要并发多个用户的场景,这样的目的是为了模拟真实的用户场景,需要模拟不同的账号,这里…

ZL-016D多通道小鼠主动跑轮系统主要研究动物生活节律

简单介绍: 多通道小鼠主动跑轮系统是由动物本身自发运动来推动跑轮转动。在这种构型中,笼内动物长期活动的信息,如跑轮转动方向、转数、累计总行程等,能够使用编码器进行长度计记录。此装置由转轮组件、笼体、以及转动方向速度传…

独享静态IP:跨境网络新助手

在数字化浪潮席卷全球的今天,互联网已成为人们生活中不可或缺的一部分。而在这个由数据和信息构成的虚拟世界里,IP地址作为每一个网络设备的独特标识,其重要性不言而喻。特别是独享静态IP,它不仅为用户提供了更加稳定、安全的网络…

美国加州正测试ChatGPT等生成式AI,在4大部门应用

5月11日,美联社消息,美国加州政府正在测试ChatGPT等生成式AI,应用在税收和收费管理部、交通部、公共卫生部以及卫生与公众服务部4大部门。 测试时间6个月,为其提供技术支持的一共有5家公司,分别是OpenAI、Anthropic、…

【北京迅为】《iTOP-3588开发板从零搭建ubuntu环境手册》-第2章 获取并安装Ubuntu操作系统

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

下载文件名称乱码或变成了随机码

如图 后端是有正常返回附件名称的,浏览器开发工具中也正常显示了这个数据,但是下载下来的文件名称确实一堆随机码. 其实这个问题的原因是因为跨域 查看console: Refused to get unsafe header "content-disposition" 现象,后端传递到前端的fileName不能被识别,下载…

Sass语法介绍-混合指令

08 【Sass语法介绍-混合指令】 1.前言 混合指令在 Sass 中也是一个比较常用的指令,在前面我们讲解的内容中有编写过混合指令 mixin ,本节我们将详细讲解混合指令 mixin 的语法包括定义混合指令和引用混合指令等等,混合指令同样非常好用&…