0.前言, 我决定我的代码必须要提升性能了,而不是写不写得出来的问题了,
however,怎么知道我的代码是不是很烂和健壮性,需要专业的测试工具来测试出来,如高并发QPS是什么?,高频率是什么? 怎样自动化测试解放双手
1.jmeter是apache使用java的测试工具,模拟巨大的负载,官网地址
https://dlcdn.apache.org//jmeter/source/apache-jmeter-5.6.2_src.zip
2.优缺点
1.开源免费,跨平台(安卓 linux 苹果),支持多协议(http/s…) 非常小巧
2.不支持ip欺骗(ip可以改变) 无法验证js ui页面 需配合selenium
3.安装 先安装jdk,下载jmeter解压encoding设置为utf-8
- jmeter.bat, linux使用.sh文件启动
- 添加线程组 监听器–>结果树
3.线程包含进程,线程组包含多个线程
4.jmeter使用并发执行(多个线程同时执行) 顺序执行(多
个线程顺序执行)
//创建多个请求默认并发执行
//点击测试计划,点击独立运行每个线程组,会顺序执行
5.setup线程组(最先)和teardown线程组(最后执行)
- 点击线程组,可写线程数和ramp-up time间隔时间(程序准备的时间) 循环次数
- //配置元件–>设置http默认值,就可以不用写重复的拉 /// —>信息头管理器 Content-Type application/json;charset=utf-8才可以发送json消息(消息体) !!!有层次
6.参数化(数据量大需要修改后发送请求,需要自动生成数据测试)
1.用户定义变量(简化访问路径为全局变量) 配置元件–>用户定义变量(测试后不可用)
路径修改为 ${mypath}
7.csv文件 逗号分隔的数据 保存txt文件utf-8格式
id,name,age
//去添加csv组件设置变量名称 id,name,age 最后两个选项改为false和true.线程组 循环次数为永远(保证循环csv全部数据)
//线程组http请求json可以使用 i d , {id}, id,{name},${age}代替
//细节
//使用用户参数也可以但是用得不多
8.参数化函数 希望 发的请求有编号加上
${__counter(true)} //或者可以点击book生成(function) //可以生成random,
HTTP Request${__time(,)} //掌握!!!timestamp时间函数 format yyyy-MM-dd hh:mm:ss
set HTTP Request${__time(yyyy-MM-dd hh:mm:ss,)}
//图测试1,2
9.添加jdbc驱动(可以test数据库)
(test plan)sqlite-jdbc-3.21.0.jar添加到目录jar包
//创建
//component configuration 写上pool name
jdbc:mysql://localhost:3306/jams?useUnicode=true&characterEncoding=utf8
driver com.mysql.jdbc.Driver
// component jdbcrequest 写上config name
//jdbc request设置变量(取样器有出现的),给 添加调试取样器得到jdbc结果,
图sampler4
//创建http请求使用不了${param}
10.断言(assert)
1.响应断言 state和resp body(使用 响应文本[全部文本中搜索,包含,相等]和代码[state])
2.大小断言size(how many bytes?) 判断响应的大小(improve resp speed )
3.duration time (assert time…) (improve resp speed )
图测试断言3
11.逻辑判断
- if controller 定义user define var ,http请求为他的 son, interpret必须不打勾
“${val}”==“baidu”- foreach(name_1 name_2 name_3)(var)
prefix: name
begin : 0
end: 3
output: val- 循环控制器 分别控制每个请求的循环次数(number) http的father
- (xpath distract)关联2个http请求
use tidy
Xpath query: //title //得到网页title标签的内容
num: 1 //first title
图xpath
- 如果想要提取json数据内容(正则表达式提取器 json extractor)
表达式: “dep_name”:“(.?)“, “dep_name”:”(.?)” //匹配任意内容,?代表贪婪模式,进行取后面的值 //invaild in regular extractor
表达式: $…message
模板: 1 1 1 //使用上面哪个表达式 invalid
匹配设置: 1 //得到哪个得到的值
12.跨线程组变量关联
// 函数helper _setProperty,放到BeanShell(script)(thread’s son)
//_property生成
pic acrossThread.png /${__property(dest,)}
13.性能测试
- 高并发 同步定时器 listener->聚合报告组件(get 并发测试的结果) 不用 结果树
100
time: 10 //prevent卡死- 高频率 QPS(query per seconds) 每秒访问多少次服务器
20QPS 持续15s //相当于抢票一直点15秒,每秒点20下
timer–>常量吞吐量定时器 设置,每分钟 1200( 60*20),线程组循环 loop count300次(represent how many times you want to test)
14.分布式(执行测试task,一台机器性能不够)
- (测试机)不同机器安装jmeter
- (控制机)改配置文件 /bin/jmeter.properties
remote_hosts=127.0.0.1,127.0.0.1- 全部机器设置远程访问(配置文件)
server.rmi.ssl.disable=True- 控制机窗口 运行–>远程启动所有
15.interface test procedure
- distribute tasks ,make a plan
- simplify document,get three info such as post/get method,param,addr
- design cases and test
- use automatic scripts and import data(JMeter create,don’t need to write)
- summarize results,submit BUG
15.test case
- vaild,invaild boundary(you can just test around the valid such as phoneNum length of 11 is valid,but 1 is invaild)
- special situation (chinese,english,space,…other signs , . * )
- component situation(a table needs id, if you don’t give,may throw errors, others param is’t required)
16.notice(最终真数据库没有测试数据)(不会影响老的接口)
- this may have problems when the request is green
- automatic (增删改查,don’t make the dirty data to real db/ or加上 _auto mark)(assert)
独立运行线程组can make"up(增加) normal(改) tearDown(删除)" execuse in order,ban and test the procedure(链式操作)
17.接口弱压力测试
- 弱压力(regular situation) 30分钟1000个用户访问 average resp time in 3000ms ,set 1000 thread and 30*60=1800 ramp-up time
- 高并发(many users visit interface and every one send resp in every second ) 100 thread ,ms time 10 ,100 user(timer)
3.高频率(高并发的特殊情况,1s 2个QPS) 2个用户 20QPS执行10s
18.生成 charts report(easy to understand)
- jmx文件move to bin dir
- jmeter -n -t xx.jmx -l hm.txt -e -o ./out
- open dir and html
pic error.png
19.(补充)fiddler是代理抓包,可以移动端抓包(手机和电脑在同一个局域网)
下载地址:https://www.telerik.com/download/fiddler
- 前言 我在google浏览器测试我的java程序,结果他不给我响应码,我就要专业的工具得到,并调试了
- 设置中connections全部勾上 端口8888
- 在wifi设置代理
- 手机下载证书安装证书