接口自动化测试(一)

1. 接口测试

程序内部的接口:方法与方法之间,模块与模块之间的交互,程序内部抛出的接⼝,⽐如贴吧系统,有登录模块、发帖模块等等,那你要发帖就必须先登录,要发帖就得登录,那么这两个模块就得有交互,它就会抛出⼀个接口,供内部系统进行调用。
系统对外的接口:⽐如你要从别的⽹站或服务器上获取资源或信息,别⼈肯定不会把数据库共享给
你,他只能给你提供⼀个他们写好的⽅法来获取数据,你引⽤他提供的接口就能使用他写好的方法,从而达到数据共享的目的,比如说咱们用的app、网址这些它在进行数据处理的时候都是通过接口来进行调用的。

接口类型有很多,如HTTP API接口、RPC等等,接下来我们基于HTTP API接口继续讲解。

1.2 接口测试

1.2.1 概念

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。

简而言之,所谓接口测试就是通过测试不同情况下的入参与之相应的出参信息来判断接口是否符合或满足相应的功能性、安全性要求。

其实接口测试很简单,比一般的功能测试还简单(非官方表述,有感而发),因为功能测试是从页面输入值,然后通过点击按钮或链接等传值给后端,而且功能测试还要测 UI、前端交互等功能,但接口测试没有页面,它是通过接口规范文档上的调用地址、请求参数,拼接报文,然后发送请求,检查返回结果,所以它只需测入参和出参就行了,相对来说简单了不少。

1.2.2 接口组成

接口⽂档⽰例:登录 / 小程序登录凭证校验

接口⽂档应该包含以下内容:

  • 接口说明
  • 调⽤url
  • 请求⽅法(get\post)
  • 请求参数、参数类型、请求参数说明
  • 返回参数说明

由接口文档可知,接口⾄少应有请求地址、请求方法、请求参数(入参和出参)组成,部分接口有请求头header 。
**标头 (header):**是服务器以HTTP协议传HTML资料到浏览器前所送出的字符串,在标头与 HTML ⽂件之间尚需空⼀⾏分隔,⼀般存放 cookie 、 token 等信息

header和⼊参有什么关系?它们不都是发送到服务器的参数吗?
它们确实都是发送到服务器⾥的参数,但它们是有区别的,header⾥存放的参数⼀般存放的是⼀些校验信息,⽐如cookie,它是为了校验这个请求是否有权限请求服务器,如果有,它才能请求服务器,然后把请求地址连同⼊参⼀起发送到服务器,然后服务器会根据地址和⼊参来返回出参。也就是说, 服务器是先接受header信息进⾏判断该请求是否有权限请求,判断有权限后,才会接受请求地址和⼊参的。

1.3 接口测试重要性

接口其实就是前端⻚⾯或APP等调⽤与后端做交互用的,有⼈会问,功能测试都测好了,为什么还要测接口呢?
先举个栗⼦:
⽐如测试用户注册功能,规定用户名为6~18个字符,包含字⺟(区分⼤⼩写)、数字、下划线。
⾸先功能测试时肯定会对⽤⼾名规则进⾏测试时,⽐如输⼊20个字符、输⼊特殊字符等,但这些可能只是在前端做了校验,后端可能没做校验,如果有⼈通过抓包绕过前端校验直接发送到后端怎么办呢?试想⼀下,如果⽤⼾名和密码未在后端做校验,⽽有⼈⼜绕过前端校验的话,那⽤⼾名和密码不就可以随便输了吗?如果是登录可能会通过SQL注⼊等⼿段来随意登录,甚⾄可以获取管理员权限,那这样不是很恐怖?
所以,接口测试的必要性就体现出来了:

  • 可以发现很多在⻚⾯上操作发现不了的bug
  • 检查系统的异常处理能⼒
  • 检查系统的安全性、稳定性
  • 前端随便变,接⼝测好了,后端不⽤变

1.4 如何执行接口测试

在进行接口测试前,还需要了解:

1. get和post请求
get和post是常⻅的请求⽅法。如果是get请求的话,直接在浏览器⾥输⼊就⾏了,只要在浏览器⾥⾯直接能请求到的,都是get请求,如果是post的请求的话,就不⾏了,就得借助⼯具来发送。

2. http状态码
每发出⼀个http请求之后,都会有⼀个响应,http本⾝会有⼀个状态码,来表示这个请求是否成功, 常见的状态码有以下⼏种:

  • 200 2开头的都表⽰这个请求发送成功,最常⻅的就是200,就代表这个请求是ok的,服务器也返回了。
  • 300 3开头的代表重定向,最常⻅的是302,把这个请求重定向到别的地⽅了。
  • 400 400代表客户端发送的请求有语法错误,401代表访问的⻚⾯没有授权,403表⽰没有权限访问这个⻚⾯,404代表没有这个⻚⾯
  • 500 5开头的代表服务器有异常,500代表服务器内部异常,504代表服务器端超时,没返回结果

接口测试分两步⾛:通过接口设计⽤例 + 结合业务逻辑来设计用例

1.4.1 接口用例的编写

1. 通过性验证

首先肯定要保证这个接⼝功能是好使的,也就是正常的通过性测试,按照接⼝⽂档上的参数,正常传入,是否可以返回正确的结果。

2. 参数组合:

现在有⼀个操作商品的接⼝,有个字段type,传1的时候代表修改商品,商品id、商品名称、价格有⼀个是必传的,type传2的时候是删除商品,商品id是必传的,这样的,就要测参数组合了,type传1的时候,只传商品名称能不能修改成功,id、名称、价格都传的时候能不能修改成功。

3. 接口安全:
  • 绕过验证,⽐如说购买了⼀个商品,它的价格是300元,那我在提交订单时候,我把这个商品的 价格改成3元,后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加?
  • 绕过⾝份授权,⽐如说修改商品信息接⼝,那必须得是卖家才能修改,那我传⼀个普通⽤⼾, 能不能修改成功,我传⼀个其他的卖家能不能修改成功
  • 参数是否加密,⽐如说我登陆的接⼝,⽤⼾名和密码是不是加密,如果不加密的话,别⼈拦截 到你的请求,就能获取到你的信息了,加密规则是否容易破解。
  • 密码安全规则,密码的复杂程度校验
4. 异常验证:

所谓异常验证,也就是我不按照你接⼝⽂档上的要求输⼊参数,来验证接⼝对异常情况的校验。⽐如说必填的参数不填,输⼊整数类型的,传⼊字符串类型,⻓度是10的,传11,总之就是你说怎么来,我就不怎么来,其实也就这三种,必传⾮必传、参数类型、⼊参⻓度。

1.4.2 结合业务逻辑来设计用例

根据业务逻辑来设计的话,就是根据⾃⼰系统的业务来设计⽤例,这个每个公司的业务不⼀样,就得具体的看⾃⼰公司的业务了,其实这也和功能测试设计⽤例是⼀样的。
举个例⼦,拿贴吧来说,贴吧的需求是这样的:

  1. 登录失败5次,就需要等待15分钟之后再登录
  2. 新注册的⽤⼾需要过了实习期才能发帖
  3. 删除帖⼦扣除积分
  4. ......
    像这样需要把这些测试点列出来,然后再去造数据测试对应的测试点。

2. 接口自动化测试

2.1 概念

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

2.2 接口自动化流程

1. 需求分析

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

2. 挑选自动化接口

  • 根据项⽬的时间、⼈员安排和接⼝的复杂度,挑选适合⾃动化测试的接⼝。
  • 优先选择核⼼业务接⼝、频繁使⽤的接⼝以及容易出错的接⼝进⾏⾃动化测试。

**功能复杂度:**优先选择功能复杂、逻辑分⽀多的接⼝进⾏⾃动化测试。例如,涉及多种⽀付⽅式、多种订单状态转换的订单管理接⼝,⼿动测试难以全⾯覆盖所有场景,⾃动化测试可以更⾼效地进⾏测试

高风险功能:选择对业务影响⼤、⻛险⾼的接⼝进⾏⾃动化测试,确保其稳定性和可靠性。例如,涉及资⾦操作的⽀付接⼝,⼀旦出现问题可能导致严重的经济损失,因此需要进⾏充分的⾃动化测试.

**重复性高:**对于需要频繁执⾏的测试任务,如回归测试中的接⼝测试,⾃动化测试可以避免重复⼿ 动测试的繁琐和低效,提⾼测试效率.
假设我们正在开发⼀个在线教育平台,该平台包含以下接口:

功能复杂度:

  • 新增课程接口:涉及多个参数(课程名称、课程描述、课程价格等),需要与其他模块(如课程分类模块)交互。
  • 查询课程接口:支持多种查询条件(课程名称、课程类型、课程状态等),逻辑复杂。
  • 课程购买接口:涉及支付流程、订单生成等复杂逻辑。

高风险功能:

  • 登录接口:用户登录是系统的核心功能,任何问题都会影响用户体验。
  • 新增课程接口:课程信息的正确性直接影响平台的运营。
  • 用户注册接口:用户注册是系统的基础功能,任何问题都会影响用户获取服务。

重复性高:

  • 登录接口:用户每次使用系统都需要登录。
  • 查询课程接口:用户频繁查询课程信息。
  • 用户信息查询接口:用户经常查看自己的信息。

3.设计自动化测试用例

▪ 如果在功能测试阶段已经设计了测试用例,可以直接拿来使用。 ▪ 根据接口需求和功能,设计正向测试用例(正常场景)和反向测试用例(异常场景),包括边界值测试、参数组合测试等。

4.搭建自动化测试环境

  • 选择合适的编程语言(如 Python、Java 等)和开发环境(如 PyCharm、IntelliJ IDEA 等)来实现自动化测试。
  • 以 Python 为例,安装必要的依赖库,如 requests 用于发送 HTTP 请求,pytest 用于测试框架。

5.设计自动化执行框架

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

6.编写代码

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

7.执行用例

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

8.生成测试报告

  • 测试完成后,生成测试报告。可以使用工具如 HtmlTestRunner 或 Allure 来生成易于阅读的报告。

tips:接口自动化流程是面试考点。

2.3 第⼀个简单的接口自动化

示例:对百度接口发起请求

复制代码
import requests

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

2.4 requests模块

2.4.1 安装

命令行通过pip⼯具进行安装,命令:

复制代码
pip install requests==2.31.0

安装成功示例:

检查当前项目下包是否更新:

2.4.2 介绍

requests 库是⼀个⾮常流⾏的HTTP客⼾端库,⽤于发送HTTP请求。 requests.get ⽅法⽤于
发送⼀个HTTP get 请求到指定的URL
requests.get 方法返回⼀个 Response 对象,这个对象包含了服务器返回的所有信息。如:


Response 对象提供的属性/⽅法介绍:

注意:

如果响应结果为json格式,必须以json打印

2.4.3 常见请求方法

复制代码
#发起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)

使用示例:

复制代码
get = requests.get("https://www.baidu.com")
post = requests.post("https://www.baidu.com")

req_get = requests.request("get","https://www.baidu.com")

#传递参数时指定参数
req_post = requests.request(method="post",url="https://www.baidu.com")
#req_post = requests.request(url="https://www.baidu.com",method="post")

print("get:",get)
print("post:",post)
print("request:",req_get)
print("request:",req_post)


结果:

2.4.4 添加请求信息

get() 、 post() 底层都是调⽤ request() ⽅法,因此这三个⽅法在发送请求时,传参⽆太⼤区
别,可传递的参数展示如下

示例1:博客详情接口

登录后才能访问博客系统列表页、详情页.....

在博客系统里,登录接口返回了用户的登录凭证,后续请求其他的接口需要在请求头中添加上User token header

复制代码
#请求博客详情页接口
#必须要先登录---在请求头添加用户登录凭证(User_token_header)
#带有参数
#url = "http://49.235.61.184:19090/user/getAuthorInfo?blogId=11"
#这里的get请求,url上拼接的参数也可以单独拿下来写
url = "http://49.235.61.184:19090/blog/getBlogDetail"
param = {
    "blogId":11
}
#定义请求头
header = {
    "User_token_header":"eyJhbGciOiJIUzI1NiJ9.eyJpZCI6NCwidXNlck5hbWUiOiJsaXNpIiwiZXhwIjoxNzgwMDU0NTkyfQ.wTmUz5TaUSQ9nvsKtciVSwODDsjeAjQOwSLXIl6wPOM"
}
r = requests.request(method="GET", url=url, params=param ,headers=header)
# print(r.text)
print(r.json())
示例2:博客登录接口
复制代码
#博客系统登录接口
#POST 表单格式
url = "http://49.235.61.184:19090/user/login"
data = {
    "username": "lisi",
    "password": "123456"
}
r = requests.request(method="POST",url=url,data=data)
# print(r.text)
print(r.json())
复制代码
#博客园用户详情页
#添加用户登录凭证--cookie
#此时未登录
url = "https://account.cnblogs.com/user/userinfo"
cookie = {
    "cookie": "SERVERID=8c8885762b943956601fecfa49dcbdbb|1780051224|1780051224"
}
r = requests.request(method="GET", url=url, cookies=cookie)
print(r.text)

问题:上传参数选择 params 、 json 还是 data ?

  • params ⽤于在URL中传递查询参数(Query Parameters),通常⽤于 GET 请求,但也可以⽤于其他类型的请求。
  • json 用于在请求体(Body)中传递 JSON 格式的数据,通常⽤于 POST 或 PUT 请求。
  • data 用于在请求体(Body)中传递表单数据,通常⽤于 POST 或 PUT 请求。

若参数上传格式选择为 json 格式, Content-Type 会⾃动被设置为
application/json
有了 requests 库,可以实现对接⼝发起 http 请求,然而自动化测试中,我们需要编写⼤量的测
试⽤例,这些⽤例的组织、执⾏和管理也需要使⽤其他更强⼤的框架⸺ pytest 框架。
requests 库专注于HTTP请求的发送,而pytest 框架则提供了测试的组织、执行和管理功能

相关推荐
长和信泰光伏储能7 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂7 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study8 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境8 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境9 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1239 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102169 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0010 小时前
一个项目带你入门AI应用开发01
python
05664610 小时前
Python康复训练——常用标准库
开发语言·python·学习
昆曲之源_娄江河畔10 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql