3.接口自动化测试(2)

文章目录

  • 2.接口自动化测试
    • [2.3 第一个简单的接口自动化](#2.3 第一个简单的接口自动化)
    • [2.4 requests模块](#2.4 requests模块)
      • [2.4.1 安装](#2.4.1 安装)
      • [2.4.2 介绍](#2.4.2 介绍)
      • [2.4.3 常见请求方法](#2.4.3 常见请求方法)
      • [2.4.4 添加请求信息](#2.4.4 添加请求信息)
        • [1. 发送GET请求(带查询参数)](#1. 发送GET请求(带查询参数))
        • [2. 发送POST请求(表单数据)](#2. 发送POST请求(表单数据))
        • [3. 发送POST请求(JSON数据)](#3. 发送POST请求(JSON数据))
        • [4. 文件上传](#4. 文件上传)
        • [5. 携带Cookies](#5. 携带Cookies)
        • [6. 使用代理](#6. 使用代理)
        • [7. 基本认证](#7. 基本认证)
        • [8. SSL证书验证](#8. SSL证书验证)
        • [9. 超时设置](#9. 超时设置)
        • [10. 自定义Headers](#10. 自定义Headers)
        • [11.添加 cookie 信息](#11.添加 cookie 信息)

2.接口自动化测试

2.3 第一个简单的接口自动化

示例:对百度接口发起请求

python 复制代码
import requests
r = requests.get("https://www.baidu.com")
print(r)

返回值:

也有可能requests下面出现红色波浪线,提示没有安装requests模块,这个时候可以点击终端来查询到底有没有这个。

没安装也没啥,下一步安装。

安装了的最好也照做一下,省的版本不同导致问题发生。


2.4 requests模块

2.4.1 安装

命令行通过pip工具进行安装,命令:

python 复制代码
pip install requests==2.31.0

安装成功示例:

检查当前项目下包是否更新:

输入pip list来检查到底有没有更新版本:


2.4.2 介绍

requests 库是一个非常流行的HTTP客户端库,用于发送HTTP请求。 requests.get 方法用于发送一个HTTP get 请求到指定的URL

requests.get 方法返回一个 Response 对象,这个对象包含了服务器返回的所有信息。如:

Response 对象提供的属性/方法介绍:

属性/方法 描述
r.status_code 响应状态码
r.content 字节方式的响应体,会自动解码gzipdeflate压缩
r.headers 以字典对象存储服务器响应头,若键不存在则返回None
r.json() Requests 中内置的JSON解析方法,将响应体解析为JSON格式 (如果响应结果为JSON格式,必须以JSON打印)
r.url 获取实际请求的URL
r.encoding 编码格式,根据响应头部的字符编码确定
r.cookies 获取服务器设置的cookies
r.raw 返回原始响应体,不进行任何处理
r.text 字符串方式的响应体,会自动根据响应头部的字符编码进行解码 (如果响应结果为HTML格式,必须以test打印,否则代码报错)
r.raise_for_status() 失败请求(非200响应)抛出异常

例子:

代码:

python 复制代码
import requests
r = requests.get("https://www.baidu.com")

# 状态码
# print(r.status_code)
# 响应体
print(r.text)
# 打印响应头
print(r.headers)

打印:

python 复制代码
"D:\Program Files\Python39\python.exe" D:/code/python/接口自动化测试/apiAutotest01/test1.py
<html>
<head>
	<script>
		location.replace(location.href.replace("https://","http://"));
	</script>
</head>
<body>
	<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>
{'Accept-Ranges': 'bytes', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Content-Length': '227', 'Content-Security-Policy': "frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com https://sai.baidu.com https://mcpstore.baidu.com https://mcpserver.baidu.com https://www.mcpworld.com https://platform-openai.now.baidu.com;", 'Content-Type': 'text/html', 'Date': 'Mon, 08 Dec 2025 14:26:31 GMT', 'Pragma': 'no-cache', 'Server': 'BWS/1.1', 'Set-Cookie': 'BD_NOT_HTTPS=1; path=/; Max-Age=300, PSTM=1765203991; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, H_PS_PSSID=60275_63145_66232_66242_66285_66258_66393_66510_66515_66529_66559_66584_66591_66601_66647_66663_66670_66689_66743_66618_66756_66775_66782_66790_66829_66854_66599; path=/; expires=Tue, 08-Dec-26 14:26:31 GMT; domain=.baidu.com, BAIDUID=3D3ADC3C9DAB8339B5E073C394C0D114:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000, BAIDUID_BFESS=3D3ADC3C9DAB8339B5E073C394C0D114:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000; Secure; SameSite=None', 'Traceid': '1765203991162334055412487297369341595359', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'X-Xss-Protection': '1;mode=block'}

进程已结束,退出代码0

我们把打印的响应头调整一下格式:

python 复制代码
{
    'Accept-Ranges': 'bytes',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Length': '227',
    'Content-Security-Policy': "frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com https://sai.baidu.com https://mcpstore.baidu.com https://mcpserver.baidu.com https://www.mcpworld.com https://platform-openai.now.baidu.com",
    'Content-Type': 'text/html',
    'Date': 'Mon, 08 Dec 2025 14:26:31 GMT',
    'Pragma': 'no-cache',
    'Server': 'BWS/1.1',
    'Set-Cookie': 'BD_NOT_HTTPS=1; path=/; Max-Age=300, PSTM=1765203991; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, H_PS_PSSID=60275_63145_66232_66242_66285_66258_66393_66510_66515_66529_66559_66584_66591_66601_66647_66663_66670_66689_66743_66618_66756_66775_66782_66790_66829_66854_66599; path=/; expires=Tue, 08-Dec-26 14:26:31 GMT; domain=.baidu.com, BAIDUID=3D3ADC3C9DAB8339B5E073C394C0D114:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000, BAIDUID_BFESS=3D3ADC3C9DAB8339B5E073C394C0D114:FG=1; Path=/; Domain=baidu.com; Max-Age=31536000; Secure; SameSite=None',
    'Traceid': '1765203991162334055412487297369341595359',
    'X-Ua-Compatible': 'IE=Edge,chrome=1',
    'X-Xss-Protection': '1;mode=block'
}

然后我们打开百度查看:

可以发现响应头里面基本都是有的。


2.4.3 常见请求方法

python 复制代码
#发起get请求
def get(url, params=None, **kwargs)
#发起post请求
def post(url, data=None, json=None, **kwargs)
#支持不同请求方式,method:指定请求方法,
#支持`get`, `OPTIONS`, `HEAD`, `post`, `PUT`, `PATCH`, or `DELETE`
def request(method, url, **kwargs)
---------------------------------------------------
# **kwargs:其他请求参数(如headers、timeout等)

使用示例:

python 复制代码
import requests
get_r = requests.get("https://www.baidu.com")
post_r = requests.post("https://www.baidu.com")
req_r1 = requests.request(method="get", url="https://www.baidu.com")
req_r2 = requests.request(method="post", url="https://www.baidu.com")
print("get:", get_r.status_code)
print("post:", post_r.status_code)
print("method_get:", req_r1.status_code)
print("method_post:", req_r2.status_code)

打印:

当然我们也可以通过Postman来简单查看一下接口参数:


2.4.4 添加请求信息

get() 、 post() 底层都是调用 request() 方法,因此这三个方法在发送请求时,传参无太大区别,可传递的参数展示如下:

参数名 描述
url 请求的接口
headers 一个字典,包含要发送的HTTP头。
cookies 一个字典、列表或者 RequestsCookieJar 对象,包含要发送的cookies
files 一个字典,包含要上传的文件。
data 一个字典、列表或者字节串,包含要发送的请求体数据。
json 一个字典,将被转换为JSON格式并发送。
params 一个字典、列表或者字节串,将作为查询字符串附加到URL上。
auth 一个元组,包含用户名和密码,用于HTTP认证。
timeout 一个浮点数或元组,指定请求的超时时间。
proxies 一个字典,包含代理服务器的信息。
verify 一个布尔值或字符串,指定是否验证SSL证书。
1. 发送GET请求(带查询参数)
python 复制代码
import requests

# 定义查询参数
params = {'page': 1, 'limit': 20}

# 发送GET请求
response = requests.get(
    url='https://api.example.com/data',
    params=params,
    headers={'Authorization': 'Bearer token123'},
    timeout=5
)

print(response.json())  # 解析JSON响应

说明params将字典转换为URL查询字符串(如?page=1&limit=20),headers添加认证头,timeout设置请求超时时间。

python 复制代码
#带有参数
url = "http://8.137.19.140:9090/blog/getBlogDetail?blogId=15686"

#定义请求头
header = {       "User_token_header":"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MTc0MDAyNTE2MX0.vbujuCAUkChZVWFmXiH4w4T1_DFv7C_g_hMtx873v_A"
}

r = requests.request(method="GET",url=url,headers=header) # 这里没有params=param,因为url里面有
print(r.json())
python 复制代码
#这里的get请求,url上拼接的参数也可以单独拿下来写
url = "http://8.137.19.140:9090/blog/getBlogDetail"
param = {
    "blogId":15686
}

#定义请求头
header = {       "User_token_header":"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MTc0MDAyNTE2MX0.vbujuCAUkChZVWFmXiH4w4T1_DFv7C_g_hMtx873v_A"
}

r = requests.request(method="GET",url=url,params=param,headers=header)
print(r.json())
2. 发送POST请求(表单数据)
python 复制代码
import requests

# 表单数据
data = {'username': 'admin', 'password': '123456'}

# 发送POST请求
response = requests.post(
    url='https://api.example.com/login',
    data=data
)

print(response.text)

说明data参数自动将字典编码为表单格式(application/x-www-form-urlencoded)。

3. 发送POST请求(JSON数据)
python 复制代码
import requests

# JSON数据
json_data = {'name': 'John', 'age': 30}

# 发送POST请求
response = requests.post(
    url='https://api.example.com/users',
    json=json_data,
    headers={'Content-Type': 'application/json'}
)

print(response.json())

说明json参数自动序列化为JSON字符串,并设置Content-Typeapplication/json

4. 文件上传
python 复制代码
import requests

# 上传文件
files = {'file': open('report.pdf', 'rb')}

# 发送POST请求
response = requests.post(
    url='https://api.example.com/upload',
    files=files
)

print(response.text)

说明files参数支持多部分表单上传,适用于文件传输。

5. 携带Cookies
python 复制代码
import requests

# Cookies字典
cookies = {'session_id': '12345'}

# 发送GET请求
response = requests.get(
    url='https://api.example.com/profile',
    cookies=cookies
)

print(response.text)

说明cookies参数自动在请求中添加Cookie头。

6. 使用代理
python 复制代码
import requests

# 代理服务器配置
proxies = {
    'http': 'http://proxy.example.com:8080',
    'https': 'https://proxy.example.com:8080'
}

# 发送GET请求
response = requests.get(
    url='https://api.example.com/data',
    proxies=proxies
)

print(response.text)

说明proxies参数指定HTTP/HTTPS代理服务器。

7. 基本认证
python 复制代码
import requests

# 用户名和密码
auth = ('username', 'password')

# 发送GET请求
response = requests.get(
    url='https://api.example.com/protected',
    auth=auth
)

print(response.text)

说明auth参数自动添加Authorization头(Basic Auth)。

8. SSL证书验证
python 复制代码
import requests

# 禁用SSL验证(不推荐用于生产环境)
response = requests.get(
    url='https://api.example.com',
    verify=False  # 跳过SSL证书验证
)

print(response.text)

说明verify=False用于测试环境,生产环境应提供CA证书路径(如verify='/path/to/cert.pem')。

9. 超时设置
python 复制代码
import requests

# 设置超时(连接超时5秒,读取超时10秒)
response = requests.get(
    url='https://api.example.com',
    timeout=(5, 10)
)

print(response.text)

说明timeout可以是浮点数(总超时)或元组(连接超时,读取超时)。

10. 自定义Headers
python 复制代码
import requests

# 自定义请求头
headers = {
    'User-Agent': 'MyApp/1.0',
    'Accept-Language': 'en-US'
}

# 发送GET请求
response = requests.get(
    url='https://api.example.com',
    headers=headers
)

print(response.text)

说明headers参数覆盖默认请求头,常用于模拟浏览器或设置API密钥。


python 复制代码
#添加用户登录凭证--cookie(.Cnblogs.AspNetCore.Cookies)

url = "https://account.cnblogs.com/user/userinfo"
cookie = {
    ".Cnblogs.AspNetCore.Cookies":"CfDJ8KL9kPW-LSFBi_9YdTzcC08XCItelbe4irfXxh-_hmXnNBYIpKioLVHPniZ2Cx5_Y1UtiUo_6eNEdT3wppoRwqpaV_fXKi7mJzn12_u9YMEr_2IyNRAzZ4ulRWtylki3GHehwaRdnzwbcK2-iWsmNw9nz8FPnaBCApdQDS9FR8T4ddhO23pVl2H2_21tA5Rexfqg1GqdIhsqVQW0-tTIuKIMQFVXWkO6Ym2OMGeZpjZxS78aHInaPzdG5CXNSAlauBD2YgjQ85dw9XOr3BPhwALoSR0K0eLrbEu1IvAETwmwqu3SlQmdohLgOl5AzDYmdpTpXkoKR4AOTyrm0Ve2QZM8ikMBY4qRL-n3yAxu1psc-gfoF842tshikHpHrPlTK_oLnIIqnvlrMQ-f53lhGdwiirXmCLS6BaphK88n8VSc4l2s9vU6SZbfqEzp3-GmWLFoOpFne1CUldXJcB949pfUH_eRFiFt9oGI5-U52yJwjc3Pn_qEFspG_XxjHKuBW2SI01T3AtBTDEOi4bZNuwYw3QU2W7rK7KFlhI0TWo9mzGBxOP0Fpix6EqRORJYVPU7oNttBNicK_y2IMLJSu5w;"
}

r = requests.request(method="GET",url=url,cookies=cookie)

print(r.text)

问题:上传参数选择 paramsjson 还是 data

  • params 用于在URL中传递查询参数(Query Parameters),通常用于 GET 请求,但也可以用于其他类型的请求。
  • json 用于在请求体(Body)中传递 JSON 格式的数据,通常用于 POSTPUT 请求。
  • data 用于在请求体(Body)中传递表单数据,通常用于 POSTPUT 请求。
    若参数上传格式选择为 json 格式, Content-Type 会自动被设置为application/json
    有了 requests 库,可以实现对接口发起 http 请求,然而自动化测试中,我们需要编写大量的测试用例,这些用例的组织、执行和管理也需要使用其他更强大的框架------ pytest 框架。

requests 库专注于HTTP请求的发送,而 pytest 框架则提供了测试的组织、执行和管理功能。

相关推荐
少云清1 天前
【接口测试】5_Postman _Postman请求前置脚本
测试工具·接口测试·postman
2501_924064112 天前
PC软件多系统兼容性测试覆盖策略与不同系统适配方案对比
接口测试
爱尔兰极光2 天前
软件测试--接口测试
接口测试·测试
百度测试开发3 天前
超细整理,性能测试如何做?怎么做?常见面试题(汇总五)
自动化测试·软件测试·软件测试工程师·接口测试·软件测试项目·软件测试面试·性能测试
程序员杰哥3 天前
如何使用Postman做接口自动化测试?
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
2501_924064113 天前
2025年优测压测平台与JMeter效率成本对比及行业实践
jmeter·接口测试·压测方案
程序员杰哥4 天前
接口测试之文件上传
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
少云清5 天前
【接口测试】5_接口测试基础 _接口文档解析
接口测试·接口文档分析
2501_924064116 天前
优测工具如何测试接口最大并发量及实践方法
性能优化·接口测试·最大并发量·优测工具·压测方案