一、分层测试体系
越往上,发现Bug的时间越晚,成本越高接口测试(Service)相比UI测试,可以更早发现问题,更快的质量反馈
接口测试:效率高、成本低
UI自动化测试:效率低、成本高
成本 | 接口自动化测试 | 接口自动化测试 |
---|---|---|
成本 | ⭐️⭐️⭐️ | ⭐️ |
测试效率 | ⭐️⭐️ | ⭐️⭐️⭐️⭐️⭐️ |
用例编写效率 | ⭐️⭐️ | ⭐️⭐️⭐️⭐️⭐️ |
稳定性 | ⭐️⭐️⭐️ | ⭐️⭐️⭐️⭐️⭐️ |
自动化回归测试效率 | ⭐️⭐️⭐️ | ⭐️⭐️⭐️⭐️⭐️ |
测试覆盖度 | ⭐️⭐️ | ⭐️⭐️⭐️⭐️⭐️ |
自动生成用例 | ⭐️⭐️ | ⭐️⭐️⭐️⭐️⭐️ |
看起来接口自动化测试什么都比 Web/App 自动化测试要好,为什么还要做 Web/App 自动化测试?
(接口测试和UI测试时互补关系)
接口关注数据无法触达用户体验。
二、接口请求方法
常见 HTTP 请求方法构造
requests.request():构造一个请求,支撑以下各方法的基础方法。
requests.get():构造 HTTP 协议中的 GET 请求。
requests.post():构造 HTTP 协议中的 POST 请求。
requests.put():构造 HTTP 协议中的 PUT 请求。
requests.delete() :构造 HTTP 协议中的 DELETE 请求。
1、构造 GET 请求
requests.get(url, params=None,
**kwargs
)
url: 接口 url。
params:拼接在url 中的请求参数。
**kwargs
:更多底层支持的参数。
方式一
def test_req_get():
url='https://www.baidu.com/get'
#发起get请求并返回响应对象
r=requests.get(url)
print(r.json()) #r.json()将响应对象以json格式的输出
方式二
def test_req_get1():
url='https://www.baidu.com/get'
#发起get请求并返回响应对象
r=requests.request(method='get',url=url)
print(r.json()) #r.json()将响应对象以json格式的输出
2、构造 POST 请求
requests.post(url, data=None, json=None,
**kwargs
)
url: 接口 url。
data:表单格式请求体。
json:JSON 格式请求体。
**kwargs
:更多底层支持的参数。
def test_req_post():
url='https://www.baidu.com/post'
# 发起post请求并返回响应对象
r=requests.post(url)
print(r.json())
如果出现Method Not Allowed,
代表你的请求方法使用错误。根据服务端的要求,使用合适的请求方法
3、构造 PUT 请求
requests.put(url, data=None,
**kwargs
)
url: 接口 url。
data:表单格式请求体。
**kwargs
:更多底层支持的参数。
def test_req_put():
url='https://www.baidu.com/put'
# 发起put请求并返回响应对象
r=requests.put(url)
print(r.text)
4、构造 DELETE 请求
requests.delete(url,
**kwargs
)
url: 接口 url。
**kwargs
:更多底层支持的参数。
def test_req_delete():
url='https://www.baidu.com/delete'
# 发起delete请求并返回响应对象
r=requests.delete(url)
print(r.text)
5、构造请求方法
requests.request(method,url,
**kwargs
)
method:请求方法:GET,OPTIONS,HEAD, POST,PUT,PATCH,DELETE。
url:接口url。
**kwargs
:更多底层支持的参数。
6、底层参数说明
参数:应用场景
url 请求 URL
params 请求中携带 URL 参数
data 请求中携带请求体(默认为表单请求)
json 请求中携带 json 格式的请求体
headers 请求中携带头信息
cookies 请求中携带 cookies
files 请求中携带文件格式的请求体
auth 请求中携带认证信息
timeout 设置请求超时时间
allow_redirects 请求是否允许重定向
proxies 设置请求代理
verify 请求是否要认证
cert 请求中携带 ssl 证书
三、接口请求参数
1、请求参数简介
接口请求中携带的,会在路径之后使用?代表客户端向服务端传递的参数。
使用 key=value 形式拼接在 URL 中。
如果有多个,则使用&分隔
案例: https://xxxxxx/search?expanded=true&q=requests
2、携带请求参数的方式
常用两种方式:
直接在 URL 中拼接:?username=Hogwarts&id=666。
通过 params 参数传递:requests.get(url, params)
#发起get请求,并且携带url参数信息
def test_req_get_by_url():
#url中需要添加参数信息
url='https://www.baidu.com/get?name=kobe&age=18'
r=requests.get(url)
print(r.text)
def test_req_get_params():
#定义一个字典格式的变量
req_params={
"name":"kobe",
"age":18
}
#定义一个无参数的url
url = 'https://www.baidu.com/get'
#通过params参数,达到和'https://www.baidu.com/get?name=kobe&age=18'一样的效果
r=requests.get(url=url,params=req_params)
print(r.text)
其他类型的请求也可以携带URL参数信息
def test_req_post_by_url():
url = 'https://www.baidu.com/post?name=kd&age=19'
r=requests.post(url)
print(r.text)
def test_req_post_by_params():
url = 'https://www.baidu.com/post'
req_params={
"name":"post"
}
r=requests.post(url,params=req_params)
print(r.text)
四、接口请求头
1、请求头信息的使用场景
身份认证
指定数据类型
2、请求头信息
HTTP 请求头是在 HTTP 请求消息中包含的元数据信息,用于描述请求或响应的一些属性和特征。
Authorization: 表示客户端请求的身份验证信息
Cookie: 表示客户端的状态信息,通常用于身份验证和会话管理
Content-Type: 表示请求消息体的 MIME 类型
User-Agent :发送请求的客户端软件信息
3、构造头信息
使用 headers 参数传入。通常使用字典格式。
headers = {
'user-agent': 'my-app/0.0.1'}
r = requests.get(url, headers=headers)
4、例如
import requests
def test_req_headers():
url = 'https://www.baidu.com/get'
#通过字典格式,定义一个头信息
headers={
'name':"kobe",
"User-Agent":"Android",
"Content-type":"application/json"}
#请求的时候通过headers=的方式将变量传递进去
r=requests.get(url=url,headers=headers)
print(r.text)
五、接口请求体-json
1、接口请求体简介
进行HTTP请求时,发送给服务器的数据。
数据格式类型可以是JSON、XML、文本、图像等格式。
请求体的格式和内容取决于服务器端API的设计和开发人员的要求。
2、常用接口请求体
类型 | 介绍 | Content-type |
---|---|---|
JSON | 轻量级的数据交换格式,最常见的一种类型。 | application/json |
表单数据(Form Data) | 以键值对的形式提交数据,例如通过 HTML 表单提交数据 | application/x-www-form-urlencoded、multipart/form-data |
XML | 常用的标记语言,通常用于传递配置文件等数据 | application/xml、text/xml |
文件(File) | 可以通过请求体上传文件数据,例如上传图片、视频等文件 | 上传文件的 MIME 类型,例如 image/jpeg |
纯文本(Text) | 纯文本数据,例如发送邮件、发送短信等场景 | text/plain |
其他格式 | 二进制数据、protobuf 等格式 |
3、JSON 简介
是 JavaScript Object Notation 的缩写。
是一种轻量级的数据交换格式。
是理想的接口数据交换语言。
Content-Type 为 application/json。
4、案例
import requests
def test_req_body_json():
#httpbin.ceshiren.com请求什么返回什么
url = 'https://www.baidu.com/post'
#定义一个变量,存放请求体
req_params = {
"name": "post"
}
#通过json关键字传递请求体信息
r=requests.post(url=url,json=req_params)
print(r.text)
六、接口响应断言
1、接口断言使用场景
问题:
如何确保请求可以发送成功。
如何保证符合业务需求。
解决方案:
通过获取响应信息,验证接口请求是否成功,是否符合业务需求。
2、案例
import requests
def test_resp():
url = 'https://www.baidu.com/get'
#定义一个变量,存放请求体
req_params = {
"name": "post"
}
#通过json关键字传递请求体信息
# 返回值为Response对象
r=requests.get(url=url,json=req_params)
#确定响应状态码为200
assert r.status_code==200
print(r.text)
print(r.status_code)
print(r.headers)
print(r.url)
print(r.raw)
3、响应结果类型
属性 | 含义 |
---|---|
r | 响应 Response 对象(可以使用任意的变量名) |
r.status_code | HTTP 响应状态码 |
r.headers | 返回一个字典,包含响应头的所有信息。 |
r.text | 返回响应的内容,是一个字符串。 |
r.url | 编码之后的请求的 url |
r.content | 返回响应的内容,是一个字节流。 |
r.raw | 响应的原始内容 |
r.json() | 如果响应的内容是 JSON 格式,可以使用该方法将其解析成 Python 对象。 |
r.request | 返回请求方式 |
七、json响应体断言
1、什么是 JSON 响应体
JSON格式的响应体指的是HTTP响应中的消息体(message body),它是以JSON格式编码的数据。
{
"name": "kobe",
"age": 18,
}
2、断言 JSON 格式响应体使用场景
验证API接口的返回结果是否符合预期。
业务场景上是否符合预期。
格式是否符合文档规范。
3、断言 JSON 格式响应体
r.json():返回 python 字典。
4、若碰到复杂断言应该如何处理?
多层嵌套的数据提取与断言: JSONPath
整体结构响应断言: JSONSchema
自行编写解析算法
断言响应状态码。只能判断,请求是否发送成功
import requests
def test_res_json():
url = 'https://www.baidu.com/get'
r=requests.get(url=url)
print(r.json())
print(r.json()["headers"]["Host"])
#断言响应状态码。只能判断,请求是否发送成功
assert r.status_code==200
#断言最外层的某个字段数据,和业务场景相关
assert r.json()['url']=='https://www.baidu.com/get'
#断言多层的场景
assert r.json()["headers"]["Host"]=='https://www.baidu.com'