目录

1.介绍

1.1概念

1.2 接口自动化流程

1.2.1分析接口信息

1.2.2挑选自动化接口

1.2.3设计自动化测试用例

1.2.4搭建自动化测试环境

1.2.5设计自动化执行框架

1.2.6编写代码

1.2.7执行用例

2.第一个接口自动化

2.1requests模块的安装

2.2requests模块介绍

2.3Response 对象的属性与方法介绍

2.4代码实现

2.5常见的请求方法

2.6添加请求信息

3.总结


1.介绍

1.1概念

接口自动化是通过对接口进行测试和模拟,以确保软件系统内部的各个组件能够正确地相互通信和交换数据。接口自动化测试可以显著提高测试效率和准确性。因为接口测试专注于测试系统内部的逻辑和数据传输,而不是像 UI 测试那样关注用户的操作和交互。同时,由于接口测试直接针对系统内部的结构和功能,可以更容易地发现和定位问题,减少测试成本和时间。

1.2 接口自动化流程

1.2.1分析接口信息

  • 分析请求:明确接口的 URL、请求方法(如 GET、POST、PUT、DELETE 等)、请求头、请求参数和请求体等信息。
  • 分析响应:确定接口返回的数据格式、状态码以及可能的错误信息。

1.2.2挑选自动化接口

  • 根据项目的时间、人员安排和接口的复杂度,挑选适合自动化测试的接口。

  • 优先选择核心业务接口、频繁使用的接口以及容易出错的接口进行自动化测试。

  • 挑选依据:

    • 功能复杂度:优先选择功能复杂、逻辑分支多的接口。例如,涉及多种支付方式、多种订单状态转换的订单管理接口,手动测试难以全面覆盖所有场景,自动化测试可更高效地完成测试。
    • 高风险功能:选择对业务影响大、风险高的接口,确保其稳定性和可靠性。例如,涉及资金操作的支付接口,一旦出现问题可能导致严重经济损失,需进行充分的自动化测试。
    • 重复性高:对于需要频繁执行的测试任务(如回归测试中的接口测试),自动化测试可避免重复手动测试的繁琐和低效,提高测试效率。
  • 示例(在线教育平台接口):

接口名称功能描述功能复杂度高风险功能重复性高
登录接口用户登录系统中是是
新增课程接口添加新的课程高是是
查询课程接口根据条件查询课程高是是
修改课程接口修改课程信息高是是
删除课程接口删除课程中是是
用户注册接口用户注册中是是
用户信息查询接口查询用户信息中是是
用户信息修改接口修改用户信息中是是
课程购买接口用户购买课程高是是
验证码接口获取登录验证码中中中
合同上传接口上传合同中中中
添加合同接口添加新的合同中中中
合同列表接口查询合同列表中中中
课程评价接口用户对课程进行评价中中中
课程评论接口用户对课程发表评论中中中
课程收藏接口用户收藏课程中中中
  • 各维度详细说明:
    • 功能复杂度:
      • 新增课程接口:涉及多个参数(课程名称、课程描述、课程价格等),需要与其他模块(如课程分类模块)交互。
      • 查询课程接口:支持多种查询条件(课程名称、课程类型、课程状态等),逻辑复杂。
      • 课程购买接口:涉及支付流程、订单生成等复杂逻辑。
    • 高风险功能:
      • 登录接口:用户登录是系统的核心功能,任何问题都会影响用户体验。
      • 新增课程接口:课程信息的正确性直接影响平台的运营。
      • 用户注册接口:用户注册是系统的基础功能,任何问题都会影响用户获取服务。
    • 重复性高:
      • 登录接口:用户每次使用系统都需要登录。
      • 查询课程接口:用户频繁查询课程信息。
      • 用户信息查询接口:用户经常查看自己的信息。

1.2.3设计自动化测试用例

如果在功能测试阶段已经设计了测试用例,可以直接拿来使用。

根据接口需求和功能,设计正向测试用例(正常场景)和反向测试用例(异常场景),包括边界值测试、参数组合测试等。

1.2.4搭建自动化测试环境

选择合适的编程语言(如 Python、Java 等)和开发环境(如 PyCharm、IntelliJ IDEA 等)来实现自动化测试。

以 Python 为例,安装必要的依赖库,如 requests 用于发送 HTTP 请求,pytest 用于测试框架。

1.2.5设计自动化执行框架

设计一个框架来执行测试用例,包括报告生成、参数化处理和用例执行逻辑。

1.2.6编写代码

根据设计好的测试用例和框架,编写自动化测试脚本。

1.2.7执行用例

使用测试框架(如 unittest、pytest)来执行编写的测试用例。

2.第一个接口自动化

2.1requests模块的安装

requests模块

pip install requests==2.31.0

2.2requests模块介绍

requests 库是一个非常流行的 HTTP 客户端库,用于发送 HTTP 请求。

requests.get 方法用于发送一个 HTTP GET 请求到指定的 URL。

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

2.3Response 对象的属性与方法介绍

属性 / 方法描述
r.status_code响应状态码(如 200 表示成功,404 表示资源不存在等)
r.content字节方式的响应体,会自动解码 gzip 和 deflate 压缩格式
r.headers以字典对象存储服务器响应头,若访问的键不存在则返回 None
r.json()Requests 内置的 JSON 解析方法,将响应体解析为 JSON 格式数据
r.url获取实际请求的 URL(可能与初始请求 URL 不同,如存在重定向时)
r.encoding响应内容的编码格式,根据响应头部的字符编码信息自动确定
r.cookies获取服务器设置的 cookies 信息
r.raw返回原始响应体,不进行任何解码或处理(需配合stream=True使用)
r.text字符串方式的响应体,会自动根据r.recoding指定的编码进行解码
r.raise_for_status()对失败请求(状态码非 200)抛出HTTPError异常,用于主动捕获请求错误

2.4代码实现

示例:对百度接口进行请求

import requests

r=requests.get("https://www.baidu.com")

r.encoding = 'utf-8'

print(r.status_code)
print(r.text)

注意:html不能打印JSON格式,JSON格式也不能打印text格式。

2.5常见的请求方法

#发起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)

示例;

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)

2.6添加请求信息

get ()、post () 底层均调用 request () 方法,因此三者在发送请求时的参数传递方式基本一致,可传递的主要参数如下:

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

params:用于在 URL 中传递查询参数(Query Parameters),通常用于 GET 请求,但也可用于其他类型的请求。

json:用于在请求体(Body)中传递 JSON 格式的数据,通常用于 POST 或 PUT 请求。

data:用于在请求体(Body)中传递表单数据,通常用于 POST 或 PUT 请求。

博客列表详情页 GET请求

#博客列表详情页 GET请求
#http://8.137.19.140:9090/blog/getBlogDetail?blogId=138509  url拼接
url="http://8.137.19.140:9090/blog/getBlogDetail"
param={
  "blogId":138770
}

#定义请求头
token_header={
  "user_token_header":"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlck5hbWUiOiJ6aGFuZ3NhbiIsImV4cCI6MTc1NDQ1ODUzM30.rj1vToBkjWbrcyWVNPj5ES4iSfvGfW5vA7CWtjVpels"
}

r=requests.request(method="GET",url=url,params=param,headers=token_header)
print(r.json())

博客登录页 POST请求

# 博客登录页 POST请求
url="http://8.137.19.140:9090/user/login"

data = {
  "username":"zhangsan",
  "password":"123456"
}


r=requests.request(method="POST",url=url,data=data)

print(r.json())

若参数上传格式选择为 json 格式, Content-Type 会自动被设置为 application/json

3.总结

更多推荐