自学内容网 自学内容网

python自动化接口测试

前言

前情阅读,关于自动化接口测试的基础知识介绍,可以阅读如下文章。我的博文只是一个小白学习的笔记,抄了很多大佬的博文,但是最终都在参考文献中进行了说明,对此表示感谢。

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请求四种传送正文方式(详解) - 北京-宏哥 - 博客园

python接口自动化(十二)--https请求(SSL)(详解) - 北京-宏哥 - 博客园

python接口自动化测试 - requests库的post请求进行文件上传 - 小菠萝测试笔记 - 博客园


原文地址:https://blog.csdn.net/qq_41221411/article/details/142435159

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!