接口自动化测试——必须掌握一

在这里插入图片描述


一、分层测试体系

在这里插入图片描述

越往上,发现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:更多底层支持的参数。

方式一

扫描二维码关注公众号,回复: 14648365 查看本文章
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'

猜你喜欢

转载自blog.csdn.net/YZL40514131/article/details/129648512