吐血整理,Python接口自动化测试-接口关联依赖处理(详细)

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

场景说明

在面试接口自动化时,经常会问,其他接口调用的前提条件是当前用户必须是登录状态,如何处理接口依赖?

在此之前我们介绍过session管理器保存会话状态。如果接口请求需要携带token,那么又如果处理呢?

未登录状态下,直接请求充值接口的异常场景:

import unittest
import requests
class TestRecharge(unittest.TestCase):def setUp(self):passdef tearDown(self):passdef test_recharge(self):url = 'http://127.0.0.1:8888/recharge'payload = {"member_id": 100004312,"amount": 80}res = requests.post(url,json=payload)print(res.json())
if __name__ == '__main__':unittest.main()

运行结果如下:

{'code': 1003, 'msg': '未授权或token已过期'}

token处理思路

在处理之前,token灵魂三连问:

如何获取token?
获取的token如何管理?
其他接口如何携带token?

思路如下:
抽取登录接口返回值中的token;
使用全局变量存储token。token可以存到yaml或者json或者ini的配置文件里,以下介绍将token作为类属性;
其他接口将token值放入请求头,发送请求;

JsonPath基本用法

我们需要从登录接口中提取出token,这里介绍JsonPath基本用法。

JsonPath介绍:
JsonPath为Json文档提供了解析能力,通过使用JsonPath,你可以方便的查找节点、获取想要的数据,JsonPath是Json版的XPath。

JsonPath语法:

JsonPath说明
$文档根元素
@当前元素
.或[]匹配下级元素
递归匹配所有子元素
*通配符,匹配下级元素
[]下标运算符,根据索引获取元素,JsonPath索引从0开始
[,]连接操作符,将多个结果拼接成数组返回,可以使用索引或别名
[start:end:step]数据切片操作
?()过滤表达式

这么多语法规范,大家会觉得一脸懵逼吧,细心的小伙伴会发现语法中 … 表示递归匹配所有子元素,简单粗暴,用…获取所有匹配的子元素,通过索引拿到想要的值。

JsonPath源码

def jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True):"""traverse JSON object using jsonpath expr, returning values or paths"""

obj:需要解析的对象,比如接口的返回值。expr: 匹配的表达式。

JsonPath实战
以下编写代码进行演示。

from jsonpath import jsonpath
# json格式结果
res = {"code": 0,"msg": "OK","data": {"token_info": {"token_type": "Bearer","expires_in": "2020-05-28 13:07:29","token": "eyJhbGciOiJIUzUxAiJ9.eyJtZW1iZZJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNjQyNDQ5fQ.s6A7pzLILf9tqpEDAU9wIPGGLGkgKEQ6EBHq26l-eUM5seCb48DWalkE7u16iRZv3uzD5hIDFbw41Jmi9V0T_Q"}}
}
# 获取res中的token
token = jsonpath(res,'$..token')[0]
print(token)

响应结果为:

eyJhbGciOiJIUzUxBiJ9.eyJtZW1iZZJfaWQiOpEwMDA1MTMxNSwiZXhwIjoxNTkwNjQyNDQ5fQ.s6A7pzLILf9tqpEDAU9wIPGGLGkgKEQ6EBHq26l-eUM5seCb48SW

token 依赖实例

①在config/setting.py配置文件中,配置全局的域名或IP。

class DevConfig():# 项目的域名或IPhost='http://127.0.0.1:8888'
config = DevConfig()

②在config/config.yaml文件中,存入登录账号。
config.yaml

user:mobile_phone: '155********'pwd: '12345678'

③在项目根目录下,新建文件夹middleware,文件夹下新建文件helper.py,用于处理token。

D1

④首先编写登录接口,返回接口数据。
helper.py

from common.requests_handler import RequestsHandler
from config.setting import config
from common.yaml_handler import yaml_datadef login():"""登录,接口返回token"""req = RequestsHandler()res = req.visit('post', config.host+'/login', json=yaml_data['user'])return res
print(login())

运行结果如下:

{'code': 0,'msg': 'OK','data': {'token_info': {'token_type': 'Bearer','expires_in': '2020-05-26 13:31:41','token': 'eyJhbGciOiJIUpUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNDcxMTAxfQ.4QDNdQ-Wyecvpv7yRnMlCx1ZXpAlb8vpohxHht5OfNcjGn_yTaISyhmn7OMzjMGlz68sJ_uFbCh2NhIaO2p_Lg'}}
}

⑤接下来编写函数,获取登录接口返回值并提取token和token_type进行拼接 。这里要使用jsonpath模块提取返回的token和token_type。

helper.py

def save_token():"""保存token信息"""res = login()token = jsonpath(res,'$..token')[0]token_type = jsonpath(res,'$..token_type')[0]token = " ".join([token_type, token])return token
print(save_token())

运行结果如下:

Bearer eyJhbGciOJIPzUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwN

⑥最后定义类,将token作为类属性,整体代码如下:helper.py

from common.requests_handler import RequestsHandler
from config.setting import config
from common.yaml_handler import yaml_data
from jsonpath import jsonpathdef login():"""登录,返回token信息"""req = RequestsHandler()res = req.visit('post', config.host+'/login', json=yaml_data['user'])return res
def save_token():"""保存token信息"""res = login()token = jsonpath(res,'$..token')[0]token_type = jsonpath(res,'$..token_type')[0]token = " ".join([token_type, token])Context.token = tokenreturn token
class Context:"""将token作为类属性"""token = ''if __name__ == '__main__':print(save_token())

运行结果如下:

Bearer eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNDcz

⑦充值接口携带token请求。

import unittest
import requestsfrom middleware.helper import Context, save_token
class TestRecharge(unittest.TestCase):def setUp(self):passdef tearDown(self):passdef test_recharge(self):save_token()token = Context.tokenurl = 'http://127.0.0.1:88888/recharge'payload = {"member_id": 100051315,"amount": 80}res = requests.post(url,json=payload)print(res.json())if __name__ == '__main__':unittest.main()

运行结果为:

{'code': 0,'msg': 'OK','data': {'leave_amount': 240.0,'mobile_phone': '155********',}
}
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

不畏风雨,砥砺前行,奋斗是实现梦想的道路。坚持不懈,追逐远方,用毅力创造辉煌的人生。相信自己的力量,燃烧热情,每一次努力都是迈向成功的跳板,只要心怀勇气,必将绽放属于自己的壮丽华章。

拥抱挑战,绽放光芒,奋斗是成就辉煌的征程。砥砺前行,脚踏实地,用汗水铸就成功的坚固基石。相信自己的能力,不屈不挠,每一次努力都是逼近目标的勇敢迈步。

心怀梦想,勇往直前,奋斗是砥砺前行的旅程。追逐辉煌,披荆斩棘,用汗水浇灌成就的花朵。相信自我价值,不畏困难,每一次努力都是向成功逼近的坚实步伐。

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

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

相关文章

cpolar的基础使用方法

如何使用cpolar内网穿透? 文章目录 如何使用cpolar内网穿透?前言1. 在群辉NAS系统下安装cpolar套件2. 管理隧道列表3. 创建固定数据隧道 前言 群晖作为大容量存储系统,既可以作为个人的私有存储设备,也可以放在小型企业中作为数据…

创建两个线程,其中一个线程读取文件中的数据,另外一个线程将读取到的内容打印到终端上,类似实现cat一个文件。 cat数据完毕后,要结束两个线程。

#include <stdio.h> #include <pthread.h>#define BUFFER_SIZE 99999 //足够大// 全局共享的数据缓冲区 char buffer[BUFFER_SIZE]; int buffer_length 0;// 锁和条件变量用于线程同步 pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond …

vue3 Hooks 封装loading使用

vue3 Hooks 封装loading使用 个人理解&#xff1a;Hooks 就是 钩子 的意思&#xff0c;在特定时机执行的函数 之前不理解Hooks和自定义封装的utils函数有什么区别&#xff0c;它们都是函数&#xff0c;逐步理解到utils函数没有vue里面的响应式api&#xff0c;而自定义Hooks可…

基于微信小程序的传染病酒店隔离平台设计与实现(Java+spring boot+MySQL+微信小程序)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于微信小程序的传染病酒店隔离平台设计与实现&#xff08;Javaspring bootMySQL微信小程序&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;…

回归决策树模拟sin函数

# -*-coding:utf-8-*- import numpy as np from sklearn import tree import matplotlib.pyplot as pltplt.switch_backend("TkAgg") # 创建了一个随机数生成器对象 rng rngnp.random.RandomState(1) print("rng",rng) #5*rng.rand(80,1)生成一个80行、1列…

Go语言删除文本文件中的指定行

GO语言删除文本文件中的指定行 1. 思路2. 处理文件3. 处理后的文本文件 1. 思路 假设现在有一个文本文件&#xff0c;我们需要删除文件中乱码的行。我们可以使用go的os库来处理文件&#xff0c;遍历整个文件然后将除过乱码的行写入一个新文件&#xff0c;以此来实现我们的需求…

clion run qt 问题汇总

一、Error copying file “D:/soft/QT/5.15.2/mingw81_64/bin/Qt5Cored.dll” to “D:/work/Ccode/qtproject/cmake-build-debug-qtmingw”.报错 查看路径下确实没有Qt5Cored.dll&#xff0c;只有Qt5Core.dll 注释掉cmakelist中的这三行 重新执行后成功 二、使用CLion编辑u…

【学习】若依源码(前后端分离版)之 “ 分页以及查询的功能实现”

大型纪录片&#xff1a;学习若依源码&#xff08;前后端分离版&#xff09;之 “ 分页以及查询的功能实现” 前端部分后端部分结语 包括代码生成也好&#xff0c;最原始的系统也好&#xff0c;若依里每个页面只要有数据&#xff0c;基本上就有分页的功能&#xff0c;所以理解分…

强化学习基础

强化学习 策略网络输入状态s&#xff0c;输出动作a的概率分布如下&#xff1a; π ( a ∣ s ) \pi(a|s) π(a∣s) 多次训练轨迹如下 r表示回报横轴为T, 1个回合的步骤数纵轴为N, 回合数&#xff0c;1行代表1条轨迹&#xff0c;符合概率分布P [ s 11 a 11 r 11 … … s 1 t …

机器学习实战2决策树算法

文章目录 决策树算法核心是要解决两个的关键问题sklearn中的决策树模型sklearn建模步骤分类树Criterionrandom_state && splitter剪枝参数max_depthmin_samples_leaf&&min_samples_splitmax_features&&min_impurity_decrease确认最优剪枝参数目标权重参…

VR全景智慧文旅,用科技助力旅游业振兴

引言&#xff1a; 近年来&#xff0c;科技的迅猛发展将我们带入一个全新的数字化时代&#xff0c;而虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术则以其令人惊叹的全新方式&#xff0c;影响着各个领域。其中&#xff0c;旅游业作为人们探索世界、体…

Camunda 7.x 系列【12】创建流程引擎

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. ProcessEngine2. 创建流程引擎2.1 Java API2.2 XML 配置2.3 Spring2.4 Spring Boot1. Pr…

系统架构设计师笔记第35期:表现层框架设计

表现层框架设计是指在软件系统中&#xff0c;将用户界面&#xff08;UI&#xff09;和用户交互逻辑与后端业务逻辑分离&#xff0c;使用特定的框架来组织和管理表现层的功能和结构。下面是表现层框架设计的一般步骤和常用技术&#xff1a; 确定需求和功能&#xff1a;首先&…

【2.1】Java微服务:详解Hystrix

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; Java微服务 ✨特色专栏&#xff1a; 知识分享 &am…

用C++实现的RTS游戏的路径查找算法(A*、JPS、Wall-tracing)

在实时策略&#xff08;RTS&#xff09;游戏中&#xff0c;路径查找是一个关键的问题。游戏中的单位需要能够找到从一个地方到另一个地方的最佳路径。这个问题在计算机科学中被广泛研究&#xff0c;有许多已经存在的算法可以解决这个问题。在本文中&#xff0c;我们将探讨三种在…

NeRF基础代码解析

embedders 对position和view direction做embedding。 class FreqEmbedder(nn.Module):def __init__(self, in_dim3, multi_res10, use_log_bandsTrue, include_inputTrue):super().__init__()self.in_dim in_dimself.num_freqs multi_resself.max_freq_log2 multi_resself…

php如何爬取天猫和淘宝商品数据

这篇文章主要介绍了php如何爬取天猫和淘宝商品数据&#xff0c;具有一定借鉴价值&#xff0c;感兴趣的朋友可以参考下&#xff0c;希望大家阅读完这篇文章之后大有收获&#xff0c;下面让小编带着大家一起了解一下。 一、思路 最近做了一个网站用到了从网址爬取天猫和淘宝的商…

row_number()分页返回结果顺序不确定

之前通过row_number()实现分页查询时&#xff1a; select top [PageSize] * from (select row_number() over (order by id desc) as RowNum,*from table ) as A where RowNum > (PageIndex - 1) * PageSize发现查询出来的结果顺序是不确定的&#xff0c;查询官方文档&am…

基于遗传算法改进的支持向量机多分类仿真,基于GA-SVM的多分类预测,支持相机的详细原理

目录 背影 支持向量机SVM的详细原理 SVM的定义 SVM理论 遗传算法的原理及步骤 SVM应用实例,基于遗传算法优化SVM的多分类预测 完整代码包括SVM工具箱:https://download.csdn.net/download/abc991835105/88175549 代码 结果分析 展望 背影 多分类预测对现代智能化社会拥有重…

VGG16模型详解

VGG16模型详解 0、VGG16介绍 VGG16是一种深度卷积神经网络&#xff0c;由牛津大学的研究团队于2014年开发。 VGG16在2014年的ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 竞赛中取得了显著的成绩。它在图像分类任务中获得了当年的第二名&#xff0c;其准确…