接口测试复习
一。基本概念
二。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文件。...
全排列[中等]
优质博文:IT-BLOG-CN 一、题目 给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例…...
mybatise-plus的id过长问题
一、问题情景 笔者在做mp插入数据库(id已设置为自增)操作时,发现新增数据的id过长,结果导致前端JS拿到的数据出现了精度丢失问题,原因是后端id的类型是Long。在网上查了一下,只要在该属性上加上如下注解就可以 TableId(value &q…...
图示矩阵分解
特征值与特征向量 设 A A A 是 n 阶矩阵,如果存在数 λ \lambda λ 和 n 维非零列向量 x x x,满足关系式: A x λ x ( 1 ) Ax \lambda x\quad\quad(1) Axλx(1) 则数 λ \lambda λ 称为矩阵 A A A 的特征值,非零向量 x…...
六、互联网技术——数据存储
文章目录 一、存储系统层次结构二、按照重要性分类三、磁盘阵列RAID三、RAID基础四、磁盘阵列分级五、数据备份与恢复六、容灾与灾难恢复 一、存储系统层次结构 常见的三层存储体系结构如下图所示,分为高速缓冲存储器、主存储器和外存储器。 二、按照重要性分类 …...
六、vpp 流表+负载均衡
草稿!!! vpp node其实就是三个部分 1、plugin init 2、set command 3、function 实现功能,比如这里的流表 今天我们再用VPP实现一个流表的功能 一、流表 1.1流表----plugin init VLIB_REGISTER_NODE 注册流表节点 // 注册流…...
word已排序好的参考文献,插入新的参考文献,序号更新
原排序好的文献序号。 现在在3号后面插入一个新文献。4,5号应该成为5,6 这时在3号后面,回车,就会自动的增长。如下图: 但是如果手滑,把[4]删除了如何排序?? 如下图: …...
二叉树的顺序存储——堆——初识堆排序
前面我们学过可以把完全二叉树存入到顺序表中,然后利用完全二叉树的情缘关系,就可以通过数组下标来联系。 但是并不是把二叉树存入到数组中就是堆了,要看原原来的二叉树是否满足:所有的父都小于等于子,或者所有的父都…...
CYEZ 模拟赛 9
A a ⊥ b ⇒ a − b ⊥ a b (1) a \perp b \Rightarrow a-b \perp ab \tag {1} a⊥b⇒a−b⊥ab(1) 证明: gcd ( a , b ) gcd ( b , a − b ) \gcd(a,b) \gcd(b, a-b) gcd(a,b)gcd(b,a−b),故 a − b ⊥ b a - b \perp b a−b⊥b,同…...
typescript: Builder Pattern
/*** file: CarBuilderts.ts* TypeScript 实体类 Model* Builder Pattern* 生成器是一种创建型设计模式, 使你能够分步骤创建复杂对象。* https://stackoverflow.com/questions/12827266/get-and-set-in-typescript* https://github.com/Microsoft/TypeScript/wiki/…...
WPS/word 表格跨行如何续表、和表的名称
1:具体操作: 将光标定位在跨页部分的第一行任意位置,按下快捷键ctrlshiftenter,就可以在跨页的表格上方插入空行(在空行可以写,表1-3 xxxx(续)) 在空行中输入…...
卖衣服的网站建设/网络科技公司
曾几何时,都不曾写过东西了,记得好像是从上大学开始吧! 以前文笔自认为还是不错的,现在远远不及以前那么有状态了。也许是人心态变了的缘故吧。以前比较单纯,现在比较浮躁;以前敢于幻想美好的东西ÿ…...
完整php网站开发/抚顺优化seo
房屋详情模块 业务:根据房源 id,展示房源详情信息 3.1 功能分析 功能: 使用路由参数获取房源 id 根据房源 id 获取房源详情数据并展示 使用地图展示所在小区位置信息 房源收藏(需要登录) 重点: 路由参数。 3. 房屋详情模块 3.2 页面模板说明 1. 创建房屋…...
平江高端网站建设/网推软件有哪些
mybatis是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory可以通过SqlSessionFactoryBuilder获得实例。使用mybatis-spring时,session创建,可以让SqlSessionFactoryBean来替代。 <bean name"sqlSessionFactoryBean" class&quo…...
wordpress做的网站吗/全国推广优化网站
类的初始化由执行类中静态代码块的初始化和类中声明的静态域的初始化两部分组成接口的初始化由接口中声明的域(常量)的初始化组成初始化的时机类或接口T在以下任意情况发生之前会立即进行初始化:T是一个类并且创建了一个T的实列T中声明的一个静态方法被调用T中声明的一个静态域…...
山西本土网站建设/营销型外贸网站建设
说明:我是通过Workbook方式来读取excel文件的,这次以登陆界面为例备注:使用Workbook读取excel文件,前提是excel需要2003版本,其他版本暂时不支持具体步骤: 第一步:新建一个excel文件,并且输入数…...
建设一个网站首先需要什么条件/天津网站建设技术外包
题面 先把每个串反着插进$Trie$树 每个节点的子树内,可能有一些节点是某些字符串的开头 每个节点挂一棵权值线段树,记录这些节点对应的原来字符串的编号 查询的时候在线段树上二分即可 为了节省空间,使用线段树合并 1 #include <vector>…...