Python 深拷贝在接口自动化里的用法!

深拷贝(deep copy)常用于复制请求参数、配置对象或其他复杂数据结构,以确保每次发送请求时使用的是独立的数据副本,避免不同请求之间的数据互相影响。例如,当你需要多次调用同一个接口,但每次调用的参数略有不同的时候,深拷贝可以帮助你创建参数对象的新实例

基础示例

import requestsimport copy# 假设有一个包含接口请求参数的字典base_params = {    'user_id': 123,    'data': {        'name': 'Alice',        'address': {            'street': '123 Main St'        }    }}# 在接口自动化测试中,我们可能需要对某些参数进行修改后发起请求def send_request(modified_params):    # 使用深拷贝来创建原始参数的一个完整副本    params = copy.deepcopy(base_params)    # 现在可以安全地修改副本而不影响原始参数    params['user_id'] = modified_params['user_id']    params['data']['name'] = modified_params.get('new_name', params['data']['name'])    # 发送HTTP请求    response = requests.post('http://api.example.com/endpoint', json=params)    # 处理响应并验证结果...# 调用函数,传入要修改的参数test_case_1_params = {'user_id': 456, 'new_name': 'Bob'}send_request(test_case_1_params)# 下一个测试案例,使用不同的参数test_case_2_params = {'user_id': 789, 'new_name': 'Charlie'}send_request(test_case_2_params)

在这个例子中,copy.deepcopy() 方法被用来创建 base_params 的深拷贝,这样每个测试用例都可以根据需要独立修改参数,并且不会干扰其他测试用例或后续的请求。这对于维护数据一致性以及避免由于数据共享导致的问题非常有用。

图片

深拷贝处理列表、字典嵌套的数据结构

图片

包含多个请求参数集合的列表,每个集合代表一次独立的接口调用:​​​​​​​

import copyimport requests# 假设我们有一系列需要以不同参数发送的请求base_requests = [    {        'method': 'POST',        'url': 'http://api.example.com/user',        'data': {            'user_id': 1,            'name': 'Alice'        }    },    {        'method': 'POST',        'url': 'http://api.example.com/user',        'data': {            'user_id': 2,            'name': 'Bob'        }    }]def send_requests(modified_requests):    # 对原始请求列表进行深拷贝    requests_to_send = copy.deepcopy(base_requests)    for request in requests_to_send:        # 根据测试需求修改每个请求的参数        request['data']['name'] = modified_requests[request['data']['user_id']]['new_name']        # 发送HTTP请求        response = requests.request(request['method'], request['url'], json=request['data'])        # 处理响应并验证结果...# 定义要修改的用户名称modified_user_names = {    1: 'Charlie',    2: 'Dave'}# 调用函数,传入要修改的参数send_requests(modified_user_names)

在这个例子中,通过深拷贝base_requests列表,我们可以对每个请求中的数据进行独立修改,而不会影响到其他请求或后续的测试。这样就能确保在并发或批量执行接口测试时,每次请求使用的都是独立的数据副本。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

深拷贝管理复杂的会话状态或全局配置

图片

全局配置对象,包含了所有请求的通用头信息或其他默认设置:​​​​​​​

import requestsimport copy# 全局配置对象global_config = {    'headers': {        'Content-Type': 'application/json',        'Authorization': 'Bearer some_token'    },    'timeout': 30,    'proxies': {...}}# 定义一个发送请求的函数,利用深拷贝来创建全局配置的副本def send_request(url, data, custom_config={}):    # 创建全局配置的深拷贝    config = copy.deepcopy(global_config)    # 更新或添加自定义配置    config.update(custom_config)    # 发送HTTP请求    response = requests.post(url, json=data, **config)    # 处理响应并验证结果...# 使用默认配置发送请求send_request('http://api.example.com/user', {'user_id': 1})# 发送具有部分自定义配置的请求(如:更新令牌)custom_config = {'headers': {'Authorization': 'Bearer new_token'}}send_request('http://api.example.com/user', {'user_id': 2}, custom_config)

在这个例子中,通过深拷贝 global_config,我们可以在不改变原始全局配置的前提下,为每个单独的请求定制不同的配置项。这样在处理多用户、多环境或者需要临时修改某些配置参数的情况时,可以确保每次请求都基于独立且完整的配置对象,从而避免数据污染和错误发生。

深拷贝在持续集成(CI)或持续部署(CD)的场景使用

图片

在并行执行多个接口测试用例时,每个测试任务可能会加载一套共享的基础数据,但需要独立操作这些数据以模拟不同的业务场景:​​​​​​​

import threadingimport copyimport requests# 基础数据集base_data = {    'users': [        {'id': 1, 'name': 'Alice'},        {'id': 2, 'name': 'Bob'}    ],    'products': [...]}def run_test_case(test_case, copied_data):    # 在线程内部对复制的数据进行修改和使用    for user in copied_data['users']:        if user['id'] == test_case['user_id']:            user['name'] = test_case.get('new_name', user['name'])    # 根据测试用例发送请求    response = requests.put(f'http://api.example.com/user/{test_case["user_id"]}', json=user)    # 处理响应并验证结果...# 定义测试用例列表test_cases = [    {'user_id': 1, 'new_name': 'Charlie'},    {'user_id': 2, 'new_name': 'Dave'}]# 使用多线程并发执行测试用例,并为每个线程提供基础数据的深拷贝threads = []for case in test_cases:    copied_data = copy.deepcopy(base_data)    thread = threading.Thread(target=run_test_case, args=(case, copied_data))    threads.append(thread)    thread.start()# 等待所有线程完成for thread in threads:    thread.join()

在这个例子中,通过在每个线程内部创建 base_data 的深拷贝,我们可以确保即使在并发环境下,不同测试用例之间也能安全地独立操作数据,避免了竞态条件和其他同步问题的发生。

图片

深拷贝处理数据库或缓存中的数据

图片

在执行测试用例前,你可能需要从数据库加载一些初始数据,然后基于这些数据进行修改和操作:​​​​​​​

import copyimport db_connection  # 假设这是一个连接到数据库的模块# 从数据库获取基础数据base_data = db_connection.fetch_test_data()def run_test_case(test_case, copied_data):    # 在测试用例内部对复制的数据进行修改    for record in copied_data['records']:        if record['id'] == test_case['record_id']:            record['status'] = test_case['new_status']    # 执行更新数据库的操作(这里仅为示例,实际应使用db_connection模块)    updated_data = update_database(copied_data)    # 根据新状态发送请求并验证响应结果    response = requests.get(f'http://api.example.com/record/{test_case["record_id"]}')    assert response.json()['status'] == test_case['new_status']# 定义测试用例列表test_cases = [    {'record_id': 1, 'new_status': 'active'},    {'record_id': 2, 'new_status': 'inactive'}]# 对每个测试用例运行,并提供数据库数据的深拷贝for case in test_cases:    copied_data = copy.deepcopy(base_data)    run_test_case(case, copied_data)# 清理资源,如重置数据库状态至原始值db_connection.reset_to_original_data(base_data)

在这个例子中,通过深拷贝从数据库获取的基础数据,我们可以安全地模拟各种业务场景下的数据更新操作,同时保证不会影响到其他测试用例或后续的数据恢复过程。在测试结束后,可以将数据库状态重置为初始状态,以确保测试环境的一致性。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

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

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

相关文章

关于静态应用程序安全测试(SAST)的自动修复(AutoFix)

SAST(Static Application Security Testing,静态应用程序安全测试)具是一种在软件工程中使用的安全解决方案,它主要用于在程序员编写好源代码后,无需经过编译器编译,直接对源代码进行扫描,以找出…

旋转齿轮加载

效果演示 实现了一个旋转齿轮的动画效果。具体来说,页面背景为深灰色,中间有一个齿轮装置,包括四个齿轮。每个齿轮都有内部的齿轮条,整体呈现出旋转的效果。其中,齿轮2是顺时针旋转的,齿轮1、3、4是逆时针旋…

如何开通微信小程序商城

微信小程序店铺是一种新型的线上商城,可以帮助商家快速搭建自己的线上销售平台,吸引更多的用户进行购买。作为小程序服务商,我们可以帮助商家开通微信小程序店铺,提升他们的线上销售业绩。 1. 进入采云小程序。进入采云小程序首页…

Python——Tchisla求解器(暴力搜索法)

Tchisla简介 最近玩到一个挺有意思的数字解密小游戏《Tchisla》,其规则类似算24点,也是利用一些数学运算和初始数字计算出目标数字,与算24点不同的是,Tchisla允许不限次数地使用一种初始数字(1~9)&#xf…

MySQL篇—持久化和非持久化统计信息介绍(第一篇,总共三篇)

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…

科技论文编写思路

科技论文编写思路 1.基本框架2.课题可行性评估1.研究目标和意义2.研究方法和技术3.可行性和可操作性4.风险和不确定性5.经济性和资源投入6.成果预期和评估 3.写作思路4.利用AI读论文5.实验流程 1.基本框架 IntroductionRelated worksMethodExperiment and analysisDiscussionC…

JavaScript作用域及预解析

文章目录 1. 作用域介绍2. 变量的作用域*3. JS中没有块级作用域4. 作用域链5. 预解析预解析案例 1. 作用域介绍 全局作用域局部作用域相同的变量名称在不同的作用域中是不会相互影响的! 2. 变量的作用域 全局变量:在全局下都可以使用;局部变…

集群分发脚本xsync

集群分发脚本xsync 一、简介二、环境准备三、添加到机器的 hosts 文件四、ping 命令测试五、SSH 配置5.1.本地先生成公钥和私钥5.2.将公钥拷贝到其他机器 六、xsync 脚本编写6.1.安装 rsync6.2.新建 xsync.sh6.3.xsync.sh脚本6.4.赋予脚本执行权限6.5.测试 endl 一、简介 配置…

学习笔记-李沐动手学深度学习(七)(19-21,卷积层、填充padding、步幅stride、多输入多输出通道)

总结 19-卷积层 【补充】看评论区建议的卷积动画视频 数学中的卷积 【链接】https://www.bilibili.com/video/BV1VV411478E/?fromsearch&seid1725700777641154181&vd_sourcee81e116c4ffe5e79d4bc44738263eda4 【可判断是否为卷积的典型标志】两个函数中自变量相加…

Unity零基础到进阶 | Unity中的 RectTransformUtility 方法整理汇总

Unity零基础到进阶 ☀️| RectTransformUtility 方法整理汇总一、RectTransformUtility 官方文档1.1 RectTransformUtility.CalculateRelativeRectTransformBounds(重)1.2 RectTransformUtility.FlipLayoutAxes1.3 RectTransformUtility.FlipLayoutOnAxi…

Unity中URP实现水体(水的焦散)

文章目录 前言一、原理1、 通过深度图,得到 对应像素 在 世界空间下的Z值2、得到模型顶点在 观察空间 下的坐标3、由以上两点得到 深度图像素 对应的 xyz 值4、最后,转化到 模型本地空间下,用其对焦散纹理采样 二、实现1、获取深度图2、在顶点…

[WebUI Forge]ForgeUI的安装与使用 | 相比较于Auto1111 webui 6G显存速度提升60-75%

ForgeUI的github主页地址:https://github.com/lllyasviel/stable-diffusion-webui-forge Stable Diffusion WebUI Forge 是一个基于Stable Diffusion WebUI(基于Gradio)的平台,可简化开发、优化资源管理并加快推理速度。 “Forge”这个名字的灵感来自于“Minecraft Forge”…

《Vite 基础知识》Vitepress 技术文档站点搭建与配置

前言 简介 VitePress 是一个静态站点生成器 (SSG),专为构建快速、以内容为中心的站点而设计。 简而言之,可构建你自己的 技术文档站点; 环境要求 Node.js 18 及以上版本。我使用 v20.11.0 创建 第一步: 全局安装 npm i vitep…

图搜索基础-深度优先搜索

图搜索基础-深度优先搜索 参考原理引入流程解析手推例子 代码实现运行结果结果分析 参考 理论参考:深蓝学院 实现参考:github项目 原理 引入 对于这样一个图,我们试图找到S到G的通路: 计算机程序不会像人眼一样,一…

鸿蒙应用程序包安装和卸载流程

开发者 开发者可以通过调试命令进行应用的安装和卸载,可参考多HAP的调试流程。 图1 应用程序包安装和卸载流程(开发者) 多HAP的开发调试与发布部署流程 多HAP的开发调试与发布部署流程如下图所示。 图1 多HAP的开发调试与发布部署流程 …

线性DP-前缀和

哪种连续子字符串更长 思路 我们遍历输入字符串s中的每个字符。对于每个字符,我们检查它是1还是0,并相应地更新currentLength1和currentLength0。当我们遇到一个1时,我们增加currentLength1的值,并将currentLength0重置为0&#…

2023秋季飞书未来无限大会--随笔

这个时代的飞书 数字时代 工作协同平台 AI时代 帮助企业和个人用好AI 企业如何引用大模型能力? 智慧体— 接近人,有进步空间智能伙伴 用时代的科技打造爱不释手的好产品 移动互联网 – 改变信息分发方式 大模型 –自然的人机交互方式 业务协同 …

Swagger接口文档管理工具

Swagger 1、Swagger1.1 swagger介绍1.2 项目集成swagger流程1.3 项目集成swagger 2、knife4j2.1 knife4j介绍2.2 项目集成knife4j 1、Swagger 1.1 swagger介绍 官网:https://swagger.io/ Swagger 是一个规范和完整的Web API框架,用于生成、描述、调用和…

kali linux通过aircrack-ng命令破解wifi密码

相关阅读:如何破解攻击WiFi 百度安全验证https://baijiahao.baidu.com/s?id1764248756021219497&wfrspider&forpc上面2篇文章写得都很不错 一、前期准备工作 1、将无线网卡挂载到Kali上 ​ 将无线网卡插到电脑上,如果弹出检测到新的USB设备&…

break,continue

break:跳出并结束循环 continue:跳过本次循环,执行下一次循环 代码演示: package com.zhang.loop;public class BreakAndContinueDemo8 {public static void main(String[] args) {//掌握break和continue的作用//1. break:跳出循…