接口自动化测试思路和实战 —— 编写线性测试脚本实战!
接口自动化测试框架目的
测试工程师应用自动化测试框架的目的: 增强测试脚本的可维护性、易用性(降低公司自动化培训成本,让公司的测试工程师都可以开展自动化测试)。
自动化测试框架根据思想理念和深度不同,渐进式的分为以下几种:
线性脚本框架
模块化思想==>模块化测试脚本框架
库思想==>测试库框架。
数据驱动思想==>数据驱动测试框架
关键字驱动思想==>关键字驱动或表驱动的测试框架
上述思想融合完成企业实际自动化==>混合测试自动化框架
编写线性测试脚本实战
接口用例excel;
步骤1、新建项目名API_TEST_FRAME,在项目的下面新建不同层级;如下图
步骤2、根据接口文档的层级,在项目中的testcase层下新建层级;如下图
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】
步骤3、在begin_dev下新建test_get_access_token_api.py文件,并编写代码
编写代码:
# encoding: utf-8 # @author: Jeffrey # @file: test_get_access_token_api.py # @time: 2022/7/24 18:08 # @desc: 导入模块顺序:内置模块、第三方模块、自定义模块 import unittest import requests import jsonpathclass TestGetAccessTokenApi(unittest.TestCase):def setUp(self) -> None:self.session = requests.session()def tearDown(self) -> None:self.session.close()def test_case_01(self):'''[api_case_01] 测试获取access_token能否正常调用'''url_params = {"grant_type":"client_credential","appid":"wxf14419077f707856","secret":"92a113bd4b5ffdc72144740dc7123c99"}response = self.session.get(url="https://api.weixin.qq.com/cgi-bin/token",params = url_params)# 获取响应json中的access_token的值actual_result = jsonpath.jsonpath(response.json(), "$.access_token")print(actual_result)self.assertTrue(actual_result, "api_case_01 执行失败") #非空,非0 都返回True为真def test_case_02(self):'''[api_case_02] 测试获取access_token接口在appid错误时,能否正常处理错误'''url_params = {"grant_type":"client_credential","appid":"wxf14419077f707","secret":"92a113bd4b5ffdc72144740dc7123c99"}response = self.session.get(url="https://api.weixin.qq.com/cgi-bin/token",params = url_params)# 获取响应json中的errcode的值,因为jsonpath返回的是列表,故加上下标0actual_result = jsonpath.jsonpath(response.json(), "$.errcode")[0]print(actual_result)self.assertEqual(actual_result,40013, "api_case_02 执行失败")if __name__ == '__main__': unittest.main(verbosity=2)
执行查看结果:
步骤4、按照开发文档中的用户标签管理,新建test_create_user_tag_api.py文件
编写代码:
# encoding: utf-8 # @author: Jeffrey # @file: test_create_user_tag_api.py # @time: 2022/7/24 19:02 # @desc: import unittest import requests import jsonpath import jsonclass TestCreateUserTagApi(unittest.TestCase):def setUp(self) -> None:self.session = requests.session()def tearDown(self) -> None:self.session.close()def test_case_01(self):'''[api_case_03] 测试正常进行创建标签接口调用'''url_params = {"grant_type":"client_credential","appid":"wxf14419077f707856","secret":"92a113bd4b5ffdc72144740dc7123c99"}response = self.session.get(url="https://api.weixin.qq.com/cgi-bin/token",params = url_params)# 获取响应json中的access_token的值token_value = jsonpath.jsonpath(response.json(), "$.access_token")[0]tag_url_params = {"access_token":token_value}tag_boby = { "tag": { "name":"深圳人2" } }# 解决中文乱码问题;模拟post请求时,携带json 数据包含中文发送给服务器会转码# 方式一:json.dumps()tag_str = json.dumps(tag_boby, ensure_ascii=False)response = self.session.post(url="https://api.weixin.qq.com/cgi-bin/tags/create",params = tag_url_params,data=tag_str.encode('utf-8'))print(response.json())# # 方式二:修改requests中的models.py中的源码,修改完后# response = self.session.post(url="https://api.weixin.qq.com/cgi-bin/tags/create",# params=tag_url_params,# json=tag_boby)# print(response.json())# 获取响应json的tag的name值,因为jsonpath返回的是列表,故加上下标0actual_result = jsonpath.jsonpath(response.json(), "$.tag.name")[0]self.assertEqual(actual_result,"深圳人2", "api_case_03 执行失败")if __name__ == '__main__':unittest.main(verbosity=2)
Requests模拟post请求时,如何处理携带json 数据包含中文发送给服务器会转码的问题?
方式一:如下图
方式二:如下图
执行结果
继续新建test_update_user_tag_api.py文件和test_delete_user_tag_api.py文件;自己拓展
步骤5、把用例整合一起执行,在runner文件下的run_api_tests.py中编写代码:
编写代码:
# encoding: utf-8 # @author: Jeffrey # @file: run_api_tests.py # @time: 2022/7/24 17:52 # @desc:import os import unittest# 获取当前路径 current_path = os.path.dirname(os.path.abspath(__file__)) # 测试用例路径 case_path = os.path.join(current_path, '../testcases')discover_obj = unittest.defaultTestLoader.discover(start_dir=case_path,pattern='test*.py')all_case_suite = unittest.TestSuite() # 把discover对象发现的用例加载到测试套件中 all_case_suite.addTest(discover_obj)unittest.main(defaultTest="all_case_suite", verbosity=2)
查看执行结果:
步骤6、生成测试报告,把HTMLTestReportCN.py文件放到common文件夹中并在run_api_tests.py文件中调整代码;
编写代码:
# encoding: utf-8 # @author: Jeffrey # @file: run_api_tests.py # @time: 2022/7/24 17:52 # @desc:import os import unittest from common import HTMLTestReportCN# 获取当前路径 current_path = os.path.dirname(os.path.abspath(__file__)) # 测试用例路径 case_path = os.path.join(current_path, '../testcases')discover_obj = unittest.defaultTestLoader.discover(start_dir=case_path,pattern='test*.py')all_case_suite = unittest.TestSuite() # 把discover对象发现的用例加载到测试套件中 all_case_suite.addTest(discover_obj)# unittest.main(defaultTest="all_case_suite", verbosity=2)report_path = os.path.join(current_path, '../reports/result.html') html_file_obj = open(report_path, 'wb')html_runner = HTMLTestReportCN.HTMLTestRunner(stream=html_file_obj,title='接口接口自动化测试',tester='YOU',description='学习接口框架')html_runner.run(all_case_suite)
执行后查看报告:
下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
相关文章:

接口自动化测试思路和实战 —— 编写线性测试脚本实战!
接口自动化测试框架目的 测试工程师应用自动化测试框架的目的: 增强测试脚本的可维护性、易用性(降低公司自动化培训成本,让公司的测试工程师都可以开展自动化测试)。 自动化测试框架根据思想理念和深度不同,渐进式的分为以下几种: 线性脚本框架 模块…...
python控制语句-1.2
目录 循环结构 while循环 for循环 循环结构练习-1 循环嵌套 循环结构练习-2 循环控制语句(continue & break) 循环结构 while循环 语法 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序&am…...

HTML 学习笔记(一)开始
一、介绍: 首先引用百度百科的一段话作为介绍: HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本…...
查看自己的ip地址的网站
有时候需要知道自己的ip地址,可以上这个网站查看: What Is My IP? Best Way To Check Your Public IP Address 网站的域名是https://www.whatismyip.com/ 还是挺好记的。...
ES分布式搜索-索引库操作
索引库操作 1、mapping映射属性 可以查看官方文档学习:ES官方手册 mapping是对索引库中文档的约束,常见的mapping属性包括: type:字段数据类型,常见的简单类型有: 字符串:text(可…...

Win11 没有网络bug
1.问题描述 没有网络,dns一直是固定的,但是dns已经是自动获取了(MAC地址随机) 2.解决办法 1.首先,删除所有网络的手动dns配置,控制中心那个dns管理没有用,在设置中删除网络,不然问题还会出现 - 2.然后,进入注册表\HKEY_LOCAL_MACH…...
洛谷 1025.数的划分
这道题用的知识点是DFS剪枝。难的不在DFS上,而是在剪枝上如何选择。 思路:这道题我们看到是按照字典序排的,但是,我们注意到,看似是全排列的递归,实则不是。 我们前面也了解过,全排列的数字大…...

MySQL实战:SQL优化及问题排查
有更合适的索引不走,怎么办? MySQL在选取索引时,会参考索引的基数,基数是MySQL估算的,反映这个字段有多少种取值,估算的策略为选取几个页算出取值的平均值,再乘以页数,即为基数 查…...

加密与安全_使用Java代码操作RSA算法生成的密钥对
文章目录 Pre概述什么是非对称加密算法?如何工作?示例:RSA算法特点和优势ECC:另一种非对称加密算法 Code生成公钥和私钥私钥加密私钥加密私钥解密 ( 行不通 )私钥加密公钥解密公钥加密和公钥解密 (行不通)保…...

Spring Boot中实现图片上传功能的两种策略
🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…...

07.axios封装实例
一.简易axios封装-获取省份列表 1. 需求:基于 Promise 和 XHR 封装 myAxios 函数,获取省份列表展示到页面 2. 核心语法: function myAxios(config) {return new Promise((resolve, reject) > {// XHR 请求// 调用成功/失败的处理程序}) …...

【Linux】第四十一站:线程控制
一、Linux线程VS进程 1.进程和线程 进程是资源分配的基本单位线程是调度的基本单位线程共享进程数据,但也拥有自己的一部分数据:线程ID一组寄存器(上下文)栈errno信号屏蔽字调度优先级 2.进程的多个线程共享 同一地址空间,因此Text Segment、…...

ChatGPT提示词工程:prompt和chatbot
ChatGPT Prompt Engineering for Developers 本文是 https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/ 这门课程的学习笔记。 ChatGPT提示词工程:prompt和chatbot 文章目录 ChatGPT Prompt Engineering for DevelopersWhat …...

java算法
常见的七种查找算法: 数据结构是数据存储的方式,算法是数据计算的方式。所以在开发中,算法和数据结构息息相关。 1. 基本查找 也叫做顺序查找 说明:顺序查找适合于存储结构为数组或者链表。 基本思想:顺序查找也称…...
铭文资产是比特币生态破局者 or 短暂热点?
比特币作为加密货币的鼻祖,一直以来都扮演着数字资产市场的引领者角色。最近几年,随着 BRC20 项目的兴起,我们看到了更多与比特币相互关联的创新。在比特币生态中,BRC20 项目不仅仅是数字资产的代表,更是一种对于区块链…...

Java基础 - 8 - 算法、正则表达式、异常
一. 算法 什么是算法? 解决某个实际问题的过程和方法 学习算法的技巧? 先搞清楚算法的流程,再直接去推敲如何写算法 1.1 排序算法 1.1.1 冒泡排序 每次从数组中找出最大值放在数组的后面去 public class demo {public static void main(S…...

gRPC-第二代rpc服务
在如今云原生技术的大环境下,rpc服务作为最重要的互联网技术,蓬勃发展,诞生了许多知名基于rpc协议的框架,其中就有本文的主角gRPC技术。 一款高性能、开源的通用rpc框架 作者作为一名在JD实习的Cpper,经过一段时间的学…...
Node.js是什么?
概念:Node.js1运行在服务器端的js,用来编写服务器 特点:单线程、异步、非阻塞、统一API 是一个构建在V8引擎之上的js运行环境,它使得js可以运行在浏览器以外的地方,相对于大部分的服务器端语言来说,Node.J…...

java SSM厂房管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
一、源码特点 java SSM厂房管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S…...

uniapp实现---类似购物车全选
目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 四、小结 注意事项 一、实现思路 点击商家复选框,可选中当前商家下的所有商品。点击全选,选中全部商家的商品 添加单个多选框,在将多选…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法
使用 ROS1-Noetic 和 mavros v1.20.1, 携带经纬度海拔的话题主要有三个: /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码,来分析他们的发布过程。发现前两个话题都对应了同一…...

基于Python的气象数据分析及可视化研究
目录 一.🦁前言二.🦁开源代码与组件使用情况说明三.🦁核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.🦁演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...

【见合八方平面波导外腔激光器专题系列】用于干涉光纤传感的低噪声平面波导外腔激光器2
----翻译自Mazin Alalus等人的文章 摘要 1550 nm DWDM 平面波导外腔激光器具有低相位/频率噪声、窄线宽和低 RIN 等特点。该腔体包括一个半导体增益芯片和一个带布拉格光栅的平面光波电路波导,采用 14 引脚蝶形封装。这种平面波导外腔激光器设计用于在振动和恶劣的…...