一、接口测试理论基础
1、接口测试方式和行情
1)、主流接口测试工具实现接口自动化(适用于中小型公司或项目)
- Postman+Newman+git/Svn+Jenkins(基于Javascript语言)
- Jmeter+Ant+git/Svn+Jenkins(基于Java和BeanShell语言)
2)、基于代码的接口自动化(适用于大中型公司或一线互联网公司)
- Python+Requests+Yaml+Pytest+Allure+Logging+热加载+Jenkins持续集成 接口自动化
3)、基于平台的接口自动化(适用于特大型或外包公司)
- 测试开发
2、接口测试概述
1)、什么是接口?
- API(Application Program Interface):属于一种操作系统或程序接口
- GUI(Graphic User Interface):属于一种图形操作系统
2)、接口的类型
网络(接口利用网络传递数据,常见的两种web协议接口) HTTP协议的接口 web service接口
3)、什么是接口测试?
是测试系统组件间接口的一种测试。
主要用于检测外部系统和系统之间以及内部各个子系统之间的交互点。
测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系。
① 有接口文档
swagger
showdoc
② 没接口文档(难点:如何去分辨每一个字典是否必填,长度限制,字段的含义)
fiddler,charles抓包
jmeter录制。
字段的含义
1、见名知义
2、通过页面的功能控件去判断字段的含义
get请求传参
是在接口路径的后面使用?进行传参,多个参数之间使用&分隔
post请求传参
是在body里面传参
4)、为什么要做接口测试?
可以发现很多在页面上发现不了的bug
检查系统的异常处理能力
检查系统的安全性、稳定性
前端随便变,接口测好了,后端就可以不用变了
可以更早时候进行接口测试
接口测试是一个完整的体系,也包括功能测试、性能测试和安全性测试
① 现在都是前后端分离的架构
② 上下游的接口会改动
③ 基于安全
5)、接口测试的重点和原理
重点:
- 1、检查数据的交换
- 2、传递和控制管理过程
- 3、系统间的相互逻辑依赖关系
原理:
3、接口自动化测试的流程
1)、接口文档
使用标准接口文档格式(openAPI规范)
2)、编写接口请求代码
1.代码基础(python)
2.接口请求库(requests)
有可以自动生成的(openAPI)
3)、设计测试用例,调用请求代码
1.接口格式(schema)验证
1.请求的格式
2.响应的格式
2.参数验证
3.业务流程
正向用例
反向用例
4.安全测试
5.性能测试
4)、封装成框架(框架凝聚多个项目的共同之处)
1.用例管理
2.用例筛选
3.前后置的自动执行
4.使用其它的库类
5.生成测试报告
一、框架的顶层设计
1.输入
用例:yaml、excel、json、python、key_word
手动编写
自动生成
配置文件:ini、json、yaml
2.执行
日志
分组
等待
失败重试
3.输出
1.邮件(smtp服务器)
2.html(allure)
二、读取用例
三、执行用例
用例的管理,用例之间进行隔离
框架读取多个yaml文件,根据yaml执行多个测试用例
二、基于代码的接口自动化
1、全面认识Requests模块以及常用的方法和底层原理
1)、requests模块是用于发送Http请求以及接口http响应的python的第三方库。
安装:pip install requests
alt+enter:自动导包
2)、requests常用方法:
def get(url, params=None, **kwargs)
def post(url, data=None, json=None, **kwargs)
def put(url, data=None, **kwargs)
def delete(url, **kwargs)
def request(method, url, **kwargs):这个是前面四个方法统一调用的方法,它又调用下一个session对象中的request方法
def session():会话,web项目中从登录到退出就是一个会话。session对象的request方法
3)、注意:post请求中data传参和json传参的本质!!!
4)、解析requests底层原理:
请求: request(参数)
常用:(前8个)
method,请求方式
url, 请求路径
params=None,get请求传参
json=None, post请求传参
data=None, post或put请求传参
headers=None,请求头
cookies=None,Cookie信息
files=None,文件上传
auth=None,鉴权
timeout=None, 超时处理
allow_redirects=True, 是否允许重定向
proxies=None,代理
hooks=None,钩子
stream=None,文件下载
verify=None, 证书验证
cert=None, CA证书
响应:response对象
1. res.text :返回文本格式
2. res.content:返回bytes类型数据
3. res.json():返回json数据
4. res.status_code:返回状态码
5. res.reason:返回状态信息
6. res.cookies:返回cookie信息
7. res.encoding:返回编码格式
8.res.headers:返回响应头
9.res.request....:返回请求的信息和数据
2、接口自动化框架封装(统一请求封装)
- 1.统计数据
- 2.异常处理
- 3.日志监控
3、pytest结合yaml实现数据驱动
1)、yaml文件用途,结构,数据类型详解:
yaml是一种数据类型,它可以和json之间灵活的切换(读取的时候相当于把yaml格式读取为json格式,写入的时候相当于把json格式写到yaml格式,会自动的按照yaml语法去排列),支持注释,换行,字符串。
用途:
- ① 配置文件
- ② 编写测试用例
数据结构:
- ① Map对象(dict)(键:(空格)值 ) 如:name: lisa
- ② 数组(list),用一组横线"-"表示
2)、pytest结合yaml实现数据驱动
深思的问题:
-
- 传键值对,传json,传文件上传
-
- 接口关联,动态参数,接口加密,接口签名,接口鉴权
技术层面:
1. 动态参数。让yaml能够调用外部函数,热加载
2.文件上传
3.断言(数据库断言)
4.解决yaml文件中数据量太大的问题(参数化:excel、csv、yaml)
5.yaml里面如何保存变量以及调用函数
其中:
$ddt{name}:(ddt:data driver test,数据驱动测试),获取name的值
parameterize:实现参数化,从yaml文件中读取数据,到每一个变量中,变量使用_分隔
落地实施:(真实企业接口自动化框架具体是什么样)
成本:把整个框架封装到非常彻底的程度,让不懂代码的人,只要培训一天那么就可以用这个框架实现接口自动化
4、接口测试关注点:
1、各种不同类型参数的传值,包括请求头
传值
表单:键值对
文件上传
JSON数据
Binary
请求头
Accept
Content-type
2、动态参数
3、接口关联(上一个接口的返回值作为下一个接口的参数)
4、接口鉴权(cookie,session,token...)
5、接口加解密
6、接口签名
接口加解密:
一、对称式加密(私钥加密),特点是:加密和解密都是使用相同的密钥
AES, DES, Base64
bejson.com
对admin加密,密钥是mashang
二、非对称式加密(双钥加密):RSA
有公钥和私钥两个密钥。公钥加密,私钥解密;私钥加密,公钥解密
postman本身不支持这种加密方式,需要引入外部的js文件。
三、只加密不解密。MD5、SHA、HmacSHA
MD5
SHA
HmacSHA(哈希运算消息验证加密算法)
四、Sign签名,比混合加密更严格的加密方式
1、首先先获取到所有的参数(params和body)
2、把所有的参数组合成一个字典
3、自定义一个根据key的ASCII进行升序排列的算法,把所有的参数和值进行升序排列
4、获取一个订单号nonce
5、获取一个当前的时间戳
6、把订单号nonce加到参数之前,时间戳加到参数之后
7、把最终的参数进行加密(混合)处理,生成Sign
8、把sign签名在请求头里面传给后端
sign的生命周期一般是1-3分钟
三、常见的抓包工具
抓包工具的作用:
在测试工作中,需要抓包工具帮助定位前后端问题,当看到前端页面出现bug后,需要进一步判断是前端问题还是后端问题。同时可以利用抓包工具进行小规模的安全测试,或者使用抓包工具构造一些难以测试的测试场景,例如:弱网测试等
1、Charles抓包实战(Mac下常用)
一、Charles介绍、安装、破解、汉化
它是基于http、https协议的代理服务器
官网:www.charlesproxy.com/download/
特点:半免费(启动需要10秒,每运行半小时就会强制关闭)
优点:
① 跨平台的抓包工具:windows、linux、mac
② 支持按域名或接口两种方式查看报文
③ 弱网测试非常友好,直接选择网络类型
二、Charles抓包工具原理
原理:
如何设计代理以及代理的端口
选择Proxy——>Proxy setting
三、Charles抓包之全面认识、过滤器和访问控制
1.过滤器
Proxy——》Recording Settings——》Include
2.访问控制:控制哪些ip允许访问charles。默认本机都是允许
Proxy——》Access Control Setting
四、Charles抓包实战
1、如何精准的抓取到需要的数据报文(找到自己发送的数据的那个包)
2、抓取到基于https协议的数据报文
① 安装SSL证书
Help——》SSL Proxying——》Install Charles Root Certificate
②设置HTTPS代理配置
Proxy——》SSL Proxying Settings——》Include:*、*
3、抓取App的数据报文
① 保持手机和电脑在同一网段,同一无线,热点
② 设置手机的代理
③ 下载并设置手机的根证书。chls.pro/ssl(在手机浏览器下载)
4、网络挟持和篡改,Mock数据
① 针对需要的请求设置断点
② 在Proxy里面配置断点的设置
③ 重新发送请求,然后篡改请求和响应数据
5、弱网测试
6.定位前后端的BUG
2、Fiddler抓包工具(windows)
一、Fiddler抓包原理
作为服务器和客户端的代理
二、Fiddler抓包工具的全面认识
请求四要素:请求方式、请求路径、请求数据、请求头
响应四要素:响应头、响应码、响应数据、其他
三、抓包
shift+F5:去缓存刷新
默认情况下只能抓取http协议的包
1、抓取https协议的包
一、配置
二、更新根证书(Actions里面完成)
三、偶然性的操作
如果还是抓取不到https协议的包,那么就要重启fiddler,让新的证书生效
2、抓取App的包
-
无法上网
1、fiddler无法抓取https协议的包 2、fiddler没有有用的根证书 3、手机没有下载有用的根证书
-
如何定位前后端的bug
*原则: 首先看请求,然后看响应相应
如果请求的四要素有问题,那么说明是前端的bug 如果请求的四要素没有问题,但是响应的数据有问题,那么说明是后端的bug
四、基于工具的接口自动化
1、Jmeter接口测试工具(Java语言)
1)、简介和安装
Jmeter+Ant+Git+Jenkins:接口自动化,性能压测(基准、负载、压力)
Jmeter是基于Java的工具
常用组件(顺序):
测试计划
线程组和测试片段
配置元件
前置处理器
定时器
逻辑控制器
取样器
后置处理器
断言
监听器
作用域:每个组件作用于它的父组件,兄弟组件,兄弟组件的子组件
2)主要测试组件详解
1、post请求方式
2、get请求方式
3、以JSON path的样式查看运行结果的值
4、文件上传
5、添加HTTP请求
6、常用的三种断言
- ① 响应断言——状态断言
业务断言
- ② JSON断言
-
③ 数据库断言
1、把数据库的驱动文件放到jmeter的lib目录 2、配置数据库的连接池(连接池:自动的为用户连接数据库时分配连接和回收连接)
JDBC连接池
JDBC请求
通过BeanShell断言获取数据库的值
BeanShell断言的应用场景:
1、数据库断言
2、使用了CSV数据驱之后的断言
接口测试四种类型:
文件上传:Content-Type:multipart / form-data
表单:Content-Type:x-www-form-urlencoded
JSON: Content-Type: application/json
其它:Content-Type: application/Javascript, text/plain, application/html
Content-Type:指请求的格式,可以在结果树——》请求——》Request Headers中查看
2、Postman接口测试工具(JavaScript语言)
1)、postman接口关联的方式有三种场景(组合API:接口关联/接口串联,上一个接口的返回值作为下一个接口的参数)
1、json提取器
2、正则表达式提取器
正则表达式
(.+?):匹配任意字符,至少1个
(.*?):匹配任意字符,至少0个
在这里需要的正则表达式
"access_token":"(.*?)"
3、cookie提取器
2)、技能完善(扩展)
1、cookie关联
2、断言
3、自定义动态参数
4、csv数据驱动
5、带请求头的接口
7、cookie鉴权
8、加密
9、sign签名
10、postman+newman+git+Jenkins持续集成
3)、接口的类型和测试流程
1、接口及其类型
接口类型:(了解了接口的类型,有助于我们选择测试方案和工具)
[SOAP
REST
GapghQL]:基于TCP全双工
[Websocket
TCP
RPC
其它]:基于HTTP半双工,适合用Postman
基于TCP的,不适用Postman
基于HTTP的,适用于postman
2、接口测试的流程
1、前提
1、理解需求(需求文档)
2、了解接口(接口文档)
退而求次:体验产品,抓包分析
2、选择工具
postman
jmeter
3、设计用例
1、基本正向用例
2、带可选参数的额外扩展正向用例
3、反向用例
4、破坏性的测试
4、执行用例
5、持续测试
postman+Newman+Jenkins+git
持续测试、生成报告
4)、postman之执行测试用例
一、请求
1、请求方法
2、接口地址:URL
3、查询字符串
GET参数,会成为URL的一部分
4、鉴权方式
继承上级
不需要继承
API KEY:在请求头添加指定的内容
Bearer Token:有明确约定的使用方式
其它
5、请求头
k-v结构,可以批量编辑
6、请求正文
1、表单(会经过编码)
form-data:K-V结构+上传文件
x-www-form-urlencoded:K-V结构
2、原始内容(raw)(不会进行编码)
json传递数据
3、二进制内容
4、GapghQL
7、请求预处理
请求发送前置,执行js,改变请求
8、测试用例
响应收到后执行,执行js来断言响应。
9、设置
改变传输细节
10、cookies
自动更新、自动发送
可以在设置中禁用
11、发送按钮
接口四要素:
1、方法
2、地址
3、鉴权
4、参数
二、响应
1、响应数据
1、查看方式(pretty)
2、原始数据(Raw)
3、Preview(浏览器预览)
4、visualize(自定义可视化)
2、cookies
3、响应头
4、测试结果
5、状态码、耗时、大小
三、环境
环境和变量
生成代码
控制台
四、使用集合来管理请求:
1、创建请求
2、创建文件夹
3、创建请求
五、场景应用:
1、接口关联
第二个接口,需要第一个接口的数据时,需要用到接口关联
最常用的方式是:使用变量
1、创建变量
2、使用变量
{{var}}
请求成功的判断依据
状态码200
2、Postman中的变量
1、变量是一个标签,代表着一个可以动态改变的值
2、创建变量
变量有作用域:GCEDL
G:全局变量、C:集合变量、E:环境变量、D:数据变量、L:本地变量
全局变量:
集合变量:
当同时设计了全局变量和集合变量时,会使用集合变量
环境变量,或在集合右上角选择环境
变量作用域优先级:范围越大,优先级越低,反之。
3、设置变量值
1、创建时
2、选中字符串时,右键设置
3、文件上传
文件上传,post请求,在body中的form-data以表单的形式上传
postman文件上传的坑:在点编辑的时候,上传的文件没有了,只有文件名,对于批量上传时,没有便利可言
六、局限性
1、所有的操作都是手动,需要进化成自动
2、自动的断言响应,需要进化成测试用例
3、参数化测试,自动构建请求
5)、postman脚本
1、使用js语言:
let a;
a = 1 +1;
console.log(a);
2、使用pm对象(pm:postman)
pm.request:请求
pm.response:响应结果
pm.globals:全局变量
pm.collectionVariables:集合变量
pm.environment:环境变量
pm.variables:局部变量
pm.sendRequest:发送HTTP请求
6)、利用postman脚本,实现自动接口关联
1、json引用
//接口响应
console.log(pm.response.json());
//获取token
let token = pm.response.json().access_token;
console.log(token)
//自动保存到全局变量
pm.globals.set('token',token)
2、正则表达式
处理非结构化文档
//接口响应
console.log(responseBody)
//re的方式获取token
let token = responseBody.match('"access_token":"(.*?)"')
console.log(token)
//自动保全到全局变量
pm.globals.set('token',token[1])
7)、自动断言封装
两个重点:
pm.test :创建测试用例
pm.expect:创建预期条件,进行断言
底层使用BDD测试框架
1、内置的断言示例:
2、断言的封装
集合:统一断言条件(collections——>tests):
pm.test("响应耗时 小于3000ms",function(){
pm.expect(pm.response.responseTime).to.be.below(3000);
})
//响应字节,小于10MB,1MB=1024MB=1024KB=1024*1024B
pm.test("响应字节小于 10MB",function(){
pm.expect(pm.response.responseSize).to.be.below(10*1024*1024)
})
请求:专属的断言条件
1、状态码
2、数据格式
3、数据值
8)、postman自动构造请求
1、简单请求
2、复杂请求
注意两点:请求头中的header,body
header中Content-type
传递json参数:application/json
上传文件:form-data
传递xml参数:x-www-form-urlencoded
9)、postman自动构造用例(数据驱动测试)
1、准备数据文件
csv(exel可将表格保存为csv格式)、json
2、输入数据文件
批量执行
预览数据
10)、Mock Server
做一个假的数据
postman提供了Mock功能,限制:
1、必须注册才能使用
2、每月1000次
3、必须和postman连接状态
利用Python实现无限制mocker server:
fastapi
json
好处:内网搭建,没有限制
11)、持续集成
使用命令行,完成一系列的手动操作
通过newman支持命令行调用:
1、安装node.js
2、安装newman
npm install -g newman
3、导出postman
1、集合
2、变量
3、数据文件
4、执行newman
5、生成HTML报告文件
1、样式不好看
2、数据不准确
3、缺乏日志
主流的报告样式:allure
12)、自动化测试框架:
1、使用yaml设计用例
2、生成用例
3、生成allure测试报告
4、邮件、钉钉、企业微信发送通知
5、性能测试
6、支持websocket、mqtt、rpc等各种协议
7、加载各种资源:本地文件、数据库
五、web自动化测试
1、web自动化测试需求和挑战
属于E2E测试,是软件质量保证的最后一道防线。
好的测试,不仅仅模拟用户行为,还要记录、调试网页细节。
优势:
提速增效
解放双手
技能提示
目前主流的工具:
Cypress
Playwright
Selenium
Selenum的优势:
浏览器支持最多,兼容最好
支持多种编程语言
生态成熟、文档丰富
进行APP自动化测试,事半功倍
2、Selenium自动化环境搭建
一键搭建(python):
pip install webdriver-helper
webdriver-helper
1、自动获取浏览器的版本、操作系统类型
2、自动下载浏览器驱动
3、自动创建和返回webdriver对象
控制浏览器:
from webdriver_helper import *
with get_webdriver() as driver:
driver.get("http://www.baidu.com")
3、selenium自动化实战
1)、web自动化测试三板斧:
1、定位元素
2、交互元素
3、进行断言
2)、八大定位策略
from selenium.webdriver.common.by import By 中查看
(由selenium提供的定位策略,共有八个,可以分为三组)
-
1、根据文本定位a标签
LINK_TEXT 精确定位 PARTIAL_LINK_TEXT 模糊定位
-
2、根据属性,定位任意元素
ID NAME CLASS_NAME TAG_NAME
-
3、通用定位策略(可以定位到任意的元素)
xpath css_selector
使用定位策略注意事项:
1、driver.get_element_by_id()#被弃用了
2、driver.find_element(By.ID,"")#推荐
3、如果要定位一组多个元素,element加s
实战:
商品下单流程
1、登录
2、选择商品
3、创建订单
4、选择收获地址
5、选择支付方式
6、点击提交订单