前言
前情阅读,关于自动化接口测试的基础知识介绍,可以阅读如下文章。我的博文只是一个小白学习的笔记,抄了很多大佬的博文,但是最终都在参考文献中进行了说明,对此表示感谢。
python接口自动化(一)--什么是接口、接口优势、类型(详解) - 北京-宏哥 - 博客园
python接口自动化(二)--什么是接口测试、为什么要做接口测试(详解) - 北京-宏哥 - 博客园
python接口自动化(三)--如何设计接口测试用例(详解) - 北京-宏哥 - 博客园
python接口自动化(四)--接口测试工具介绍(详解) - 北京-宏哥 - 博客园
python接口自动化(五)--接口测试用例和接口测试报告模板(详解) - 北京-宏哥 - 博客园
python接口自动化(六)--发送get请求接口(详解) - 北京-宏哥 - 博客园
一、request的基础使用
如果想用python做接口测试,我们首先有不得不了解和学习的模块。它就是第三方模块:Requests。 虽然Python内置的urllib模块,用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。更好的方案是使用requests。它是一个Python第三方库,处理URL资源特别方便。查看其中文官网:http://cn.python-requests.org/zh_CN/latest/index.html 英文官网:http://www.python-requests.org/en/master/ 可以看一下它的很多实用的高级功能。
Requests 完全满足今日 web 的需求。
- Keep-Alive & 连接池
- 国际化域名和 URL
- 带持久 Cookie 的会话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 key/value Cookie
- 自动解压
- Unicode 响应体
- HTTP(S) 代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
1.1 Get请求的使用
1、将安装好的requests模块导入后,通过GET访问一个URL地址的网页页面,如:https://www/douban.com
2、这里的 r 也就是 response,请求后的返回值,可以调用 response 里的 status_code 方法查看状态码
3、状态码 200 只能说明这个接口访问的服务器地址是对的,并不能说明功能 OK,一般要查看响应的内容,r.text 是返回文本信息。具体的使用如下所示
'''
1、导入包
2、发送get的请求
3、打印结果
'''
import requests
r=requests.get("http://www.baidu.com")
# 响应的状态
print(r.status_code)
# 字节方式的响应体,会自动为你解码gzip和deflate压缩
print(r.content)
# 以字典对象存储服务器响应头,若键不存在则返回None
print(r.headers)
# Requests中内置的JSON
# print(r.json())
# 获取url
print(r.url)
# 编码格式
print(r.encoding)
# 获取cookie
print(r.cookies)
# 返回原始响应体
print(r.raw)
# 字符串方式的响应体,会自动根据响应头部的字符编码进行
print(r.text)
# 失败请求(非200响应)抛出异常
print(r.raise_for_status())
请求响应状态码说明如下链接所示:python接口自动化(七)--状态码详解对照表(详解) - 北京-宏哥 - 博客园
使用fastapi作为后端,实现接口get测试用例,代码如下所示:
@router.get("/passport/user/loginget")
def passport_user_login_get(username:str,password:str):
if username == "admin" and password == "admin":
print("当前进入到passport_user_login_get函数中,用户名和密码正确")
return {"status": 200, "msg": "登录成功"}
else:
print("当前进入到passport_user_login_get函数中,用户名和密码错误")
raise HTTPException(status_code=401, detail="用户名或密码错误")
写一个接口测试的代码
import requests
url = 'http://127.0.0.1:8080/passport/user/loginget'
param={
'username':'admin',
'password':'admin'
}
'''通过requests库发送get请求'''
response = requests.get(url=url,params=param,verify=False)
print(response.json())
print(response.text)
verify=False 参数用于禁用 SSL 证书验证。默认情况下,requests 会验证服务器的 SSL 证书。如果服务器使用的是自签名证书或者没有设置 SSL 证书,你可以通过设置 verify=False 来忽略验证。如果你访问的是 HTTPS URL,而本地环境没有配置 SSL,则可能会抛出 SSL 错误,通过设置 verify=False 可以避免这个问题。
1.2Post的请求使用
同1.1所示,代码如下所示:
后端代码
class UserLogin(BaseModel):
username: str
password: str
@router.post("/passport/user/loginpost")
def passport_user_login_post(userlogin: UserLogin):
if userlogin.username == "admin" and userlogin.password == "admin":
print("当前进入到passport_user_login_post函数中,用户名和密码正确")
return {"status": 200, "msg": "登录成功"}
else:
print("当前进入到passport_user_login_post函数中,用户名和密码错误")
raise HTTPException(status_code=401, detail="用户名或密码错误")
接口脚本进行访问
import requests
url = 'http://127.0.0.1:8080/passport/user/loginpost'
param={
'username':'admin',
'password':'admin'
}
'''通过requests库发送post请求'''
response = requests.post(url=url,json=param,verify=False)
print(response.json())
print(response.text)
请求状态返回信息分析,代码如下
import json
import requests
url = 'http://127.0.0.1:8080/passport/user/loginpost'
param={
'username':'admin',
'password':'admin'
}
'''通过requests库发送post请求'''
res = requests.post(url=url,json=param,verify=False)
print('请求url: ' + res.url)
print('响应内容 json格式: ' + json.dumps(res.json()))
print('响应内容 字符串格式: ' + res.text)
print('响应内容 二进制格式: ' + str(res.content))
print('响应码: ' + str(res.status_code))
二、post请求四种传送正文的方式
application/x-www-form-urlencoded
: 用于表单数据提交,适合简单键值对。multipart/form-data
: 用于文件上传,适合多部分内容。application/json
: 用于发送结构化的 JSON 数据,适合 API 和复杂数据。text/plain
: 用于发送纯文本,适合简单的文本数据。
2.1文件上传
后端代码
@router.post("/passport/upload")
async def passport_upload_file(file: UploadFile = File(...)):
# 创建保存上传文件的目录
UPLOAD_DIR = "uploaded_files"
if not os.path.exists(UPLOAD_DIR):
os.makedirs(UPLOAD_DIR)
print("当前进入到passport_upload_file函数中,上传文件成功")
# 构建保存文件的路径
file_location = os.path.join(UPLOAD_DIR, file.filename)
# 将文件保存到服务器
with open(file_location, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
contents = await file.read()
buffer.close()
return {"filename": file.filename,"content_size": len(contents),"content_type": file.content_type}
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户上传文件</title>
</head>
<body>
<form action="http://127.0.0.1:8080/passport/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">Upload</button>
</form>
</body>
</html>
接口测试的实现
import requests
headers = {"Content-Type": "multipart/form-data"}
url = "http://127.0.0.1:8080/passport/upload"
files = {'file': open('example.txt', 'rb')} # 打开要上传的文件
response = requests.post(url, files=files) # 使用 `files` 参数上传文件
print(response.json())
2.2 表单请求测试
后端代码
@router.post("/passport/user/loginpost_form")
async def passport_user_login_post_form(username: str = Form(...), password: str = Form(...)):
if username == "admin" and password == "admin":
print("当前进入到passport_user_login_post_form函数中,用户名和密码正确")
return {"status": 200, "msg": "登录成功"}
else:
print("当前进入到passport_user_login_post_form函数中,用户名和密码错误")
raise HTTPException(status_code=401, detail="用户名或密码错误")
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--表单直接这样访问get的形式-->
<form action="http://127.0.0.1:8080/passport/user/loginget" method="get">
<input type="text" name="username" value="admin">
<input type="password" name="password" value="admin">
<button type="submit">Login</button>
</form>
<form action="http://127.0.0.1:8080/passport/user/loginpost_form" method="post">
<input type="text" name="username" value="admin">
<input type="password" name="password" value="admin">
<button type="submit">Login</button>
</form>
</body>
</html>
展示效果
参考文献
python接口自动化(六)--发送get请求接口(详解) - 北京-宏哥 - 博客园
python接口自动化(七)--状态码详解对照表(详解) - 北京-宏哥 - 博客园
python接口自动化(八)--发送post请求的接口(详解) - 北京-宏哥 - 博客园
python接口自动化(九)--python中字典和json的区别(详解) - 北京-宏哥 - 博客园
python接口自动化测试 - requests库的基础使用 - 小菠萝测试笔记 - 博客园
python接口自动化(十)--post请求四种传送正文方式(详解) - 北京-宏哥 - 博客园