python之接口自动化测试
1、接口自动化测试
1.1 概念
接口测试:是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相互逻辑依赖关系。
自动化测试:是把人为驱动的测试行为转化为机器执行的一种过程。
接口自动化测试:是让程序或工具替代人工自动的完成对接口进行测试的一种过程。
2、requests库
requests库是用python编写的,基于urllib,采用apache2 licensed开源协议的的第三方库,专为http通信而设计,旨在使网络请求更加简单和人性化。
相比urllib库,requests库更加方便,可以节约我们大量的工作,完全满足http测试需求。
特点:
-
简单易用:requests提供了简洁明了的API,使得发送http请求变得非常直观。与python的标准库urllib相比,requests的语法更加简洁,易于学习和使用。
-
功能全面:requests支持http中所有的主要方法,如:get、post、put、delete等。支持设置请求头、请求体、超时时间、代理等。requests支持会话保持、文件上传、自动内容解码、和json解析等功能。
-
自动化处理:requests库内部处理了许多底层细节,如连接池管理、keep- alive连接、URL编码等,使得开发者可以专注于业务逻辑无需关系底层的http通信细节。
-
良好的文档和社区支持:requests拥有详尽的官方文档和活跃的社区,这意味着开发者可以轻松地找到问题的答案或获得帮助。
-
兼容性:requests库在python2和python3中都可以使用,也与许多其他python库和框架兼容。
-
安全:requests在处理https请求时,提供了ssl验证和证书管理功能,确保通信的安全性。
3、安装requests
pip install requests
属性名 | 描述 |
---|---|
method | HTTP方法,如get/post/put/delete/patch等 |
url | 请求的目标url |
params | 附加到url查询参数(querystring)字典,用于构建url的查询字符串 |
headers | 请求头字典,包含user-agent、Accept、content-type等键值对 |
auth | 指定鉴权方式 |
cookies | 请求携带的cookie字典 |
data | 请求体数据,可以是字典、字符串(通常用于表单数据) |
json | 请求体数据,可以是字节串、字符串(通常用于json对象) |
files | 表单上传文件 |
proxies | proxies使用代理抓包 |
以上表格总结了requests
库的主要特性及其描述,基于文章内容中的特点部分生成。
4、GET请求
import requests
def get_data():
response = requests.get("http://XXX.XXX")
print(response.text)
请求方法返回值response是Response对象,我们可以从这个对象中获取想要的响应信息,其中常见的属性包括:
属性名 | 说明 | 备注 |
---|---|---|
status_code | HTTP响应状态码 | 如200、404、500等 |
reason | 状态描述 | 字符串 |
headers | 响应头 | 字典包含如content-type、set-cookie、server等键值对 |
cookies | 服务器端响应的cookies | 字典、可以传输 |
content | 二进制响应内容 | |
text | 文本响应正文 | |
json() | 将json响应正文转成dict | 是方法不是属性,如果详细内容是json格式,可以直接调用此属性解析为python对象 |
url | 产生响应的url | 实际请求的url(可能经过重定向) |
history | 如果有重定向发生,包含一个响应历史列表 | |
elapsed | 请求耗时 | 大概值,不精确 |
encoding | 编码方式 | 可修改 |
request | 生成响应的request | request实例对象 |
ok | 请求是否成功,status_code小于400为真 | 布尔值 |
requests.get()方法发送get请求,并获取响应对象。我们要检查响应的状态码以及确保请求成功,并输出请求的URL、状态码和响应内容。如果服务器返回的是json数据,我们还尝试解析json并打印出来。
5、post请求
import requests
def get_data():
data = {"name":"123", password:"123456"}
response = requests.post("http://XXX.XXX", data=data)
print(response.text)
上面发送一个post请求,并提交用户名和密码,服务器接收到数据后,会进行处理,并返回相应的响应。
6、post请求和get请求的区别
get请求和post请求主要区别在于数据的传输方式和安全性:
- get请求:通过url参数传递数据,数据以明文形式出现在url中,因此不适合传输敏感信息。get请求通常用于获取资源,比如网页、图片等。
- post请求:通过请求体传递数据,数据以密文形式传输,因此更加安全,适合传递敏感信息,post请求通常向服务器提交数据,比如用户登录、提交表单等。
总结:get请求适合用于获取资源,而post请求适合用于提交数据。
请求方法 | 功能和语义 | 参数位置 | 缓存 | 幂等性 | 安全性 |
---|---|---|---|---|---|
get | 从服务器获取指定资源 | 通常放在url查询字符串中 | 响应通常被缓存 | 是幂等的 | 相对安全,不改变服务器状态 |
put | 更新或替换服务器上的现有资源 | 通常放在请求正文中,包含完整的资源表示 | 响应通常不应被缓存 | 幂等的 | 相对安全,仅用于更新资源。恶意或错误请求可能导致数据被覆盖 |
post | 向服务器提交数据,用于创建新资源或执行操作 | 通常放在请求正文中,包含完整的资源表示或操作指令及数据 | 响应通常不应被缓存 | 不一定是幂等的,取决于具体操作 | 可能引发副作用,不仅用于创建资源,也可能执行非幂等操作 |
delete | 请求服务器删除指定资源 | 通常放在url路径中 | 响应通常不应被缓存 | 幂等的 | 具有潜在破坏性,应确保只有授权用户能执行 |
patch | 局部更新资源 | 通常放在请求正文中,描述资源需要更改的部分 | 响应通常不应被缓存 | 幂等的 | 可能引发副作用,应确保只有授权用户能执行,并且请求体正确描述了期望的更改 |
7、请求头和请求体
发送HTTP请求时,除了URL以为,还可以设置请求头和请求体。请求头用于传递一些额外的信息给服务器,比如用户代理、授权信息等。请求体则用于向服务器提交数据,比如表单数据、json数据等。
- 设置请求头
import requests
def get_data():
headers = {"user-Agent":"XXX", content-type:"XXX"}
response = requests.get("http://XXX.XXX", headers=headers)
print(response.text)
上面设置了常见的两个常见的请求头,一般根据需求设置:
user-Agent:用于指定用户代理
content-type:指定内容类型编码,互联网媒体类型叫MIME类型。是http请求头和响应中的字段。
作为请求头时:告诉服务端发送的数据类型,以及响应时返回的数据类型
* application/x-www-form-urlencoded:用于表单形式提交,一般是post请求
* multipart/form-data:多媒体类型,用来传输文件,图片等
* application/json:使用json格式传入文件,是前后端传输数据常用的一种方式
-
设置请求体
当发送post请求时候,需要通过data参数来设置请求体,传递要提交的数据。 -
设置请求头和请求体的作用
– 请求头:请求头包含了一些附加的信息,用于告诉服务器关于请求的一些额外信息,比如客户端类型,接受的数据类型等。可以用于实现用户代理识别、身份验证、设置cookie等功能。
– 请求体:请求体用于向服务器提交数据,比如表单数据,json数据等,通常用于向服务器发送要处理的数据,比如用户登录信息,搜索关键字等。
请求头和请求体都是http请求的重要组成部分,可以通过设置他们来实现各种功能和需求。
8、处理响应
处理HTTP响应是使用requests库的关键部分之一。在发送HTTP请求后,服务器将返回一个响应,其中包含了状态码、响应头、响应体等信息。
(1)获取状态码
状态码是服务器对请求的响应的一个数字编码,用于指示请求的城轨或失败以及失败的原因。通过status_code
属性来获取
(2)获取响应头
响应头包含了一些关于响应的元信息,比如服务器类型、内容类型、内容长度等。可以通过headers
属性来获取响应头。
(3)获取响应体
响应体包含了服务器返回的数据数据内容,可以通过text
属性来获取响应体的文本内容,或者使用content
属性获取二进制内容。
8、处理响应内容
在处理requests库时,我们经常需要处理不同类型的响应内容,包括json、文本和二进制等。
import requests
def get_data():
headers = {"user-Agent":"XXX", content-type:"XXX"}
response = requests.get("http://XXX.XXX", headers=headers)
# 获取二进制响应内容
binary_data = response.content
# 将二进制内容写入文件
with open('image.jpg', 'wb') as f:
f.write(binary_data)
9、session实现会话管理
requests.Session()是创建一个会话对象(session),以便在一些列请求之间保持某些状态,如请求头、公共参数、cookies、认证信息、连接池等。
其主要属性和方法包括:
属性名 | 说明 | 备注 |
---|---|---|
params | 附加到url参数(querystring) | |
headers | 自定义请求头(token)) | |
auth | 指定鉴权方式 | |
cookies | 添加cookies | 会话级的cookiejar对象,存储了所有通过此session发送请求时接受到的cookies |
get()/post()等方法 | 用于发送HTTP请求 | 与直接使用request.get()等函数相比,会利用会话级的状态 |
import requests
# 创建一个Session对象
session = requests.Session()
# 设置全局请求头(用于所有通过此session发出的请求)
session.headers.update({
'User-Agent': 'XXX',
'X-Api-Key': 'XXX'
})
# 设置共享公共参数
session.params = {
'params1': 'XXX',
'params2': 'XXX'
}
# 使用session对象发送请求
response = session.get("http://www.XXX.com")
...