接口自动化测试
创始人
2024-04-11 07:16:59
0

接口自动化测试

  • 1.基础知识
    • 1.接口测试原理
    • 2.接口测试点及用例设计方法
    • 3.接口测试返回值的处理
    • 4.接口测试要点
    • 5.常见HTTP状态码
    • 6.HTTP基础知识
    • 7.接口自动化测试工具
  • 2.抓包工具
    • 1.chrom抓包
    • 2.Fiddle抓包(PC端,手机端)
      • 1.原理
      • 2.下载安装
      • 3. 认识界面
  • 3.Request库
    • 1.利用requests发送get请求
    • 2.利用requests发送get请求+参数
    • 3.利用requests发送post请求
    • 4.在post请求中以json方式传递参数
    • 5.添加或者修改headers信息
    • 6.在请求头中添加cookie信息
    • 7.利用session对象保持会话状态
    • 8.利用requests上传和下载文件
    • 9.加密接口测试
    • 10.接口参数关联

1.基础知识

1.接口测试原理

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

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

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

3.接口测试返回值的处理

  • 为什么我们需要关心接口返回的响应值
    原因:我们需要对返回的响应内容进行断言,从而验证接口工作是否正常。

  • 接口响应内容的形式?
    主要有三种形式:JSON格式的字符串;HTML源码;程序员自定义的字符串。

  • 主要的处理方式?
    处理方式1:正则表达式来进行处理,这种方法适合以上三种响应内容形式。
    处理方式2:lxml库进行处理,这种方式仅针对返回内容是HTML源码形式的。
    处理方式3:直接使用requests库自带的json方法进行处理,这种方式仅针对返回内容是json形式的。

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

4.接口测试要点

  • 检查接口返回的数据是否与预期结果一致。
  • 接口测试结果检查通常需要通过SQL语句从数据库内进行查询确认。
  • 检查接口的容错性,假如传递数据的类型错误时是否可以处理。
  • 接口参数的边界值,例如传递的参数足够大或为负数时,接口是否可以正常处理。
  • 接口的性能,http请求接口大多与后端执行的SQL语句性能,算法等比较相关。
  • 接口的安全性,外部调用的接口尤为重要,一般每个接口都要进行鉴权验证。

5.常见HTTP状态码

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

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

6.HTTP基础知识

  • DNS:Domain Name Server 域名服务器
    http:// www.baidu.com: 80/ adv_search? w=py&order=false# tag
    在这里插入图片描述

  • HTTP报文格式分为两种

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

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

  • HTTP请求组成部分

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

  • HTTP工作过程

    1. 浏览器输入
    2. dns域名解析:域名与IP映射(第一次访问去DNS找对应IP,不是第一次访问则本机存有IP)
    3. 建立tcp连接(三次握手)
    4. 发送http request:请求信息
    5. web服务器接收请求
    6. 应用服务器处理业务逻辑
    7. 关闭tcp连接:请求响应完成。如果浏览器在其头部信息中加入了connection:keep-alive,则tcp连接将任然保持打开状态。
    8. 浏览器:渲染响应页面
  • Get和Post
    Get:从服务器端获取资源或数据
    Post:向服务器端提交数据
    Get和Post的区别:
    1)Get请求一般用于向服务器请求获取一个资源,没有副作用,一般会在客户端做缓存。Post请求一般用于向服务器提交数据并让其去完成一件事,所以这个操作是有副作用的,不会在客户端做缓存,
    2)Get请求发送数据的时候,一般会将请求数据放在url字符串中发送给服务器端,所以从安全性角度来看相对没有Post请求安全性搞,所以get请求一般不会用于比较隐私数据的传输。而Post请求时将请求数据放在请求体body里面,所以一般用于表单数据,登录数据等数据的传输。

7.接口自动化测试工具

  • Jmeter

  • Apifox

  • postman

2.抓包工具

1.chrom抓包

右键-》检查-》找到网络
在这里插入图片描述

2.Fiddle抓包(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

  • 数据详细字段说明

在这里插入图片描述

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

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

1)过滤方式一:
在这里插入图片描述
2)过滤方式二:
?+字符串
在这里插入图片描述
@+host
在这里插入图片描述

=+状态码
在这里插入图片描述

3.Request库

安装Requests库:pip install requests

1.利用requests发送get请求

import requestsdef test1():resp = requests.get('http://www.taobao.com')print(resp.status_code)  # 响应的状态码信息print(resp.text)  # 获取响应对象的文本信息print(resp.url)  # 获取响应对象所对应的请求地址if __name__ == '__main__':test1()

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

import requests# 直接在url上添加请求参数
def test1():resp = requests.get('https://baidu.com/s?wd=python')  # 自动在url后面添加参数print(resp.text)# get请求+参数
def test2():data = {'wd': 'python',}  # 请求参数resp = requests.get('https://baidu.com/s', params=data)  # 自动在url后面添加参数print(resp.text)if __name__ == '__main__':test2()

3.利用requests发送post请求

import requestsdef test1():resp = requests.post('https://ynuf.aliapp.org/service/um.json?_bx-v=2.0.31')print(resp.status_code)  # 响应的状态码信息print(resp.text)  # 获取响应对象的文本信息print(resp.url)  # 获取响应对象所对应的请求地址if __name__ == '__main__':test1()

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

import requests# 以json格式传
def test1():data = {"username": "test", "password": "123", "age": 18, "phone": 1588888888}  # 字典格式是jsonresp = requests.post('', json=data)print(resp.text)if __name__ == '__main__':test1()

5.添加或者修改headers信息

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

import requests# 含有header访问才能跟浏览器访问显示一样的
def test1():headers = {'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'}resp = requests.get('', headers=headers)print(resp.text)if __name__ == '__main__':test1()

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

import requests# 绕过登录,想要获取登录之后的信息,需要带上Cookie
def test1():headers = {'Cookie': ''  # 每次都要更新}resp = requests.get('', headers=headers)print(resp.text)if __name__ == '__main__':test1()

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

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

import requests# 利用session保持会话状态
def test1():sess = requests.Session()  # 创建一个session会话对象,帮助我们保存客户端的会话信息data = {'username': 'admin','password': 'admin123'}sess.post('', data=data)  # 操作登录resp2 = sess.get('')  # 请求登录之后的接口print(resp2.text)if __name__ == '__main__':test1()

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

import requests# 上传文件不带参数
def test1():files = {'file': open('test.txt', 'rb')}resp = requests.post('', files=files)print(resp.text)# 上传文件带其他参数
def test2():data = {'batchname': 'GB20210707'  # 抓包的}files = {'batchfile': open('Test.xls', 'rb')}resp = requests.post('', data=data, files=files)print(resp.text)if __name__ == '__main__':test1()

9.加密接口测试

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

import requests# 加密接口请求
def test1():uid, name, password, salt = '3', 'qcj', '123456', 'LZ7dYxCj5S68ucAh'import hashlib  # 有MD5加密方法hl = hashlib.md5()hl.update(('{}-{}-{}-{}'.format(uid, name, password, salt)).encode('utf-8'))sign = hl.hexdigest()  # 对hl对象中保存的字段进行md5加密算法print(sign)data = {'uid': '3','sign': sign}resp = requests.post('', json=data)print(resp.text)if __name__ == '__main__':test1()

10.接口参数关联

import requests# 接口参数关联(下一个请求的入参是上一请求的出参)
def test1():data = {'username': 'qcj','password': '123456'}resp = requests.post('', data=data)  # 请求第一个接口resp_json = resp.json()  # 第一个接口响应的json内容auth_token = resp_json['data']  # 提取第一个接口的data出参headers = {'auth-token': auth_token}resp = requests.get('', headers=headers)  # 请求第二个接口print(resp.text)if __name__ == '__main__':test1()

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...