接口测试
接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端,客户端接收应答报文这一个过程。
接口是指系统模块与模块或系统与系统间进行交互,用的多是http协议的接口、webservice协议的接口、还有远程过程调用协议的接口。 本质就是发送一个request,然后服务器响应后发送一个response,对response进行分析,就是接口测试。
soapui 测试webservice接口 需要wsdl
loadrunner 测试http接口 需要具体的请求地址
通过将一系列的UI操作转化为数据包的交互,大大简化测试过程,快速验证大量数据。
工具选择 :被测对象(什么协议)->熟悉的工具->是否可以解决问题->成本
实现原理 : 模拟客户端对服务器进行多连接 -> 伪造报文欺骗服务器认证机制(了解服务器认证机制 + 了解客户端和服务器之间的交流报文结果 + 合理的技术构造报文结构)
cookie/session + 报文体合法
难点:http协议&RFC2616
- request
GET /WebTours/HTTP/1.1
Host:127.0.0.1:1080
http://127.0.0.1:1080/WebTours
- response
服务器会返回body和header部分,header是一些状态说明,在浏览器中看到的都是body
HTTP/1.1 200ok
accept:
accept-language:zh-cn
ua-cpu:x86
accept-encoding:gzip,deflate
user-agent: #手机电脑设备
host:127.0.0.1:1080
connection:keep-alive #长连接(打电话,短连接短信),占用连接池,
#网页往往都是多请求,是长连接
#接口都是短连接,webservice都是短连接,
last-modified: #用于缓存
gzip压缩,http2.0可以压缩header,http1.1只能压缩body,接口测试和设备终端无关,服务器识别客户端的方式几乎都用user-agent。
环境搭建
- 安装Python环境
- 安装依赖模块 pip install -r requirements.txt -i pypi.douban.com/simple
- 启动项目:Python test.py
- 测试:如果正常响应数据了,那么程序安装并启动正常
接口测试 插件
插件是测试接口的工具
-
火狐-----restclient
-
谷歌-----postman
-
Java实现的测试工具:jmeter
主要看
状态码和响应内容
404---资源路径有误
505---服务器异常
接口测试规则 -- restful风格
接口测试 json
json是一种数据载体,互联网的本质:数据传输,数据传输需要数据载体,比如:页面信息就是存储在HTML这种数据载体中
- html格式--标签语言
<html>
<body>
<title>hello </title>
<font>hello world </font>
</body>
</html>
- xml格式,也是一种标签语言,标签可以自己定义
- json格式 {"title":"hello","font":"hello world"}
缺点:有效数据占有率偏低
json阐述数据效率更高,部分场景下使用json替换HTML和xml
但是json语法描述性不及标签语言,所有部分场景还得使用HTML和xml
如果传递的是少量数据的话,可以使用json
json语法
- json对象:{“key1”:"value1","key2":"value2",...}
- json数组:[value1,value2,...]
- 复合格式:{“name”:"jack","age":"18","famaly":["papa","mama"]}
json使用
新增数据时,数据是json格式的,必须设置浏览器的http请求头,不然会当成普通文本处理,content-type application/json;charset=utf-8
jmeter
相关简介
作用
- 接口测试
- 性能测试:内在----程序的算法
- 压力测试:外在----外在负载
- web自动化测试
- 数据库测试
- java程序测试
优点
- 开源免费
- 小巧
- 支持多协议:http,https,ftp,ftps...
- 功能强大
缺点
- 不支持ip欺骗
- 不支持前端测试
搭建环境
需要安装Java环境
jmeter目录结构
- bin:存储了jmeter的可执行程序
- lib:存储了jmeter整合的一些功能(.jar)
jmeter使用
- 进程--测试计划
- 线程组--线程组
- 线程--线程组属性的线程数
万物皆组件
- 配置元件---http信息头管理器
Content-Type application/json;charset=utf-8
- 共同的属性抽取----配置元件-----http请求默认值
线程组属性
- 线程数-----模拟用户数
- 时间值-----在指定时间内启动所有线程
- 循环数-----单个用户访问的次数
调度器(计时器)
- 循环次数设置为永远
- 持续时间、延迟时间
- 开始时间、结束时间
第二个和第三个不能同时使用,存在冲突
参数化 CSV Data Set Config
参数化就是动态的获取并设置数据
jmeter执行批量添加操作
- 通过url定位添加接口
- 提交的json格式数据
- 数据格式固定,值可变(CSV data set)
1)线程组设置循环次数
2)创建一个文本文档.txt,每一行数据对应数据库一条记录,不同字段之间使用英文逗号分隔
3)创建CSV Data Set Config组件,声明数据源、编码集、对应每一行的数据字段,分隔符
4)将CSV解析的数据设置进json格式的请求报文
- 查看响应
测试计划独立运行每个线程组 勾上 顺序执行,不勾上,顺序不一定
测试计划---setup 线程组 最先执行,teardown线程组最后执行,不论勾选不勾选 独立运行每个线程组
断言
-
断言----响应断言(变量断言:在要测试的模式中写${变量})
-
监听器---断言结果
成功显示一行
- 断言-----断言持续时间
集合点----定时器---synchronizing timer
放在集合的操作之前
###http cookie
授权管理器----配置元件--授权管理器
用户名+密码
关联----后置管理器---正则表达式
模板,不止匹配了一个值,选第一个,
选第二个
xpath
图形化
1) 下载jmeter plugins standard,将jar文件放置在jmeter/lib/ext路径下,重启jmeter
2) 下载server agent,在启动jmeter之前先启动agent文件。
3) 打开jmeter,添加请求,添加 perfmon metrics collector。
FTP请求
数据库请求
- 下载MySQL connect Java.jar文件
- 测试计划下浏览加入该jar文件
- 添加配置元件,jdbc connection configuration,修改最后四行,
database url :jdbc:mysql://localhost:3306/database
hdbc driver class: org git mm mysql.Driver(默认)
username:
password:
- 添加jdbc请求
数据库操作语句
不同的用户使用不同的sql,可以通过把整条sql语句参数化来实现。
分布式
jmeter由Java开发,耗内存、CPU,所以大并发下还是需要分布式的
- 关闭防火墙
- 多台电脑安装相同版本的jmeter
- 其中一台为controller,其余为agent
- controller机器上的jmeter的bin目录下,找到jmeter.properties文件,修改remote_host为controller的ip
- 启动controller机子上的jmeter应用,选择菜单‘运行’--‘远程启动’运行agent
后台非GUI界面
jmeter -n -t *.jmx -l *.jtl -e -o /desktop/
-n :后台运行
-t:运行的文件
-l:日志输出的文件
-e:完成后输出报告
-o:声明报告输出路径
Jmeter +ant+ Jenkins 持续接口自动化
Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具。
如何获得有效的性能需求
- 客户方提出
- 根据历史数据分析
- 参考历史项目的数据
- 参考其他同行类似项目的数据
- 参考其他类似行业应用的数据
- 参考新闻或其他资料中的数据
构建性能测试环境
(1) 硬件型号、配置、数量
- 服务器
- pc
- 其他硬件
(2)软件 版本
- 操作系统
- 数据库
- web服务器
- 应用服务器
- 其他软件
(3)网络结构、带宽
(4)历史数据量
- 基础数据
- 业务数据
开发和调试脚本
- 录制脚本
- 回放脚本
- 编辑脚本和参数化脚本
- 调试脚本
设置测试场景
- 确定加压方式
- 确定需要监控的软硬件资源
- 多业务模块的集成测试策略
性能调优
- 只做你能做的
- 每次只做一处变动
- 改动前备份相关数据
- 记录每次的改动
- 依靠团队的力量
postman
版本 Chrome app和native APP,选择native版本。
- 可直接操作cookie
- 自带proxy,可用来抓包
- 菜单栏
- header不受限
- 支持不fowall重定向
http请求
http响应
断言
测试用例3A原则 = arrange(初始化测试对象)+act(通过不同的参数去调用接口)+assert(断言)
postman的Test功能
- 设置全局变量
- 设置环境变量
- 拿到并处理请求的响应
- 定义测试断言
sandbox
JavaScript公共库
UI测试---用到的cheerio库 -------JavaScript+jQuery
方法
-
get路径后加 ?test=1234 通过? 传参数 post往后台传json数据 header +body
-
post往后台传form表单 header+body
-
put请求和pathc和post很像,body传数据
-
delete
postman 的cookie支持
调试与打印 view->show postman console
console.log
鉴权
-
普通
-
第三方登陆(微博/qq/微信登陆,问开发)
- token登陆 (获取token,问开发)
collection 容器 ----文件夹
- 组织业务逻辑
- 导入导出
- 其他功能,比如监控
命令行运行
- 可以在无UI界面的服务器上运行 + 可以在ci持续集成系统上运行
运行准备
- 导出collection
- 安装nodejs和npm(国内用cnpm)
- 安装newman
生成测试报告(cli reporter,json reporter,html reporter,junit reporter) ---collection中点击运行run,在出现的collection runner右上角,有run in command line,点击跳转到newman页面
- 安装newman Newman -h
- 将collection...导出 v2格式,vvv.json
- 将测试数据test.json和导出的脚本vvv.json放在同一个路径下
- cd到该路径下,执行
newman run vvv.json -d test.json -r html,cli,json,junit
vvv.json:导出的脚本
-d test.json :循环使用的测试数据
-r :测试报告
- 同路径下出现Newman文件夹,存放各个测试报告
变量{{}} 灵活的API
- 全局变量
- 环境变量
- 本地变量
- 测试数据 也就是参数化
添加环境变量
环境变量的值是可以覆盖掉全局变量的
导出其他语言的脚本python
pip install requests