接口测试-http协议
http协议(超文本传输协议),基于TCP/IP模型应用层协议。
HTTP协议之URL组成
HTTP协议请求模型
HTTP由请求和响应构成,是一个标准的客户端服务其模型(B/S架构)。
HTTP协议永远都是客户端发起请求,服务其回送响应。
HTTP请求过程
HTTP协议请求类型
GET:从服务器端获取资源或数据。
POST:向服务器端提交数据。
两者区别:
HTTP抓包:fiddler抓包
HTTP请求组成部分:URL 地址、请求参数、请求头、请求体(仅限POST请求)
HTTP状态码:
1:临时响应需要请求者继续执行操作。
2:请求成功。操作被成功接受并处理。
3:重定向代码,用0于已经移动的文件并且在头信息中指定新的地址信息。
4:客户端错误,请求包含语法错误或无法完成请求。
5:服务器错误,服务器在请求处理的过程中发生错误。
接口设计文档:
接口说明
请求方式
请求URL
请求参数
返回数据
返回示例
接口测试用例设计
Python库完成接口测试(requests使用)
安装
pip install requests
方法 | 说明 |
---|---|
requsts.requst() | 构造一个请求,最基本的方法,是下面方法的支撑 |
requsts.get() | 获取网页,对应HTTP中的GET方法 |
requsts.post() | 向网页提交信息,对应HTTP中的POST方法 |
requsts.head() | 获取html网页的头信息,对应HTTP中的HEAD方法 |
requsts.put() | 向html提交put方法,对应HTTP中的PUT方法 |
requsts.delete() | 向html提交删除请求,对应HTTP中的DELETE方法 |
requsts.patch() | 向html网页提交局部请求修改的的请求,对应HTTP中的PATCH方法 |
1.带参发送get请求
一、直接添加参数
def test1():
resq = requests.get('http://www.baidu.com/s?wd=python')
print(resq.text) #获取响应对象的文本信息
print(resq.status_code) #响应状态码信息
print(resq.url) #获取响应对象所请求的地址
二、
通过定义一个字典,然后在请求中添加pramas参数来实现
data={
'wd':'python',
'name':'fanyun'
}
resq = requests.get('http://www.baidu.com/s,params=data)
print(resq.url)
常用参数
参数 | 类型 | 作用 |
---|---|---|
params | 字典 | url为基准的url地址,不包含查询参数;该方法会自动对params字典编码,然后和url拼接 |
url | 字符串 | requests 发起请求的地址 |
headers | 字典 | 请求头,发送请求的过程中请求的附加内容携带着一些必要的参数 |
cookies | 字典 | 携带登录状态 |
proxies | 字典 | 用来设置代理 ip 服务器 |
timeout | 整型 | 用于设定超时时间, 单位为秒 |
2.POST请求
resq = resquest.post('http://localhost:8080/mms/login/loginUser',data=data)
print(resq.text)
post中以json方式传递参数
当content-type为json时
resq = resquest.post('http://localhost:8080/mms/login/loginUser',json=data)
常用参数
参数 | 作用 | 类型 |
---|---|---|
data | 字典 | 作为向服务器提供或提交资源时提交,主要用于 post 请求 |
json | 字典 | json格式的数据, json合适在相关的html |
3.head请求头
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.69'
}
resq = resquest.post('https://www.qq.com/ninja/visual_focus_20200724.htm',headers=headers)
print(resq.text)
4.请求头中添加cookies
headers = {
'Cookies':'RK=cwdAEfkxb4; ptcz=b6b05f650ff84c20004a2865c458c4ea4e7f7b946eb62; pgv_pvid=52713; pac_uid=0_38e3475c81; ptui_loginuin=1213616@qq.com; iip=0; pgv_info=ssid=s88648; ts_last=www.qq.com/; ts_refer=cn.bing.com/; ts_uid=38960742; ad_play_index=75'
}
resq = resquest.post('https://mail.qq.com/cgi-bin/frame_html?sid=2rLQSm8v7r2tUxt-&r=ef68759052b39566a0a2b4076f2e92c5&lang=zh',headers=headers)
print(resq.text)
5.session保持会话状态
需要授权的API都需要session
def test():
sess = requests.Session()
data = {
'username':'admin',
'password':'admin123'
}
sess.post('http://localhost:8080/mms/login/loginUser',data=data) #登录操作
resq = sess.get('http://localhost:8080/mms/login/GetLoginName')
print(resq.text)
6.上传下载文件
不带参数
def test():
files = {
'file':open('test.txt','rb')
} #r:读取文件 b:二进制方式读取文件
resq = resquest.post('http://www.fanyunedu.com:5000/general/api/upload',files=files)
print(resq.text)
if __name__ == '__main__':
test()
带参数
def test():
data = {
'batchname':'GB20210707'
}
files = {
'batchfile':open('销售出库单-Test.xls','rb')
} #r:读取文件 b:二进制方式读取文件
resq = resquest.post('http://www.fanyunedu.com:5000/general/api/upload',data=data,files=files)
print(resq.text)
if __name__ == '__main__':
test()
7.加密接口测试
8.接口参数关联
接口响应内容
主要有三种形式:JSON格式的字符串、HTML源码、程序员自定义的字符串
主要的处理方式:
处理方式一:正则表达式来进行处理(万能),这种方法适合于以上任意一种格式。
处理方式二:lxml库进行处理,这种方式仅针对于返回内容是HTML格式的字符串
处理方式三:直接使用requests库自带的json方法进行处理,这种方式仅针对于返回内容是json格式的字符串。
正则表达式符号