Python 测开27期 - julia - 学习笔记 - 接口请求构造及常见情况处理

接口测试场景

image

接口自动化测试场景

接口自动化测试与 Web/App 自动化测试对比

Web/App 自动化测试 接口自动化测试
成本 :star::star::star: :star:
测试效率 :star::star: :star::star::star::star::star:
用例编写效率 :star::star: :star::star::star::star::star:
稳定性 :star::star::star: :star::star::star::star::star:
自动化回归测试效率 :star::star::star: :star::star::star::star::star:
测试覆盖度 :star::star: :star::star::star::star::star:
自动生成用例 :star::star: :star::star::star::star::star:

1. 常见 HTTP 请求方法构造

方法 说明
requests.request() 构造一个请求,支撑以下各方法的基础方法。
requests.get() 构造 HTTP 协议中的 GET 请求。
requests.post() 构造 HTTP 协议中的 POST 请求。
requests.put() 构造 HTTP 协议中的 PUT 请求。
requests.delete() 构造 HTTP 协议中的 DELETE 请求。

2. 接口请求参数

携带请求参数的方式

  • 常用两种方式:
    • 直接在 URL 中拼接:?username=Hogwarts&id=666
    • 通过 params 参数传递:requests.get(url, params)

3. 接口请求头

请求头信息的使用场景

  • 身份认证
  • 指定数据类型

请求头信息

  • HTTP 请求头是在 HTTP 请求消息中包含的元数据信息,用于描述请求或响应的一些属性和特征。
  • 实际工作过程中具体要关注的头信息字段需要和研发沟通。
  • 常见的头信息(下侧表格):
内容 含义
Authorization 表示客户端请求的身份验证信息
Cookie 表示客户端的状态信息,通常用于身份验证和会话管理
Content-Type 表示请求消息体的 MIME 类型
User-Agent 发送请求的客户端软件信息

构造头信息

  • 使用 headers 参数传入。
  • 通常使用字典格式。
headers = {
'Cookie':'working=1', #添加cookie
'user-agent': 'my-app/0.0.1'
}
r = requests.get(url, headers=headers)
# 通过cookies参数添加cookie的方法
cookies_data = {"name":"julia",
"id":"223"}
r = requests.get(url, cookies = cookies_data)

4. 接口请求体

接口请求体简介

  • 进行HTTP请求时,发送给服务器的数据。
  • 数据格式类型可以是JSON、XML、文本、图像等格式。
  • 请求体的格式和内容取决于服务器端API的设计和开发人员的要求。

常用接口请求体

类型 介绍 Content-type
JSON(JavaScript Object Notation) 轻量级的数据交换格式,最常见的一种类型。 application/json
表单数据(Form Data) 以键值对的形式提交数据,例如通过 HTML 表单提交数据。 application/x-www-form-urlencoded
XML(eXtensible Markup Language) 常用的标记语言,通常用于传递配置文件等数据。 application/xml, text/xml
文件(File) 可以通过请求体上传文件数据,例如上传图片、视频等文件。 上传文件的 MIME 类型,例如 image/jpeg
multipart/form-data
纯文本(Text) 纯文本数据,例如发送邮件、发送短信等场景 text/plain
其他格式 二进制数据、protobuf 等格式

4.1 接口请求体 - JSON

JSON 简介
  • 是 JavaScript Object Notation 的缩写。
  • 是一种轻量级的数据交换格式。
  • 是理想的接口数据交换语言。
  • Content-Type 为 application/json。
构造 JSON 格式请求体
  • 定义为字典格式。
  • 使用 json 参数传入。
# 导入依赖
import requests

def test_post_json():
    # 定义接口的 url 和 json 格式请求体
    url = "https://httpbin.ceshiren.com/post"
    body= {
        "post_key": "post_value"
    }
    # 发出 POST 请求,r 接收接口响应
    r = requests.post(url, json=body)

4.2 接口请求体 - 文件

使用 requests 如何上传
r = requests.post("https://httpbin.ceshiren.com/post",
files={"hogwarts_file": open("hogwarts.txt", "rb")})

#通过元祖的形式修改上传的filename名称
r = requests.post("https://httpbin.ceshiren.com/post",
files={"hogwarts_file":("修改后的上传filename.txt", open("hogwarts.txt", "rb"))})

4.3 接口请求体 - FORM 请求

什么是 FORM 请求
  • 数据量不大
  • 数据层级不深的情况
  • 通常以键值对传递
python代码
data = {"name":"julia"}
r = requests.post("https://httpbin.ceshiren.com/post",
                    data=data)

4.4 接口请求体 - xml

request 请求构造
import requests
xml = """<?xml version='1.0' encoding='utf-8'>
<a>6<\a>
"""
headers={'Content-Type':'application/xml'}
r=requests.post('http://htttbin.org/post',data=xml,headers=headers).text

5 接口响应断言

接口断言使用场景
  • 问题:
    1. 如何确保请求可以发送成功。
    2. 如何保证符合业务需求。
  • 解决方案:
    • 通过获取响应信息,验证接口请求是否成功,是否符合业务需求。
响应结果类型
属性 含义
r 响应 Response 对象(可以使用任意的变量名)
r.status_code HTTP 响应状态码
r.headers 返回一个字典,包含响应头的所有信息。
r.text 返回响应的内容,是一个字符串。
r.url 编码之后的请求的 url
r.content 返回响应的内容,是一个字节流。
r.raw 响应的原始内容
r.json() 如果响应的内容是 JSON 格式,可以使用该方法将其解析成 Python 对象。
若碰到复杂断言应该如何处理?
  • 多层嵌套的数据提取与断言: JSONPath
  • 整体结构响应断言: JSONSchema
  • 自行编写解析算法

1. xml响应断言

XML 断言
from requests_xml import XMLSession
session = XMLSession()
r = session.get('https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss')
print(r.xml.links)
XPath 断言
from requests_xml import XMLSession
session = XMLSession()
r = session.get('https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss')
item = r.xml.xpath('//item', first=True)
print(item.text)
XML 解析
import xml.etree.ElementTree as ET
root = ET.fromstring(countrydata)
root.findall(".")
root.findall("./country/neighbor")
root.findall(".//year/..[@name='Singapore']")
root.findall(".//*[@name='Singapore']/year")
root.findall(".//neighbor[2]")

2. 多层嵌套响应断言

JSONPath 简介
  • 在 JSON 数据中定位和提取特定信息的查询语言。
  • JSONPath 使用类似于 XPath 的语法,使用路径表达式从 JSON 数据中选择和提取数据。
  • 相比于传统的提取方式,更加灵活,并且支持定制化。
JSONPath 语法
符号 描述
$ 查询的根节点对象,用于表示一个 json 数据,可以是数组或对象
@ 过滤器(filter predicate)处理的当前节点对象
* 通配符
. 获取子节点
.. 递归搜索,筛选所有符合条件的节点
?() 过滤器表达式,筛选操作
[start:end] 数组片段,区间为[start,end),不包含 end
[A]或[A,B] 迭代器下标,表示一个或多个数组下标
JSONPath 与代码结合(Python)
  • 环境安装:pip install jsonpath
# 返回结果列表,没找到返回Fasle
jsonpath.jsonpath(源数据对象, jsonpath表达式) 

3. 整体结构响应断言

针对与“大响应数据”如何断言

  • 针对主要且少量的业务字段断言。
  • 其他字段不做数据正确性断言,只做类型与整体结构的校验。
  • 与前面的版本进行 diff,对比差异化的地方。

JSONSchema 简介

  • 使用 JSON 格式编写的
  • 可以用来定义校验 JSON 数据的结构
  • 可以用来校验 JSON 数据的一致性
  • 可以用来校验 API 接口请求和响应

JSONSchema 的生成

  • 通过界面工具生成。在线生成工具:https://app.quicktype.io
  • 通过第三方库生成。pip install genson
from genson import SchemaBuilder
def generate_jsonschema(obj):
    # 实例化jsonschem
    builder = SchemaBuilder()
    # 传入被转换的对象 
    builder.add_object(obj)
    # 转换成 schema 数据
    return builder.to_schema()
  • 通过命令行工具生成。

JSONSchema 验证(Python)

  1. 安装:pip install jsonschema
  2. 调用 validate() 进行验证。
def schema_validate(obj, schema):
    '''
    对比 python 对象与生成的 JSONSchame 的结构是否一致
    '''
    try:
        validate(instance=obj, schema=schema)
        return True
    except Exception as e:
        return False

超时处理

通过timeout参数传递超时时间

import requests
class TestReq:
    def test_timeout(self):
        r = requests.get('http://github.com', timeout = 0.01)

代理配置

代理在接口自动化的使用场景
  • 测试脚本,更直观的排查请求错误,相当于编写代码时的 debug
  • 获取没有错误的,真实的接口请求响应信息
  • 通过代理获取自动化测试的请求响应
  • 对比两次请求响应的区别
Requests 代理配置
import requests
proxies = {
'http':'http://10.10.10.1:3182',
'https':'http://10.10.10.1:1080'
}
#verified=False 跳过证书认证
requests.get('http://example.org',proxies = proxies, verify=False)
如何使用
  1. 设定代理格式
  2. 通过 proxies 参数传递代理设置
  3. 开启代理工具监听请求

代理配置