news 2026/1/15 6:46:38

超详细的接口自动化测试教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
超详细的接口自动化测试教程

一、基础知识

1.接口测试原理

接口测试的原理就是模拟客户端向服务器发送请求,服务器接收请求报文后对相应的报文做处理并向客户端返回应答,客户端接收应答的过程。

我也在文末准备的学习资料以及配套的视频教程,需要视频教程的可以去文末观看,需要资料的也可以点击文末小卡片免费领取。

2.接口测试点及用例设计方法

接口测试采用的方法其实与黑盒测试一致的,甚至可以把接口测试理解为没有界面的功能测试。只不过接口测试的关注点主要在请求和响应上。另外,还包括接口的安全接口的性能等。常用的用例设计有等价类,边界值法等。
一般测试用例的设计要从单接口参数的校验到整个业务功能点的验证,还可以验证一些安全性和异常情况。

3.接口测试要点
4.常见HTTP状态码
状态码含义
1**临时响应并需要请求者继续执行操作
2**请求成功。操作被成功接收并处理
3**重定向代码,用于已经移动的文件并且在头信息中指定新的地址信息
4**客户端错误,请求包含语法错误或者无法完成请求
5**服务器错误,服务器在处理请求的过程中发生错误

比如:
200 服务器成功处理请求
404 未找到资源
410 找到资源,但现在已不存在
500 内部服务器错误
503 服务器目前无法为请求提高服务
302 临时重定向
304 客户端的缓存资源时最新的,要客户端使用缓存

5.HTTP基础知识

请求报文:请求行,请求头部,回车换行,消息体
响应报文:状态行,响应头部,回车换行,消息体

HTTP由请求和响应构成,是一个标准的客户端服务器模型(B/S架构)。HTTP协议永远都是客户端发起请求,服务器回送响应。B/S架构又叫浏览器/服务器模型,严格意义上说,这个B不仅仅只是浏览器,凡是能够发生HTTP请求的对象或者工具,都可以叫做客户端。

URL地址,请求参数(可选),请求头,请求体(仅限POST请求)
对于响应内容部分,主要关注两个点:响应状态码,响应内容

6.接口自动化测试工具
7.token

二、抓包工具

1.chrom抓包

右键-》检查-》找到网络

需要关注的字段


响应内容

2.Fiddler抓包(PC端,手机端)
1.原理

Fiddler是通过改写HTTP代理,让数据从它那通过,来监控并且截取到数据。在打开它的那一瞬间,它就已经设置好了浏览器的代理了。当你关闭的时候,它又帮你把代理还原了。

2.下载安装

官网下载:https://www.telerik.com/fiddler
按照指示填写,下载,然后傻瓜式安装,一直点击是就可以安装成功。

3.抓取数据信息说明
名称含义
#抓取HTTP Request的顺序,图标表示请求状态和响应状态
ResultHTTP状态码 (重点关注)
Protocol请求使用的协议,常用HTTP,HTTPS
Host请求地址的主机名
URL请求资源的位置
Body请求的大小
Caching请求的缓存过期时间或者缓存控制值
Content-Type请求响应的类型
Process发送此请求的进程:进程ID
Comments允许用户为此回话添加备注
Custom允许用户设置自定义值

要访问HTTPS协议需要设置一下:Tools –> Fiddler Options ,选择HTTPS,勾选Decrypt HTTPS TrafficDecrypt,然后后面弹出的窗口都点击yes/是,点击Actions,最后点击OK

4.数据详细字段说明
名称含义
Statistics请求的性能数据分析
Inspectors查看数据内容(常用)
AutoResponder允许拦截指定规则的请求
Composer自定义请求发送服务器
Filters请求过滤规则(常用)
Timeline请求响应时间
5.过滤

过滤最常用,过滤掉不需要的抓包数据,只显示自己需要的,这样看起来会方便很多。

=+状态码

6.断言

断言目的是为了验证服务端功能。

Before Request断言

Before Response断言

三、Request库(发送请求)

安装Requests库:pip install requests

1.利用requests发送get请求
  1. import requests

  2. def test1():

  3. resp = requests.get('http://www.taobao.com')

  4. print(resp.status_code) # 响应的状态码信息

  5. print(resp.text) # 获取响应对象的文本信息

  6. print(resp.url) # 获取响应对象所对应的请求地址

  7. if __name__ == '__main__':

  8. test1()

2.利用requests发送get请求+参数
  1. import requests

  2. # 直接在url上添加请求参数

  3. def test1():

  4. resp = requests.get('https://baidu.com/s?wd=python') # 自动在url后面添加参数

  5. print(resp.text)

  6. # get请求+参数

  7. def test2():

  8. data = {

  9. 'wd': 'python'

  10. } # 请求参数

  11. resp = requests.get('https://baidu.com/s', params=data) # 自动在url后面添加参数

  12. print(resp.text)

  13. if __name__ == '__main__':

  14. test2()

3.利用requests发送post请求
  1. import requests

  2. def test1():

  3. resp = requests.post('https://ynuf.aliapp.org/service/um.json?_bx-v=2.0.31')

  4. print(resp.status_code) # 响应的状态码信息

  5. print(resp.text) # 获取响应对象的文本信息

  6. print(resp.url) # 获取响应对象所对应的请求地址

  7. if __name__ == '__main__':

  8. test1()

4.在post请求中以json方式传递参数

  1. import requests

  2. # 以json格式传

  3. def test1():

  4. data = {"username": "test", "password": "123", "age": 18, "phone": 1588888888} # 字典格式是json

  5. resp = requests.post('', json=data)

  6. print(resp.text)

  7. if __name__ == '__main__':

  8. test1()

5.添加或者修改headers信息

如果浏览器访问,响应正常,如果不是浏览器来访问,是爬虫或代码访问,则响应不正常。这个需要用到headers信息。

  1. import requests

  2. # 含有header访问才能跟浏览器访问显示一样的

  3. def test1():

  4. headers = {

  5. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'

  6. }

  7. resp = requests.get('', headers=headers)

  8. print(resp.text)

  9. if __name__ == '__main__':

  10. test1()

6.在请求头中添加cookie信息
  1. import requests

  2. # 绕过登录,想要获取登录之后的信息,需要带上Cookie

  3. def test1():

  4. headers = {

  5. 'Cookie': '' # 每次都要更新

  6. }

  7. resp = requests.get('', headers=headers)

  8. print(resp.text)

  9. if __name__ == '__main__':

  10. test1()

7.利用session对象保持会话状态

需要登录才能访问的接口,对于这种一定要使用session会话来帮助保存会话信息

  1. import requests

  2. # 利用session保持会话状态

  3. def test1():

  4. sess = requests.Session() # 创建一个session会话对象,帮助我们保存客户端的会话信息

  5. data = {

  6. 'username': 'admin',

  7. 'password': 'admin123'

  8. }

  9. sess.post('', data=data) # 操作登录

  10. resp2 = sess.get('') # 请求登录之后的接口

  11. print(resp2.text)

  12. if __name__ == '__main__':

  13. test1()

8.利用requests上传和下载文件
  1. import requests

  2. # 上传文件不带参数

  3. def test1():

  4. files = {

  5. 'file': open('test.txt', 'rb')

  6. }

  7. resp = requests.post('', files=files)

  8. print(resp.text)

  9. # 上传文件带其他参数

  10. def test2():

  11. data = {

  12. 'batchname': 'GB20210707' # 抓包的

  13. }

  14. files = {

  15. 'batchfile': open('Test.xls', 'rb')

  16. }

  17. resp = requests.post('', data=data, files=files)

  18. print(resp.text)

  19. if __name__ == '__main__':

  20. test1()

9.加密接口测试

询问开发用的什么加密方法

  1. import requests

  2. # 加密接口请求

  3. def test1():

  4. uid, name, password, salt = '3', 'qcj', '123456', 'LZ7dYxCj5S68ucAh'

  5. import hashlib # 有MD5加密方法

  6. hl = hashlib.md5()

  7. hl.update(('{}-{}-{}-{}'.format(uid, name, password, salt)).encode('utf-8'))

  8. sign = hl.hexdigest() # 对hl对象中保存的字段进行md5加密算法

  9. print(sign)

  10. data = {

  11. 'uid': '3',

  12. 'sign': sign

  13. }

  14. resp = requests.post('', json=data)

  15. print(resp.text)

  16. if __name__ == '__main__':

  17. test1()

10.接口参数关联
  1. import requests

  2. # 接口参数关联(下一个请求的入参是上一请求的出参)

  3. def test1():

  4. data = {

  5. 'username': 'qcj',

  6. 'password': '123456'

  7. }

  8. resp = requests.post('', data=data) # 请求第一个接口

  9. resp_json = resp.json() # 第一个接口响应的json内容

  10. auth_token = resp_json['data'] # 提取第一个接口的data出参

  11. headers = {

  12. 'auth-token': auth_token

  13. }

  14. resp = requests.get('', headers=headers) # 请求第二个接口

  15. print(resp.text)

  16. if __name__ == '__main__':

  17. test1()

四、接口测试返回值的处理

1.re库(正则表达式)

获取指定内容最常用的一个正则表达式.*?的使用。

  1. import re # 正则表达式的库

  2. log = '''

  3. now: 2020-04-15 23:44:34 id: ST0013 status: nok

  4. now: 2020-04-26 09:33:14 id: DAMX002 status: good

  5. now: 2020-04-17 22:27:39 id: SIMKOIF0 status: well

  6. now: 2020-04-18 16:45:30 id: 04 status: unknown

  7. '''

  8. # \s表示空格 \d{4}表示4个十进制数字开始 \s+表示一个或多个空格

  9. dt = re.findall('now:\s(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}:\d{2})', log)

  10. # \s+表示一个或多个空格 \w*表示任意个字母 \d+表示一个或多个十进制数

  11. sid = re.findall('id:\s+(\w*\d+)', log)

  12. # \s+表示一个或多个空格 \w+表示一个或多个字母

  13. status = re.findall('status:\s+(\w+)', log)

  14. print(dt)

  15. print(sid)

  16. print(status)

运行结果:

  1. import re # 正则表达式的库

  2. # 从文件中截取某个字段的值

  3. with open('zzlb.txt', 'r') as f:

  4. content = f.read()

  5. result = re.findall('"SNAME":"(.*?)"', content) # 截取文件中SNAME字段的值

  6. print(result)

  1. import re # 正则表达式的库

  2. # 正则表达式中换行符的处理

  3. content = '''

  4. <ul>

  5. <li><a href='111.html\n'></a></li>

  6. <li><a href='222.html\n'></a></li>

  7. <li><a href='333.html\n'></a></li>

  8. <li><a href='444.html\n'></a></li>

  9. </ul>

  10. '''

  11. result = re.findall("href='(.*?)'", content, re.S) # 处理html格式的,有换行符的需要加re.S

  12. print([item.strip() for item in result]) # \n相当于空格,可以用strip去掉

运行结果:

2.lxml库(处理响应内容是HTML源码)

lxml库进行处理,这种方式仅针对返回内容是HTML源码形式的。

例子:登录进去的页面,会有注销或者退出登录的字段,验证登录是否成功,可以提取登录进去页面的HTML源码中的注销字段来验证。

  1. # 解析HTML文档格式响应

  2. from lxml import etree

  3. import requests

  4. def verifylogin():

  5. headers = {

  6. 'cookie': '' # 登录后的cookie

  7. }

  8. resp = requests.get('', headers=headers) # 登录后的url

  9. resp.encoding = 'utf-8' # 防止中文乱码

  10. html = etree.HTML(resp.text) # 获取登录后页面的HTML

  11. result = html.xpath("//a[@href='javascript:logoff()']/text()") # 获取指定a元素上显示的文本信息

  12. print(result)

  13. if __name__ == '__main__':

  14. verifylogin()

3.requests库(处理响应内容是json形式)

查看json格式的网站:bejson
要先清楚响应内容的json结构,层级,字典里面的层级。
响应内容:

  1. import requests

  2. def verifylogin():

  3. headers = {

  4. 'cookie': '' # 登录后的cookie

  5. }

  6. data = {

  7. 'page': '1',

  8. 'rows': '5'

  9. } # 参数

  10. resp = requests.post('', headers=headers, data=data) # 登录后的url

  11. resp_json = resp.json() # 通过json方法将resp对象转换为一个json对象

  12. print(resp_json['people'][1]['lastName'])

  13. if __name__ == '__main__':

  14. verifylogin()

运行结果:Hunter

五、Apifox

Apifox是接口管理,开发,测试全流程集成工具,通过一套系统,一份数据,解决多个系统之间的数据同步问题。只要定义好接口文档,接口调试,数据Mock,接口测试就可以直接使用,无需再次定义。接口文档和接口开发调试使用同一个工具,接口调试完成后即可保证和接口文档定义完全一致。高校,及时,准确。
Postman + Swagger + Mock + JMeter = ApiFox

-d 测试用到的数据文件,比如data.csv
-n 循环次数
-r 在当前路径生成测试报告,并指定报告格式
例如:apifox run 回归测试 -d 测试数据文件名 -n 2 -r html

例如:apifox run 回归测试.apifox-cli.json -d data.csv -n 2 -r html

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/15 6:25:02

Z-Image-Turbo文学插图:小说场景的AI还原尝试

Z-Image-Turbo文学插图&#xff1a;小说场景的AI还原尝试 在当代数字内容创作中&#xff0c;视觉化叙事正成为提升阅读体验的关键手段。无论是网络小说、轻小说还是剧本创作&#xff0c;一张精准契合文字氛围的插图&#xff0c;往往能极大增强读者的沉浸感。然而&#xff0c;传…

作者头像 李华
网站建设 2026/1/14 2:28:28

MGeo模型局限性分析:当前不支持的场景说明

MGeo模型局限性分析&#xff1a;当前不支持的场景说明 背景与技术定位 MGeo是由阿里巴巴开源的一款专注于中文地址相似度识别的深度学习模型&#xff0c;全称为“MGeo地址相似度匹配实体对齐-中文-地址领域”。该模型旨在解决地理信息数据中地址文本的语义对齐问题&#xff0c;…

作者头像 李华
网站建设 2026/1/14 7:22:48

MGeo部署后端服务稳定性保障措施

MGeo部署后端服务稳定性保障措施 背景与业务挑战&#xff1a;高精度地址匹配的工程化落地需求 在城市治理、物流调度、地图服务等场景中&#xff0c;地址相似度识别是实现“实体对齐”的关键环节。例如&#xff0c;同一地点可能以“北京市朝阳区建国路88号”和“北京朝阳建国路…

作者头像 李华
网站建设 2026/1/15 6:30:59

基于计算机视觉的轨道交通视频分析:关键场景、技术策略与应用展望

目录 1. 引言 2. 轨道交通视频分析的核心应用场景 2.1 安全运营场景 2.2 运营效率提升场景 2.3 乘客服务优化场景 2.4 设备与基础设施运维场景 3. 关键技术策略与算法 3.1 基于目标检测与跟踪的基础分析 3.2 基于视频理解的异常行为识别 3.3 基于深度学习的客流密度估…

作者头像 李华
网站建设 2026/1/14 3:19:47

Z-Image-Turbo野生动物栖息地恢复构想

Z-Image-Turbo野生动物栖息地恢复构想 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 在生态保护与人工智能技术深度融合的背景下&#xff0c;阿里通义Z-Image-Turbo WebUI图像快速生成模型为环境可视化、公众教育和生态规划提供了全新的工具路径。由开发…

作者头像 李华