接口测试复习
一。基本概念
二。HTTP协议
三。HTTP请求
示例:POST http://demo.zentao.net/user-login.html HTTP/1.1Host: demo.zentao.netUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101Firefox/68.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateReferer: http://demo.zentao.net/user-login.htmlContent-Type: application/x-www-form-urlencodedContent-Length: 54Connection: keep-aliveUpgrade-Insecure-Requests: 1account=demo&password=efc4a3b32e48054865e5a8321cfda3e4
四。HTTP响应
响应行也叫状态行
四。接口规范
五。接口测试流程
六。接口文档解析
七。Requests库
resp = requests.请求方法(url='URL地址', params={k:v}, headers={k:v},
data={k:v}, json={k:v}, cookies='cookie数据'(如:令牌))
请求方法:
get请求 - get方法
post请求 - post方法
put请求 - put方法
delete请求 - delete方法
url:要访问的地址 - string类型
params:查询参数 - 字典
headers:请求头 - 字典
data:表单格式请求体数据 - 字典 -
json:json格式请求体数据 - 字典 -cookies:用来传递cookies
resp:代表响应结果。
==获取指定响应数据==
常用:
获取 URL: resp.url
==获取 响应状态码:resp.status_code==
获取 Cookie:resp.cookies
获取 响应头:resp.headers
获取 响应体:
文本格式:resp.text
==json格式:resp.json()==。 如果看到 JSONDecodeError 错误提示,说明 不能转换为 json
八。cookies和session
设置cookies
获取cookies:cookies=response.cookies
requests.get(url,cookies={"c1":"v1"}
Cookie简介
-
cookie 是工程师,针对 http协议 是无状态这一特征,设计的一种技术。
-
cookie 将数据保存在浏览器端。默认存储空间大小为 4k(可以修改)。
-
cookie 中的数据,用户和随意获取,没有安全性可言。
-
cookie 中存放的数据类型,受浏览器限制。
-
cookie 中大多存放于网络通信相关的不敏感数据信息。提高访问速度。如:用户名、登录状态等。

Session简介
概念:也叫 会话!从客户端登录服务器开始,直到客户端退出登录,所产生的所有通信数据,保存在 session中。
-
session 将数据存在服务器端
-
session 使用服务器存储空间,没有大小限制。
-
session 支持的数据类型,受服务器主机影响。几乎支持所有数据类型。
-
session 中的数据,大都采用 加密、转码存储。安全性较高。
Session自动管理Cookie
因为,cookie中的数据,都是由 session 提供的。
实现步骤:
创建 session 对象(实例)。 my_session = requests.Session()【注意:() 不能丢!!!】
使用 session实例,调用get方法,发送 获取验证码请求(不需要提取cookie)。 my_session.get()
使用同一个 session实例,调用post方法,发送登录请求(不需要携带cookie)。my_session.post()
使用同一个 session实例,调用get方法,发送查看我的订单页面请求(不需要携带cookie)。my_session.get()
# 导包
import requests# 1. 创建session实例
my_session = requests.Session()# 2. 使用session实例,调用 get方法,发送 获取验证码请求
resp1 = my_session.get(url="http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=verify")
# print(resp1.text)# 3. 使用同一个session实例,调用 post方法,发送 登录请求。(正确 用户名、密码)
resp2 = my_session.post(url="http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=do_login",
data={"username": "13812345678", "password": "123456", "verify_code": "8888"})
print("登录结果:", resp2.json())# 4. 使用同一个session实例,调用 get方法,查询我的定义页面。
resp3 = my_session.get(url="http://tpshop-test.itheima.net/Home/Order/order_list.html")# 5. 打印响应结果
print("我的订单页面:", resp3.text)
面试题 Cookie 和 Session 区别
-
数据存储位置:
-
Cookie 存储在 浏览器端
-
Session 存储在 服务器端
-
-
安全性:
-
Cookie 直接存储在浏览器,可以任意获取,没有安全性可言。
-
Session 存储在 服务器端,采用 加密、转码形式存储数据,安全性较高。
-
-
数据类型
-
Cookie 直接存储在浏览器,支持测试数据类型受浏览器限制
-
Session 存储在 服务器端,服务器就是一台主机。因此几乎支持所有的数据类型。
-
-
大小:
-
Cookie 默认大小 4k(可调)
-
Session 直接使用服务器存储。没有大小限制。
-
九。PyMySQL操作数据库
==操作步骤==
导包 import pymysql
创建 连接 conn = pymyql.connect()
创建 游标 cursor = conn.cursor()
执行 SQL 语句 cursor.execute( “sql 语句” )
查询语句 select —— 不修改数据库,会返回结果集
从结果集中,提取 想要的数据 cursor.fetch*()
增删改语句 insert、update、delete —— 没有 结果返回,会修改数据库
执行成功:提交事务。conn.commit()
执行失败:回滚事务。conn.rollback()
关闭游标 cursor.close()
关闭连接 conn.close()
十。日志收集
十一。代码分层
-
分层思想:
-
按代码功能,划分为 接口对象层、测试脚本层
-
-
接口对象层:
-
负责 发送 http请求,访问待测接口。返回响应数据。
-
-
测试用例层(测试脚本层):
-
调用 接口,按响应数据,断言完成测试。
-

封装思想:
-
将 普通方式实现代码中,固定不变的,直接写到方法的实现内部。
-
将动态变化的,从参数传入。
-
将响应结果,通过返回值 return
十二。Unittest框架
unittest是Python标准库中的一个单元测试框架,用于编写和执行单元测试。它提供了一组用于编写测试用例、运行测试以及生成测试报告的类和方法。
下面是unittest框架的一些重要概念和使用方法:
-
测试用例(Test Case):测试用例是单元测试的最小单位,它是一个独立的测试单元,用于验证代码的某个具体功能或行为。通常继承自
unittest.TestCase类,并包含一个或多个测试方法。 -
测试方法(Test Method):测试方法是测试用例中的一个函数,以
test_开头,用于执行具体的测试逻辑。可以在测试方法中使用断言(assert)来验证预期结果和实际结果是否一致。 -
测试套件(Test Suite):测试套件是由多个测试用例组成的集合,用于按照一定顺序运行多个测试。
-
测试运行器(Test Runner):测试运行器是用于执行测试的工具,可以运行单个测试用例、单个测试模块或整个测试套件,并生成测试报告。
-
断言方法(Assertion Methods):断言方法是用于验证测试结果的方法,可以判断实际结果与预期结果是否相等、是否为真等。例如,
assertEqual()用于判断两个值是否相等。
十三。参数化
参数化步骤
将 测试数据,按 [{},{},{}] 格式 组织到 json文件中。
读取 json文件,将数据转换为 [(),(),()]
在通用测试方法上一行,添加 @pytest.mark.parameterize()
给 parameterize() 传参。参1:字符串类型,内容为 json文件中一组数据的 key。参2:[(),(),()]格式数据。
给 通用测试方法添加形参,与 parameterize() 参1 字符串的内容一致。
修改 通用测试方法 内部实现,使用形参。
# 将测试数据 组织到 json文件中
[{"x": 10, "y": 20, "expect": 30},{"x": 100, "y": 200, "expect": 300},{"x": 1000, "y": 2000, "expect": 3000}
]
--------------------------------------------------------------
import pytest
import json# 待测 函数
def add(x, y):return x + y# 封装函数,读取json文件,将 [{},{},{}] 数据 转换为 [(),(),()] 格式的数据
def read_json_data(filename):with open(filename, "r", encoding="utf8") as f:json_data = json.load(f)data_list = []for data in json_data:val = data.values()tmp = tuple(val)data_list.append(tmp)# 必须返回,不能在 for 内return data_list # 返回 [(10, 20, 30), (100, 200, 300), (1000, 2000, 3000)]# 结合 pytest 定义测试类
class TestAddFunc(object):@pytest.mark.parametrize("x, y, expect", read_json_data("add_data.json")) # 参2 要求必须是 [(),(),()] 格式的数据def test_add(self, x, y, expect): # 通用测试方法res = add(x, y) # 调用 待测函数,得实际结果assert expect == res # 断言
十四。接口自动化测试框架
目录结构
api/:接口对象层(代码:python package)
scripts/:测试脚本层(代码:python package)
common/:通用工具方法、函数(代码:python package)
data/:测试数据文件(文件:dir)
report/:测试报告(文件:dir)
config.py: 项目中的 配置信息。(全局变量)
pytest.ini: pytest 配置

1.在data/下组织数据文件
2.
-
在 common/ 下创建 文件 read_json_file.py
-
在 文件内,创建 函数,读取json文件中的数据,转换成 [(),(),()] 格式数据
-
测试此函数功能通过
-
建议读取 json文件时,使用 绝对路径法传入文件名
-
在 config.py 中,添加 全局变量,获取 项目目录
BASE_DIR = os.path.dirname(__file__) -
拼接 json文件的绝对路径
filename = BASE_DIR+"/data/login_data.json" -
使用 绝对路径,传入 json文件读取函数。
read_json_data(filename)
import json# 定义工具函数,读取json文件中的数据,转换成 [(),(),()] 格式数据
def read_json_data(filename):with open(filename, "r", encoding="utf8") as f:json_data = json.load(f)login_list = []for data in json_data:tmp = tuple(data.values())login_list.append(tmp)return login_listif __name__ == '__main__':res = read_json_data("../data/login_data.json")print(res)
3.在common下写断言工具和数据库操作类
4.在api下写登录工具和员工管理工具
5.解决重复手机号问题,
-
在 测试 添加员工接口前(setup),保证 数据库中,无此手机号!执行 delete SQL语句,将欲使用的手机号删除。
-
使用 这个手机号,展开 添加员工接口的 测试。
-
在 测试 添加员工接口结束后(teardown),删除 添加员工接口测试时,使用的手机号。
def setup(self):del_sql = f"delete from bs_user where mobile='{TEL}';"DBTools.db_uid(del_sql)def teardown(self):del_sql = f"delete from bs_user where mobile='{TEL}';"DBTools.db_uid(del_sql)
6.获取请求头
-
在 common/ 下创建文件 get_header.py
-
文件中添加 代码,获取请求头,并测试无误
from api.ihrm_login_api import IhrmLoginApidef get_header():req_data = {"mobile": "13800000002", "password": "123456"}resp = IhrmLoginApi.login(req_data)header = {"Authorization": resp.json().get("data")}return headerif __name__ == '__main__':ret = get_header()print(ret)
7.生成测试报告,储存在report目录下

十五。全量字段校验
十六。Dubbo
相关文章:
接口测试复习
一。基本概念 接口概念:系统与系统之间 数据交互的通道。 接⼝测试概念:校验 预期结果 与 实际结果 是否⼀致。 特征: 测试⻚⾯测试发现不了的问题。(因为:接⼝测试 绕过前端界⾯。 ) 符合质量控制前移理…...
获取医疗器械板块的个股列表
获取医疗器械板块的个股列表,用python爬虫做到(数据网址:板块 - 医疗器械概念 - 股票行情中心 - 搜狐证券) import requests from bs4 import BeautifulSoup # 获取医疗器械概念个股列表url "https://q.stock.sohu.com/cn/…...
1026 程序运行时间
要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。同时还有一个常数 CLK_TCK&…...
博途1200/1500 ALT指令
SMART PLC的ALT指令实现代码,请查看下面文章博客 SMART PLC如何构造ALT指令_smart200类似alt指令-CSDN博客单按钮启停这些老生常谈的问题,很多人感兴趣。这篇博文讨论下不同的实现方法,希望对大家有所帮助。指令虽然简单,但是在编程的时候合理使用对我们高效率编程帮助还是…...
11、视频分类建议
8、绩效看板与日清计划 9、大小屏分离与精细化审核 10、质量审核的设立与合并 视频分类印象深刻,因为这是我亲手做的第一个增效工具。 审核的其中一个任务是保证视频分类信息的准确性,账号本身是有一个缺省分类的,内容上传之后默认使用账号…...
【计算机组成原理】考研真题攻克与重点知识点剖析 - 第 2 篇:数据的表示和运算
前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…...
使用maven框架搭建一个IDEA插件项目
以下是使用 Maven 框架搭建 IDEA 插件项目的步骤: 打开 IDEA,点击 File -> New -> Project,选择 Maven。 在弹出的 New Project 窗口中,选择 Maven,然后选择 Create from archetype,找到 Maven 插件…...
第二届全国高校计算机技能竞赛——C++赛道 题解
Powered by:NEFU AB-IN Link 文章目录 第二届全国高校计算机技能竞赛——C赛道A 互不侵犯题意思路代码 B 奖学金题意思路代码 C 领导者题意思路代码 D 空调题意思路代码 E 字符操作变换题意思路代码 第二届全国高校计算机技能竞赛——C赛道 A 互不侵犯 题意 在象棋中ÿ…...
八大排序源码(含优化)
文章目录 1、直接插入排序2、希尔排序3、选择排序4、冒泡排序5、堆排序6、快速排序快速排序递归实现霍尔法挖坑法前后指针法快速排序小区间优化 快速排序非递归实现 7、归并排序归并排序递归实现归并排序非递归 8、计数排序 大家好,我是纪宁,这篇文章是关…...
单调队列---数据结构与算法
简介 队列也是一种受限制的线性表和栈相类似,栈是先进后出,而队列是先进先出,就好像一没有底的桶,往里面放东西,如图 在这里也是用数组来实现队列,用数组实现的叫做顺序队列 队列的数组模拟 const int N…...
小程序如何使用自定义组件
使用自定义组件的步骤如下: 创建自定义组件:在小程序项目根目录下的 components 文件夹中创建一个文件夹,然后在该文件夹中创建一个 .json 文件、一个 .wxml 文件和一个 .js 文件,这三个文件分别对应组件的配置、模板和逻辑。 在…...
归并排序含非递归版
目录 1.归并排序的原理 2.实现归并排序 2.1框架 2.2区间问题和后序遍历 2.3归并并拷贝 2.4归并排序代码 2.5测试 3.非递归实现归并排序 3.1初次实现 3.2测试 3.3修改 3.4修改测试 1.归并排序的原理 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治…...
项目进展(八)-编写代码,驱动ADS1285
一、代码 根据芯片的数据手册编写部分驱动,首先看部分引脚的波形: DRDY: CS: 首先在代码初始化时连续写入三个寄存器: void WriteReg(uint8_t startAddr, uint8_t *regData, uint8_t number) {uint8_t i0;// 循环写number1次…...
【MyBatis-Plus】快速精通Mybatis-plus框架—快速入门
大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…...
docker 安装kafka
运行容器 zookeeper: [rootk8s-master ~]# docker run -d --restartalways --log-driver json-file --log-opt max-size100m --log-opt max-file2 --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime zookeeper c603f292813cfd6e2b16fff88a9767cc86fc9bba34d82…...
容器内获得apiserver地址
1.容器的Env的KUBENETES_SERVICE_HOST字段 roottomcat01-69fc8f859b-w9btn:/tmp# env | grep KUBERNETES_SERVICE_HOST10.96.0.1 KUBERNETES_SERVICE_HOST10.96.0.12.通过域名查询 nslookup getent hosts roottomcat01-69fc8f859b-w9btn:/tmp# getent hosts kubernetes.def…...
linux服务端c++开发工具介绍(vscode版)
本文适合于有一定c开发经验,但是还不明确如何到linux服务端开发程序的同学。 一、vscode 几年前用的是ssh到云服务上,再用vim在云上开发的形式 ssh dongbeijing.dbj11.158.142.176 vim hello.c 现今,由于vscode比较好用,这几年…...
Linux常用命令大全
Linux常用命令大全 一、文件&目录管理1. 文件和目录操作命令2. 查看文件及内容处理命令3. 文件压缩及解压缩命令4. 搜索文件命令5. 其他 二、Linux 软件包管理三、用户管理1. 用户管理2. 查看系统用户登陆信息的命令 四、进程管理五、网络通信1. 基础网络操作命令2. 深入网…...
Python中取2023, 9, 1——2023, 10, 31的全部时间
使用datetime.date()函数定义了开始和结束日期。然后,我们使用datetime.timedelta()类创建了一个时间范围,其中n表示从开始日期到结束日期之间的天数。最后,我们使用一个for循环迭代时间范围内的日期,并打印每个日期。示例代码演示…...
创建django文件
1、在指定目录里打开终端,输入D:\Softwares\Anaconda3\envs\pytorch\Scripts\django-admin .exe startproject 名称 ,即可在对应目录里创建django文件。...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

